整型
占用内存空间大小
数据范围
byte
1字节(8bit)
-128 ~ 127
short
2字节(16bit)
-32768 ~ 32767
int
4字节(32bit)
- 2 ^ 31 ~ 2^31 - 1
long
8字节(64bit)
- 2 ^ 63 ~ 2^63 - 1
浮点型
占用内存空间大小
数据范围
float
4字节(32bit)
±3.4 * 10 ^ 38
double
8字节(64bit)
10 ^ 308
字符型
占用内存空间大小
数据范围
char
2字节(16bit)
可以保存中文
布尔类型
占用内存空间大小
数据范围
boolean
视情况而定
true false
1.2.2 基本数据类型的转换:
-Java中所有的数值型变量都可以相互转换。
自动类型转换:
-当把一个范围比较小的数值类型或者变量直接赋值给另外一个范围比较大的变量时,系统默认可以进行自动的类型转换。就如同存在两瓶水,一个大瓶和一个小瓶,当把小瓶的水倒入大瓶中时不会有任何问题。
Java中支持的自动类型转换的类型:
1、byte->short->int->long->float->double
2、char->int->long->float->double
强制类型转换:
-如果希望上面的自动转换类型中,箭头右边的类型转换成左边的类型,则必须进行强制类型转换。强制类型转换会造成数值或变量的数据精度丢失。当进行强制的类型转换时,类似于把大瓶里的水倒入小瓶中,就会造成水的溢出。
-注意:当试图把一个范围比较大的数值类型或者变量转换为范围比较小的类型时,必须格外小心,因为非常容易引起数据信息的丢失。
复制代码
1.3 引用数据类型
1.3.1 五种引用数据类型:
类、接口、数组、枚举、注解
复制代码
1.4 基本数据类型和引用数据类型的区别:
从概念方面来说:
-基本数据类型:变量名指向具体的数值。
-引用数据类型:变量名指向存储数据对象的内存地址。
从内存方面来说:
-基本数据类型:变量在声明之后,Java 就会立刻分配内存给其使用。
-引用数据类型:变量声明时不会分配内存,知识存储了一个内存地址。
从使用方面来讲:
-基本数据类型:使用时需要赋予具体的值,判断时使用 == 号。
-引用数据类型:使用时可以赋予 null ,判断时使用 equals() 方法。
复制代码
1.5 常量
1.5.1 生活中的常量:
一周7天
一天24小时
一小时60分钟
一分钟60秒
3.1415926...
A B C D a b c d
文字:你 我 他
语句:先帝创业未半...
代码来源于生活,最终反馈于生活!
数值,文字和文本,这些都可以认为是常量!!!
复制代码
1.5.2 开发中的常量:
定义:
在程序运行过程中,不会发生改变的量,称之为常量
按照习惯,可以把常量划分为这么几个类:
整数:1 2 3 4 5 -1 -2 -3- -4 -5
小数(浮点数):3.1415926 0.618 9.9
真假关系(布尔类型):T true F false
字符:'A' 'a' '你' '我' '他'
【注意】字符常量是【英文单引号】包含的【单个元素】
字符串:
"你好,在吗" "不,我不在"
【注意】字符串常量是【英文双引号】包含的所有内容
复制代码
1.6 变量
1.6.1 生活中的的变量:
时间
天气温度
年龄
体重
银行卡余额
复制代码
1.6.2 代码中定义变量的格式:
格式:
数据类型 变量名 = 初始化数据;
int a = 10;
变量名里面保存的数据,可以在程序的运行过程中发生改变!
数据类型:
约束当前变量的数据是什么类型
变量名:
方便操作变量的名字
= 赋值号:
把赋值号右侧的数据赋值给左侧的变量名
初始化数据:
对应数据类型的初始值
变量名的命名规则可参考:
《阿里巴巴Java开发规范》 附上文件。
复制代码
2.运算符
2.1 各种运算符
2.1.1 算术运算符:
生活中的运算符:
+ - × ÷ ()
对于程序员而言:
+ - * / () %
15 / 4 = 3
先乘除后加减
有括号先处理括号里面的内容
除数不能为0,无效运算
基本法则是从左至右计算
注意事项:
1、要关注变量在运行过程中,变量保存数据的改变。
2、注意运算符使用到底是哪一个。
3、变量的值有且只有被赋值的情况下,才会被改变,变量没有被赋值,不会更改。
复制代码
2.1.2 赋值运算符:
= += -= *= /= %=
例如:
numA = numA + numB ==> numA += numB
复制代码
2.1.3 自增自减运算符:
++:
在【变量之后】,首先执行当前语句,再执行自增操作
在【变量之前】,首先执行自增操作,再执行当前语句
--:
在【变量之后】,首先执行当前语句,再执行自减操作
在【变量之前】,首先执行自减操作,再执行当前语句
注意:
自增自减运算符有且只能操作变量!
自增运算相当于当前变量 += 1
自减运算相当于当前变量 -= 1
从开发者的阅读性考虑
1、如果使用自增自减运算符,请单独成行!
2、能够使用 += 1 或者 -= 1 替代,就不要使用自增自减
复制代码
2.1.4 关系运算符:
> < ≥ ≤ ≠ =
这是数学中的关系运算符
> < >= <= != ==
开发中的关系运算符
关系运算符的结果是 true 或者 false
复制代码
2.1.5 逻辑运算符:
&& 与:
同真为真,有假即假
银行的保险柜,打开保险柜需要两把钥匙,缺一不可
|| 或:
自家的门,只有一把钥匙可以开门
有真即真,同假为假
! 非:
犟 杠精
取反
逻辑运算符的断路原则:
class Demo {
public static void main(String[] args) {
int num = 10;
/*
逻辑与断路原则:
与 同真为真,有假【即】假
在逻辑与表达式中,出现任何一个条件为 false 条
件,从 false 条件开始,之后的表达式都不会运行
因为整个逻辑与表达式的结果不会有任何的更改。
*/
boolean ret = 3 > 4 && ++num > 5;
System.out.println("ret =" + ret); // false
System.out.println("num =" + num); // 10
int num2 = 20;
/*
逻辑或断路原则:
或 有真【即】真,同假为假
在逻辑或表达式中,出现任何一个条件为 true 条
件,从 true 条件开始,之后的表达式都不会运行
因为整个逻辑或表达式的结果已经确定,之后的运算
没有意义!
*/
ret = 4 > 3 || ++num2 > 200;
System.out.println("ret =" + ret); // true
System.out.println("num2 =" + num2); // 20
}
}
复制代码
2.1.6位运算符:
& | ~ ^ >> <<
&:
与 运算
同1为1,有0【即】0
|:
或 运算
有1【即】1,同0为0
~:
取反 运算
1为0,0为1
^:
异或 运算
两个操作数,相同为0,不同为1
>>:
右移 运算
a >> b 将数值 a 的二进制数值从 0 位算起到第 b - 1 位,整体向右方向移动 b 位,符号位不变,高位空出来的位补数值 0。
5 >> 1 ===> 1000 0000 0000 0101 >> 1 = 1000 0000 0000 0010 = 2
总结规律:a >> b = a / (2 ^ b)
<<:
左移 运算
a << b 将数值 a 的二进制数值从 0 位算起到第 b - 1 位,整体向左方向移动 b 位,符号位不变,低位空出来的位补数值 0。
5 << 1 ===> 1000 0000 0000 0101 << 1 = 1000 0000 0000 1010 = 10
总结规律:a << b = a * (2 ^ b)
复制代码
2.1.7 三目运算符:
语法结构:
(boolean表达式) ? (表达式1) : (表达式2)
执行流程:
先判断 boolean 表达式的值:
若为 true,则整个运算式的值为表达式1的值;
若为 false,则整个运算式的值为表达式2的值。
int a = 10, b = 1;
int max = a > b ? a : b; // 如果a>b为true,说明a大,则把a的值赋给max,若a>b为false,说明b大,把b赋给max
复制代码
3. 简单小练习
3.1 补充
3.1.1 Scanner 的使用
目前的代码是需要修改变量的数值值之后,重新编译然后在继续运行,对于普通用户来说,没有任何的价值。我们需要给予用户一个从键盘上输入数据的方式和方法。
需要借助于 Scanner !!!
1、点技能点!!!【导包】
在 class 之前
import java.util.Scanner;
2、创建一个 Scanner 的"变量"
Scanner sc = new Scanner(System.in);
3、使用 Scanner 扫描器中的方法,从键盘上获取用户输入的数据
获取 int 类型 int num = sc.nextInt();
获取 float 类型 float num = sc.nextFloat();
获取 Double 类型 double num = sc.nextDouble();
获取 char 类型 char ch = sc.nextLine().charAt(0);
复制代码
3.1.2 用户体验友好性考虑
-作为一个软件开发者,在代码中需要给予用户适当的提示,告知用户,这里需要输入还是获取从用户使用的角度去考虑
-这就是用户体验友好性的体现
复制代码
3.1.3 用户输入数据的过滤问题
在我们进行用户体验友好性考虑之后就会有以下问题:
-用户输入的数据是存在一定的错误情况的,那么我们的程序是要考虑用户输入数据的【合法性】问题
-如果用户输入的数据不合法,则不能进入正常的代码运行,而且给予用户一个提示,如果用户输入的数据正确,则程序继续执行!!!
复制代码
3.2 使用逻辑和关系运算符写一些条件判断的要求。
要求:
1、参考ASCII码表
2、所有的字符请使用字符本身,不允许使用对应的编码
3、年份判断,用小括号包含条件
复制代码
3.2.1 判断一个字符类型的变量是不是一个大写英文字母。
public class TestUpperCase {
public static void main(String[] args) {
System.out.println("请输入一个英文字母");
Scanner scanner = new Scanner(System.in);
char ch = scanner.nextLine().charAt(0);
if (ch >= 'A' && ch <= 'Z') {
System.out.println("您输入的是大写英文字母!");
} else {
System.out.println("您输入的是小写英文字母!");
}
}
}
复制代码
3.2.2 判断一个字符类型的变量是不是一个英文字母。
public class TestEnglishCase {
public static void main(String[] args) {
System.out.println("请输入一个字符:");
Scanner scanner = new Scanner(System.in);
char ch = scanner.nextLine().charAt(0);
if ((ch > 'A' && ch < 'Z') || (ch > 'a' && ch < 'z')) {
System.out.println("您输入的是一个英文字母!");
} else {
System.out.println("您输入的不是一个英文字母!");
}
}
}
复制代码
3.2.3 判断一个年份是不是闰年。
/*
闰年条件:
能被4整除,但是不能被100整除。或者可以被400整除
year % 4 == 0
year % 100 != 0
year % 400 == 0
*/
public class TestYear {
public static void main(String[] args) {
System.out.println("请输入一个年份:");
Scanner scanner = new Scanner(System.in);
int year = scanner.nextInt();
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
System.out.println("这是一个闰年!");
} else {
System.out.println("这不是一个闰年!");
}
}
}
复制代码
https://juejin.im/post/5d8820e1f265da03db07b5c3