标识符
标识符是赋给类、方法、变量……的名字。
一个标识符可以是字母、数字、下划线、美元符号的任意顺序组合,但不能以一个数字开始,也不能是关键字。
注:Java是区分大小写的,Student和student是不一样的
由于Java采用的Unicode编码,所以中文也算是字母,但是并不建议用中文做标识符
int 中文 = 5;
System.out.println(中文); // 输出5
关键字
关键字是Java里事先定义好并赋予特殊含义的单词,也被称为保留字,标识符不能和关键字冲突。
注意:main不是关键字
常量
常量就是在程序中固定不变的值,是不能改变的数据。例如数字1,字符‘a’,浮点数3.2等。在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等等。
1.整型常量
整型常量是整数类型的数据,有二进制,八进制,十进制和十六进制四种表示形式:
- 二进制:由数字0和1组成的数字序列,前面要以0b或0B开头,目的是为了和十进制进行区分,如0b01101100,0B10110101
- 八进制:以0开头并且其后由0~7范围内(包含0和7)的整数组成的数字序列,如0342。
- 十进制:由数字0~9范围内(包含0和9)的整数组成的数字序列,如198。
- 十六进制:以0x或0X开头并且其后由0-9,A-F(包含端点)组成的数字序列,如0X25AF
注意:在程序中为了标明不同的进制,数据都有上述的特定标识,必须遵守。
2.浮点数常量
浮点数常量就是在数学中用到的小数,分为float单精度浮点数和double双精度浮点数两种类型。其中,单精度浮点数后面以F或f结尾,双精度浮点数后面以D或d结尾。当然,也可以不加任何的后缀,此时Java虚拟机会默认为double双精度浮点数。
3.字符常量
字符常量用于表示一个字符,它可以是英文字母,数字,标点符号以及转义序列来表示的特殊字符。
'a' '1' '&' '\r' '\u0000'
4.字符串常量
字符串常量用于表示一串连续的字符。
"Hello World" "123" "Welcome \n XXX" ""
5.布尔常量
布尔常量即布尔型的两个值true和false,该常量用于区分一个事物的真与假
6.null常量
null常量只有一个值null,表示对象的引用为空。
变量
变量的定义
在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元被称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
变量的数据类型
在JAVA中的变量数据类型分为两种:基本数据类型和引用数据类型。
此图从这篇博客转载而来
操作误区:
定义一个long变量时,如果用常量给他赋值,并且这个常量的值超过了int的范围,则一定要在这个常量后面加一个L或者l。
long val = 9999999999999L;
定义一个float变量时,如果用常量给他赋值,并且这个常量是小数,则必须在这个常量后面加个f或者F,因为小数会被默认为double类型的值。
float val = 1.2f;
定义一个boolean变量,只能用true或者false给他赋值,并不能用0或1去赋值。
boolean flag = true; // 正确
boolean flag = 1; // 错误
变量类型的转换
1.自动类型转换
自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。
他需要两个条件:第一,两种数据类型彼此兼容;第二,目标类型的取值范围大于源类型的取值范围(目标类型可以类比成水桶,源类型可以类比成水杯)
举例:
byte b = 3;
int a = b; // 程序把byte类型的b自动转换成了int类型,无须特殊声明
下面列举三种可以进行自动类型转换的情况:
- 整数类型之间可以实现转换,低取值范围的向高取值范围转换
- 整数类型可以转换成float类型。
- 其他类型可以转换成double类型。
2.强制类型转换
强制类型转换也叫显式类型转换,指的是两种数据类型之间需要进行显式地声明。
当两种类型彼此不兼容,或者目标类型的取值范围小于源类型时,自动类型转换无法进行,这时就需要强制类型转换。
目标类型 变量名 = (目标类型) 值;
byte b = (byte) num;
注意:在对变量进行强制类型转换时,会发生取值范围较大的数据类型向取值范围较小的数据类型的转换,如将一个int类型的数转换成byte类型,这样极其容易造成数据精度的丢失。因为两者的取值范围不同,所以小范围的数据类型会截断大范围的数据类型,造成精度丢失。
举例:
int a = 128;
byte b = (byte) a;
System.out.println(b); // 输出-128,精度丢失,具体原理:自行写出他们的二进制表示即可理解
3.表达式类型的自动提升
所谓表达式是指由变量和运算符组成的一个算式,变量在表达式中进行运算时,也有可能发生自动类型转换,这就是表达式数据类型的自动提升,如一个byte型的变量在运算期间类型会自动提升为int型。
byte b1 = 3;
byte b2 = 4;
byte b = b1 + b2; // 此时报错,因为在运算期间,变量b1和变量b2都被提升为了int型,直接赋值就会出错
byte b = (byte) (b1 + b2); // 此时成功
运算符
理解一个点,其他的和c++一样,不再赘述。
| 或,|| 短路或,& 与,&&短路与
- | 或:无论左式的真假性,都要计算运算符两边的表达式
- || 短路或:当左式为真时,就判断整个式子为真,不再计算判断右式
- & 与:无论左式的真假性,都要计算运算符两边的表达式
- && 短路与:当左式为假时,就判断整个式子为假,不再计算判断右式
举例:
int x = 0, y = 0, z = 0;
boolean flag1, flag2;
flag1 = x > 0 & y++ > 0; // 最终y的值为1,因为右式计算判断过了
flag2 = x > 0 && z++ > 0; // 最终z的值为0,因为右式没有计算判断过