类加载机制?
整数字面量的二进制形式以0b开头,当然,只能使用数字1或0。字面量的二进制形式可能很长,所以经常在字面量中使用下划线。在任何数字字面量中,下划线都会被忽略。下划线纯粹是为了提升字面量的可读性。
除了表示普通的数字之外,float和double类型还能表示4个特殊的值:正无穷大、负无穷大、零和NaN。如果浮点数运算的结果超出了float或double能表示的范围上限,得到的是无穷大。如果浮点数的运算结果超出了float和double能表示的范围下限,得到的结果是零。
若想检查某个float或double值是否为NaN,必须使用Float.isNaN()或Double.isNaN()方法。
switch语句关联的表达式必须是适当的类型,可以是byte、char、short、int(及这四种类型的包装类型)、枚举类型或String类型,不支持浮点数和布尔类型,虽然long也是整数类型,但也不能使用。
处理多线程时,经常必须避免多个线程同时修改同一个对象,以防对象的状态有冲突。Java提供的synchronized语句可以帮助程序员,避免发生冲突。synchronized语句的句法为:
synchronized ( expression ) {
statements
}
expression表达式的计算结果必须是一个对象或数组。statements是能导致破坏的代码块,必须放在花括号里。
执行语句块之前,Java解释器先为expression计算得到的对象或数组获取一个排它锁(exclusive lock),直到语句块执行完毕后再释放。只要某个线程拥有对象的排它锁,其他线程就不能再获取这个锁。
在Java中,synchronized关键字还可以作为方法的修饰符。应用于方法时,synchronized关键字指名整个方法都被锁定。如果syncronized关键字应用于类方法(静态方法),执行方法前,Java会先为这个类获取一个排它锁。如果syncronized关键字应用于实例方法,Java则为类的实例获取一个排它锁。
处理资源的try语句(TWR)。示例如下:
try (InputStream is = new FileInputStream("/Users/ben/details.txt")) {
// ...... 处理这个文件
}
所有处理资源的新代码都应用使用TWR形式编写,因为这种形式比自己动手编写catch块更少出错,而且不会遇到麻烦的技术问题。
异常是Throwable对象,而且异常主要分为两类,通过Error和Exception子类标识。只要异常对象是Error类,就是未检异常。Exception类还有一个子类RuntimeException,RuntimeException类的所有子类都属于未检异常。除此之外,都是已检异常。
Java为已检异常和未检异常制定了不同的规则。如果定义的方法会抛出已检异常,就必须在方法签名的throws子句中声明这个异常。Java编译器会检查方法签名,确保的确声明了;如果没声明,会导致编译出错(所以才叫“已检异常”)。
Java中,数组的长度不是数组类型的一部分。如果方法的参数类型是int[]
,调用时传入的数组可以包含任意个元素(包括零个)。
数组类型不是类,但数组实例是对象。这意味着,数组从java.lang.object类继承了方法。数组实现了Cloneable接口,而且覆盖了clone()方法,确保数组始终能被复制,而且clone()方法从不抛出CloneNotSupportedException异常。
数组还实现了Serializable接口,所以只要数组中元素的类型能被序列化,数组就能被序列化。
在Java中,使用new关键字创建数组,就像创建对象一样。数组类型没有构造方法,但创建数组时要指定长度,在中括号里使用非负整数指定所需的数组大小。
Java的5种引用类型:类、数组、接口、枚举、注解。
把对象赋值给变量或传入方法时,不会复制表示这个对象的内存,而是把这个内存的引用存储在变量中或传入方法。