一、关键字
二、字面量
(1)整数和小数直接使用;
(2)字符串需要加上双引号;
(3)字符需要加上单引号;
(4)布尔只有两个值true和false。
三、变量
两个注意点:
1、正常都是一条语句中只定义一个变量,
如int a = 100;
int b = 200;
其实一条语句中也可以定义多个变量,即int a = 100, b = 200;。
2、变量一定要初始化吗?
①方法中的局部变量在使用之前必须进行赋值;
②类中的成员变量在定义的时候可以不进行初始化。
四、数据类型
1、基本数据类型
①整数:byte、short、int、long
②小数:float、double
整数和小数两个数据类型的取值范围如下图所示:
byte < short < int < long < float < double
③布尔:boolean
④字符:char
问题1:Java中的long和float在使用时为什么需要加L和F?
(1)在Java中,当出现一个整数字面量时,我们就默认这个整数是int型,所以将此整数赋给除int以外的任何一种类型的变量时都会进行数据转换。
①如果这个数处于int数据类型的范围,在赋给long类型的变量时会自动进行数据类型提升,由int转换为long,不会提示出错;
②受限于int型,有些数它存不了,如果这个数超出int数据类型能表示的范围,则会提示错误,然后加上L则可表明这是一个long类型的数据就合法了。
代码如下:
(2)同理float也一样。在Java中出现的小数的默认数据类型是double。
①给出的小数假设是在double数据类型的范围内的,但是为了赋给float类型的变量,必须加上F强制转换为float。
详情见文章链接:Java定义的long和float为什么需要加L和F?CSDN博客
问题2:为什么float的取值范围大于long?
float类型的数据在内存中的存储是这样的:
其中第一位,表示符号位,即S;
接下来的8位,即第二位到第九位,表示指数域E;
剩下的23位,即第十到第三十二位,表示小数域M。
具体如何计算这里就不再详细介绍了,有时间可以看一下下面这些文章:
【详细解说】单精度浮点数float取值范围_float范围-CSDN博客
float 和 long 比较 - HJ0101 - 博客园 (cnblogs.com)
2、引用数据类型
3、数据类型之间的转换
整数和小数它们所能表示的数的取值范围如下:
byte < short < int < long < float < double
(1)自动转换
①什么时候转换?
例如当参与运算的变量数据类型不一致,会先转换成一致的再进行计算。
②转换的依据?
范围小的可自动提升位范围大的;
③byte、short、char这三种类型的变量在参与运算时会自动向上提升为int,然后再参与运算。
例子1,a和b已经向上提升为int型,所以计算的结果为int型,赋给int型变量是没有问题的。
byte a = 5;
byte b = 8;
int result = a + b;
例子2,char类型的变量在参运计算时会自动转换为ASCII码表中的int型整数。所以c自动向上转型为int型整数97,与int整数进行加法运算后的结果为109。
char c = 'a';
int result = c + 12;
(2)强制转换
①范围大的想向范围小的进行转换时就需要强制转换,如int a = (int)10L;
(3)自动转换和强制转换发生在两种情况下
①赋值:小的赋给为大的自动转换;大的赋给小的则强制转换。
②计算:两种不同类型的数据进行计算,要先转换为同一数据类型。
Example
1、在Java中整数的默认数据类型是int,那么 byte a = 10;为什么没有报错呢?
①问题:赋值的左边是一个int型的整数10,右边是byte型的变量,从范围大的向小的转换就需要强制,但是此处并没有看到强制转换出现。
②答案:这里有一个规则1:当赋值左边的字母量小于右边数据类型的取值范围时,Java编译器在编译的时候会自动为其加上强转。通过反编译可以看到,下面来测试一下:并没有看到。
2、在下面这个例子中,byte型变量a和b在参与计算的时候向上提升为int型,所以计算的结果为int型(计算), 但是如果要赋给byte型变量就需要强转(赋值),所以有两次数据转换过程。
byte a = 5;
byte b = 8;
byte result = (short)a + b;
①但是如果直接byte result = 5 + 8;是没有问题的,为什么呢?
5和8是int型,计算完的结果13也是int型,赋值左边的字面量小于右边变量的数据类型的取值范围,Java编译器在编译的时候会自动为其加上强转。(和1类似)
②那为什么byte result = a + b;就不行呢?
因为a和b是变量,所以必须加上强转。
五、标识符
1、变量和方法的命名
硬性规则:
①包括数字、字母、下划线和美元符
②不能以数字开头
③区分大小写
④不能是关键字
软规则:
符合小驼峰,如果只有一个单词,则只需小写;如果两个及以上个单词,则第一个单词小写,第二个及后面的单词需要首字母大写,如setPrice等等。
2、类名的命名
软规则:
符合大驼峰,如果只有一个单词,则首字母大写;如果两个及以上个单词,则每一个单词的首字母都需大写。
六、运算符
1、算术运算符:+ - * / % ++ --
(1)关于后面的自增自减运算符a++和++a的区别
①a++:先使用a原先的值,再将a+1;
②++a:先将a+1,再使用。
int a = 5;//定义一个变量;
int b = 5;
int x = 2*++a;
int y = 2*b++;
System.out.println("自增运算符前缀运算后a="+a+",x="+x);
System.out.println("自增运算符后缀运算后b="+b+",y="+y);
输出结果:
(2)+运算符的两个作用
如果有字符串的出现,+是拼接字符串,其他的都是加法运算。
①作为数字之间的加法运算
②字符串的拼接
当+的某一边出现了字符串时,此时就将+左右两边的数据进行拼接生成一个新的字符串。
下面是字符串分别与数字、布尔、字符类型的字面量进行+操作:
System.out.println("abc" + 123);
System.out.println("abc" + true);
System.out.println("abc" + 'd');
结果如下:
2、赋值运算符:=
3、关系运算符:> >= < <= == !=
4、逻辑运算符:& | ^ !
&(逻辑与) | 两边都为真才为真 |
|(逻辑或) | 一边为真就是真 |
^(逻辑异或) | 两边相同为假,不同为真 |
!(逻辑非) | 取反 |
5、短路逻辑运算符:&& ||
短路逻辑运算符的出现是为了减少第二个条件的判断,比如与,第一边为假第二边就不用判断了。
6、三元运算符
因为需要3个操作数,所以称为三元操作符,格式:(条件表达式) ? 表达式1 : 表达式2。读作如果条件为true,则返回表达式1的值,为false则返回表达式2的值。
七、表达式、语句和块
在学习完字面量、变量以及运算符之后就可以进行一个操作了。
1、表达式
如x + y,表达式的计算结果为单个值。
2、语句
以分号结束,如int result = x + y;和流程控制语句。
3、块
由很多语句组成。
八、流程控制语句
一、分支语句
1、if语句
(1)第一种格式:只有一个条件,只关注满足条件时要做什么。
if(条件表达式){
语句体;
}
注意点:
如果语句体只有一行代码,则if后面的大括号可以省略,但是不建议这样做。
(2)第二种格式:只有一个条件,关注满足条件时要做什么和不满足条件要做什么!
if(条件表达式){
语句体;
}
else{
语句体;
}
(3)第三种格式:多条件判断,一般是判断一个值属于众多条件表达式中的哪一个。
关注满足条件时要做什么,不满足条件时进入到下一个条件的判断。
if(条件表达式1){
语句体1;
}
else if(条件表达式2){
语句体2;
}
...
自己总结就是,else的后面可以是第一种格式,也可以是第二种格式。
2、switch语句
多条件判断时用if语句很麻烦,这里就出现了switch。
基本格式:
switch(条件表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n;
break;
}
有一个疑问就是case后面的语句体要用大括号括起来吗?
可以写很多语句,可以不用大括号括起来。
但是加和不加的区别:
①加了之后,大括号框定了作用域,大括号内定义的变量只在大括号内部有效。
②不加的话,一个case中定义的变量,会在另一个case中也能访问,不安全。
(1)关于default的位置以及default是否可以省略?
关于default的位置:default也可以放在case语句的前面,放在哪里都可以,不一定要放在最后的位置。
关于default是否可以省略:答案是可以,语法没有错误,但是当switch中条件表达式的值与case中的所有值都不匹配时会没有输出,这种情况不好,容易让人摸不着头脑,为了避免这种情况一般都加上default。
(2)case穿透
如果当前匹配的case语句体中没有break,当匹配成功后,会继续执行后续所有case的语句体,直到方法结束或者遇到break。利用这一特性我们可以少写一些代码。
(3)JDK12的switch新特性:简化switch的书写
具体怎么简化的呢?
①将冒号:改为->
②省略break,然后将语句体用大括号括起来,而且如果语句体只有一句,那大括号也可以省略。
有一个问题,就是我发现总是可以这样省略大括号,但是到了后面我根本就记不得什么时候可以省,什么时候不可以省。很烦。或者这样想,如果语句体只有一句那么大括号自然可以省略。
switch(条件表达式){
case 值1 -> {
语句体1;
}
case 值2 -> {
语句体2;
}
...
default -> {
语句体3;
}
}
//语句体只有一句时省略大括号
switch(条件表达式){
case 值1 -> 语句体1;
case 值2 -> 语句体2;
...
default -> 语句体3;
}
}
(4)if的第三种格式和switch分别什么时候使用呢?
判断一个变量属于众多条件中的哪一个。
if一般是判断变量是否属于某个范围,而switch则一般是判断变量是哪个值。