float a = 3.5; int b = a; 打印b的结果是什么
编译出现错误,原因是a是float类型的,无法自动向下转型,如果要转型必须通过强制转换类型来转换,正确代码是float a = 3.5f;int b = (int)a;
int a = 5; float b = a; 打印b的结果是什么
5.0,int类型的a向上转型为float类型,属于自动转换类型
char a = 'A'; int b = a; 打印b的结果是什么
65,char类型的a向上转型为int类型,属于自动转换类型,故输出’A‘的字符编码
int a = 68; char b = a; 打印b的结果是什么
编译出现错误,原因是a是int类型的,无法自动向下转型,如果要转型必须通过强制转换类型来转换,正确代码是int a = 68;char b = (char)a;
基本数据类型的类型转换
小的类型转换为大的类型(向上转型):自动/隐式类型转换
自动转型是没有副作用的,当整数向浮点型转换时会加上.0
byte -> short -> int -> long -> float -> double
大的类型转换为小的类型(向下转型):需要做强制/显式类型转换
危害:有可能会发生数据精度的丢失
强制转型是有副作用的,当浮点型向整数转型时,小数部分会丢失
double -> float -> long -> int -> short -> byte
在转换过程中Boolean类型与其他的类型不兼容,格格不入
变量的命名规则
- 以下划线、字母、美元符号开头
- 后面跟下划线、字母、美元符以及数字
- 大小写敏感,含义可能不同
- 不能是关键字
驼峰命名法:
多个单词组合在一起标识一个特定的含义时,第一个单词全部小写,第二个以及之后的单词首字母大写,其余字母小写的命名规则
小驼峰法:
第一个单词首字母小写,其他单词首字母大写,如getMyAge
一般用于变量名和方法名
大驼峰法:
全部单词首字母大写,如CheckAge
主要用于接口名和类名
连字符命名法:
所有字母小写,单词之间用连字符(-)隔开
算术运算符
+ | - | * | / | % |
当表达式中的数值都是整数int,则运算结果也是整数int
当表达式中有一个数值是浮点数double,则整个表达式所有数值全部提升为浮点数double,运算结果为浮点数double
两个int类型的相乘除我们通过什么操作可以得到浮点数类型呢,我们可以这样做a*1.0*b、a*1.0/b
赋值运算符
= |
在对整数(默认是int类型)进行赋值时,long类型后面要加L/l
在对浮点数(默认是double类型)进行赋值时,float类型后要加F/f,double类型后要加D/d
简单赋值运算符,如int a = 10;
进阶赋值运算符,如
a += 10 表示a = a + 10,就是把a的值取出来和10相加
a -= 10 表示a = a - 10,就是把a的值取出来和10相减
a *= 10 表示a = a * 10,就是把a的值取出来和10相乘
a /= 10 表示a = a / 10,就是把a的值取出来和10相除
a %= 10 表示a = a % 10,就是把a的值取出来和10求余
比较运算符
> | >= | < | <= | == | != |
所有的比较运算符,运算结果都是boolean类型,要么是true,要么是false
比较时会出现的错误是:运算结果的数据类型与存储这个运算结果的变量的数据类型不兼容
逻辑运算符
& | && | | | || | ! |
逻辑与 | 区别 |
& | 不会出现短路 无论前面条件是否成立,后面仍然执行 |
&& | 会出现短路 前面条件不成立,后面不会执行 |
逻辑或 | 区别 |
| | 不会出现短路 无论前面条件是否成立,后面仍然执行 |
|| | 会出现短路 前面条件成立,后面不会执行 |
逻辑非 | 对位取反,即1变0,0变1 |
位运算符
- <<:左移运算符 (记忆方法:箭头指哪表示向哪移)
- >>:右移运算符
- >>>:无符号右移运算符
左移运算:8<<2 表示8*4
1、有符号左移,高位舍弃,低位以0填充
00001000
00100000
2、右移运算:8>>2 表示8/4
有符号右移,正数最高位补0,负数最高位补1
00001000
00000010
3、无符号右移运算:无论正数或负数最高位都补0
单目运算符
单目的意思是表达式中只有一个操作数,例如 a++表达式只有一个操作数 a
++ --
如果表达式中只有++或--运算,则在变量前面或后面没有区别
如果表达式中除了++或--,还有其他运算
如++或--在变量前面,先运行++或--,再运行其他运算
如在变量后面,先运行其他运算,再运行+或--
三目运算符
运算符?锁住的表达式中有三个操作数
a > 60 ? 'A' : 'B';
第一个操作数必须是boolean类型,例如a>=60的运算结果要么是true,要么是false
当第一个操作数为true的时候,第二个操作数是表达式的最终运算结果,例如 a>=60成立,则最终运算结果是’A‘
当第一个操作数为false的时候,第三个操作数是表达式的最终运算结果,例如 a>=60不成立,则最终运算结果是’B‘
第一个操作数在三目运算符?之前,第二个和第三个操作数在?之后,且中间使用 : 分隔
第二个操作数和第三个操作数的数类型必须相同,且作为表达式最终运算结果的数据类型
什么是单目(一元)、双目(二元)、三目(三元)运算符
单目:运算符只对一个操作数进行运算
~5按位非
i++自增
!a逻辑取反
双目:运算符只对两个操作数进行运算
3+4
8/2
三目:运算符只对三个操作数进行运算
操作数1 ? 操作数2 :操作数3
注意:如果想要存储三目运算符的结果,应该使用和操作数2和操作数3的数据类型一致变量
=与==的区别
= | 表示赋值 |
== | 表示比较,其结果是boolean类型,即返回true或false |
i++与++i的区别
i++ | 先运算再执行i+1 |
++i | 先执行i+1再运算 |
+运算符操作数值, 字符, 字符串的区别是什么
&可以作为逻辑运算符使用, 也可以作为位运算符使用, 区别是什么
做二进制位之间的与运算
如6&3=110&011=010=2
|可以作为逻辑运算符使用, 也可以作为位运算符使用, 区别是什么
做二进制位之间的或运算
如6|3=110|011=111=7
什么是原码、反码、补码
原码就是变量转换过来的二进制数
正数反码就是自己本身,负数反码是原码除符号位对位取反
补码就是反码末位加1
图解3&5的运算过程和结果
3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
& | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 |
图解3|5的运算过程和结果
3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
| | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
7 |
图解~5的运算过程和结果
5的补码 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | |
~5 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 为负数补码,故还原成反码,减1 |
1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 反码处符号位对位取反为原码 | |
1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 结果为 -6 |
图解~-5的运算过程和结果
-5的补码 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | |
~-5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 为正数补码,反码,原码一样 |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | ||
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 结果为 4 |
图解3^5的运算过程和结果
3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
^ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
6 |
图解8<<2的运算过程和结果
8 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
<<2 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
32 |
图解8>>2的运算过程和结果
8 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
>>2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
2 |
&:按位与。当两位同时为1时才返回1。
|:按位或。只要有一位为1即可返回1。
^:按位异或。当两位相同时返回0,不同时返回1。
~:按位非。对位取反,即0变1,1变0。
计算机存储的是补码
5 正数的原码反码补码是一样的
原码:00000101
反码:00000101
补码:00000101 (按位非,包括符号位)取反~5 -> 11111010 相当于负数取原码
11111001 减1
10000110 -6
-5
原码:10000101
反码:11111010 反码加1=补码
补码:11111011 (按位非,包括符号位)取反~-5 -> 00000100 相当于整数取原码
00000100
00000100 4
>>与>>>的区别
>>是有符号数的右移,右移之后正数的最高位补0,负数的最高位补1
>>>是无符号数的右移,右移之后最高位都是补0
如何快速计算8*4、8/4
计算机只认识二进制0和1,所以使用位运算符计算能快速的得到结果,过程如下
8 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
*4 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
32 |
8 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
/4 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
2 |
运算符的优先级, 以及如何改变优先级
运算符优先级是表达式在多种运算过程中决定执行先后顺序的一种约束,来保证运算的合理性和结果的正确性、唯一性
那么如何改变它的优先级呢,方法和我们在数学运算中的一样,比如5+5*4,在没有改变优先级的情况下结果是25,如果给5+5加上括号来改变它的优先级,最后的结果就是40
Java语言中的改变优先级的方法也可以如此,通过加括号的方法来到达改变优先级的目的
第二行代码中有几个运算符和运算顺序
第二行代码中有 4个运算符:>、a++、?、=
它们的运算顺序是>、a++、?、=