多态
- 编译时多态:编译时多态主要指方法的重载
- 运行时多态:运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。(3个条件:继承、覆盖、向上转型)
缓存池
new Integer(123) 与 Integer.valueOf(123) 的区别在于:
- new Integer(123) 每次都会新建一个对象
- Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
缓存池:
- boolean values true and false
- all byte values
- short values between -128 and 127
- int values between -128 and 127
- char in the range \u0000 to \u007F
String
String不可变的好处
- 可以缓存hash值,避免重复计算
- String Pool的需要
- 安全性,String不可变性保证参数不可变
- 线程安全
String、StringBuffer和StringBuilder
- 可变性:String不可变,其他两者可变;
- 线程安全:String不可变线程安全,StringBuilder不是线程安全的;StringBuffer是线程安全的,内部使用synchronized进行同步
String.intern()方法
可以保证相同内容的字符串变量引用统一的内存对象。
关键字
final
- 基本类型,final使数值不变
- 引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
- 声明方法不能被子类重写。
- 声明类不允许被继承。
static
- 静态变量
- 静态方法:在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法(abstract)。
- 静态代码块:在类初始化时运行一次
- 静态内部类:非静态内部类依赖于外部类的实例,而静态内部类不需要。
- 静态导包:在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
- 初始化顺序:静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。
异常和错误
Throwable 可以用来表示任何可以作为异常抛出的类,分为两种:Error 和 Exception。其中 Error 用来表示 JVM 无法处理的错误。
受检查异常
需要用 try…catch… 语句捕获并进行处理,并且可以从异常中恢复:
- IO相关的异常
- ClassNotFoundException
- SQLException
非受检查异常
- NullPointerException(空指针异常)
- IllegalArgumentException(参数错误比如方法入参类型错误)
- NumberFormatException(字符串转换为数字格式错误,IllegalArgumentException的子类)
- ArrayIndexOfBoundsException(数组越界错误)
- ClassCastException(类型转换错误)
- ArithmeticException(算法错误)
- SecurityException(安全错误比如权限不够)
- UnsuppeortedOperationException(不支持的操作错误比如重复创建同一用户)