Java语言是强类型语言,强类型包含两方面:
- 所有的变量必须先声明、后使用
- 指定类型的变量只能接受类型与之匹配的值
强类型的语言可以在编译过程中发现源代码的错误
注释
单行注释、多行注释、文档注释
javadoc只默认处理public、protected修饰的内容,如果希望也处理private修饰的内容,可以在使用javadoc工具时增加-private选项。
javac命令:
- -d
- -windowtitle
- -doctitle
- -header
- -help
标识符
Java必须以字母、下划线、$开头,数字不能开头
Java语言区分大小写
从Java9开始,不允许使用单独的下划线作为标识符
标识符不可以是关键字和保留字
标识符不能包含空格
标识符只能包含美元符,不能包含其他特殊字符
Java所有的关键字都是小写,TURE不是关键字
enum是java5新增的关键字,goto、const这两个关键字也被称为保留字(reserved word)
Java提供了三个特殊的直接量:true、false、null
Java10引入的var并不是关键字
数据类型
编程的本质就是对内存中数据的访问和修饰
char代表字符型,实际字符型也是一种整数类型,相当于无符号整数类型
不可以把一个null赋值给基本数据类型的变量
通常,一个整数默认是int类型,一个浮点型默认是double
把一个较小的整数赋值给long类型的变量,Java会把这个整型当作int来处理,只不过int类型可以自动转换成long类型
从Java7开始新增了对二进制整数的支持
二进制 0b\0B开头
八进制 0
十六进制 0x\0X
所有的数字在计算机底层都是以二进制形式存在的,原码是直接将一个数值换算成二进制数,但计算机以补码的形式保存所有的整数
补码计算规则:正数的补码和原码完全相同;负数的补码是其反码加1,反码是对原码的按位取反,只是最高位(符号位)保持不变
由于计算机底层保存字符时,实际是保存该字符对应的编号,因此,char类型的值可以作为整型来使用,相当于一个无符号的整数,范围:0~65535
Java的浮点型遵守IEEE 754标准,采用二进制数据的科学计数法来表示浮点数
float:1符号位 8指数 23尾数
double:1符号位 11指数 52尾数
所有的正无穷大都相等,负无穷也如此,NaN不与任何数值相等,甚至NaN和NaN都不相等
只有浮点数除以0才可以得到正无穷大,因为Java语言会自动把浮点数运算的0(整数)当成0.0(浮点数)处理,当然,一个int类型的整数除以0.0也可以得到无穷大
Java7引入了一个新功能,可以在数值中使用下划线,不管是整型数值,还是浮点型数值,都可以自由的使用下划线(直观的分辨数值中到底有多少位)
String str = true + " ",
使用var定义变量
Java10开始支持使用var定义局部变量,var相当于一个动态类型,使用var定义的局部变量的类型由编译器自动推断----定义变量时分配了什么类型的初始值,那该变量就是什么类型。
自动类型转换和强制类型转换
JDK1.5提供了自动装箱与拆箱功能,允许把基本类型值直接赋给对应的包装类引用,也允许把包装类对象直接赋给对应的基本类型变量。
常量池指的是在编译器被确定,并被保存在已编译的class文件中的一些数据,它包括关于类、方法、接口中的常量,也包括字符串常量。
Math包括了丰富的静态方法,用于完成各种复杂的数学运算。
int x = 1,y = 1,z = 1;
int x ,y ,z ;
x = y = z = 1;
原码、反码、补码
对于>>运算符而言,将其二进制码右移指定位数,空出来的用原码的符号位补充,正数补0,负数补1
对于>>>而言,空出来的总是以0填充
对于低于int类型的,总是先自动转换成int类型后在移位
对于int类型的整数移位a>>b,当b>32时,系统先用b对32求余,例如:a>>33 = a>>1
对于long类型的整数移位a>>b,当b>64时,系统先用b对64求余
+=:对于x += y,即对应于 x = x + y;
这种扩展后的赋值运算符不仅具有更好的性能,而且程序会更加健壮,虽然结果相同,但是运行机制存在差异。
- +:在编译器将右边的表达式结果计算出来后,和左边的变量类型比较精度,如果左边的变量精度低于右边的结果的精度,编译器会显式的报错,告诉程序员去强制转型。(所以s1 = s1 + 1出错)最后将表达式的结果复制到变量所在的内存区。
- +=:编译器自动隐式直接将+=运算符后面的操作数强制装换为前面变量的类型,然后在变量所在的内存区上直接根据右边的操作数修改左边变量内存存储的二进制数值(所以 s += 1不报错)最后达到和赋值运算符相同的目的。与前者相比,由于后者是位操作,效率也较前者高。
public class TestEqualOperater {
/**
* += 会把后面的数值自动强制转换为前面的类型,然后在那快内存上直接修改数值;
* = 是会在把后面的数值赋值到前面的变量时检测类型是否相同( 非自动强制转换!)
* 如果是高精度到低精度的,需要报错,告诉程序员会loss of data
*/
public static void main(String[] args) {
short s = 0;
int i = 32768;//1000 0000 0000 0000
//int j = 32767;// 111 1111 1111 1111
//System.out.println(Integer.toBinaryString(ii));
s += i;
//s = s + i;
System.out.println((short)32768);
System.out.println(s);
}
}
源代码就是一份文档,源代码的可读性要比代码运行效率更重要。