标识符语法
1)java中定义标识符格式以字母,数字,下划线,$符合组成,不能以数字开头,且不能为
java中的关键字。
2)标识符意义要明确,不要乱起
3)标识符区分大小写例如 z和Z是不同的两个标识符
4)java常用关键字
Java中的关键字
abstract | assert | boolean | break | byte | case | catch |
char | class | continue | const | default | do | double |
else | extends | enum | final | finally | float | for |
goto | if | implements | import | instanceof | int | interface |
long | native | new | package | private | protected | public |
return | short | static | synchronized | super | strictfp | this |
throw | throws | transient | try | void | volatile | while |
数据类型分类和转换
四类 | 八种 | 字节数 | 数据表示范围 |
整型 | byte | 1 | -128~127 |
| short | 2 | -32768~32767 |
| int | 4 | -2147483648~2147483648 |
| long | 8 | -263~263-1 |
浮点型 | float | 4 | -3.403E38~3.403E38 |
| double | 8 | -1.798E308~1.798E308 |
字符型 | char | 2 | 表示一个字符,如('a','A','0','家') |
布尔型 | boolean | 1 | 只有两个值true与false |
1)布尔
基本数据类型中,布尔类型boolean占有一个字节,由于其本身所代码的特殊含义,boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。
2)基本数据类型中数值类型的自动类型提升
图中依次表示了各数值类型的字节数和相应的取值范围。在Java中,整数类型(byte/short/int/long)中,对于未声明数据类型的整形,其默认类型为int型。在浮点类型(float/double)中,对于未声明数据类型的浮点型,默认为double型。
1 public class TestCast { 2 5 3 6 public static void main(String[] args) { 4 7 byte a = 1000; // 编译出错 5 8 float b = 1.5; // 编译出错 6 9 byte c = 3; // 编译正确 7 10 } 8 11 9 12 }
jvm在编译过程中,对于默认为int类型的数值时,当赋给一个比int型数值范围小的数值类型变量(在此统一称为数值类型k,k可以是byte/char/short类型),会进行判断,如果此int型数值超过数值类型k,那么会直接编译出错。因为你将一个超过了范围的数值赋给类型为k的变量,k装不下,你又没有进行强制类型转换,当然报错了。但是如果此int型数值尚在数值类型k范围内,jvm会自定进行一次隐式类型转换,将此int型数值转换成类型k。如图中的虚线箭头。这一点有点特别,需要稍微注意下。
在其他情况下,当将一个数值范围小的类型赋给一个数值范围大的数值型变量,jvm在编译过程中俊将此数值的类型进行了自动提升
自动类型转换
表示范围小的数据类型转换成范围大的数据类型,这种方式称为自动类型转换
自动类型转换格式:
范围大的数据类型 变量 = 范围小的数据类型值
强制类型转换格式
范围小的数据类型 变量 = (范围小的数据类型) 范围大的数据类型值;
1 public class TestCast { 2 4 3 5 public static void main(String[] args) { 4 6 byte p = 3; // 编译正确:int到byte编译过程中发生隐式类型转换 5 7 int a = 3; 6 8 byte b = a; // 编译出错 7 9 byte c = (byte) a; // 编译正确 8 10 float d = (float) 4.0; 9 11 } 10 12 11 13 }
区别在于前者3是直接量,编译期间可以直接进行判定,后者a为一变量,需要到运行期间才能确定,也就是说,编译期间为以防万一,当然不可能编译通过了。此时,需要进行强制类型转换。
3)其他情况
1 public class TestCast { 2 4 3 5 public static void main(String[] args) { 4 6 long a = 10000000000; //编译出错 5 7 long b = 10000000000L; //编译正确 6 8 int c = 1000; 7 9 long d = c; 8 10 float e = 1.5F; 9 11 double f = e; 10 12 } 11 13 12 14 }
如上:定义long类型的a变量时,将编译出错,原因在于10000000000默认是int类型,同时int类型的数值范围是-2^31 ~ 2^31-1,因此,10000000000已经超过此范围内的最大值,故而其自身已经编译出错,更谈不上赋值给long型变量a了。
此时,若想正确赋值,改变10000000000自身默认的类型即可,直接改成10000000000L即可将其自身类型定义为long型。此时再赋值编译正确。
将值为1000的int型变量c赋值给long型变量d,按照上文所述,此时直接发生了自动类型提升, 编译正确。同理,将e赋给f编译正确。
接下来,还有一个地方需要注意的是:char型其本身是unsigned型,同时具有两个字节,其数值范围是0 ~ 2^16-1,因为,这直接导致byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为负数的问题),同时,byte当然可以直接提升到short型。