复用
两种方式:组合,继承
继承和组合优先考虑组合,在使用继承之前自问一句:我真的需要向上转型吗?
惰性初始化(delayed initialization):
在正需使用对象之前对其进行的初始化。在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担。
if(s==null){
s = "joy";
}
'+'和'+='被java设计者重载用以处理String对象
@override:
@override注解可以防止你在不想重载时而意外进行了重载
当你在子类中想要重载父类的方法时,有可能会进行覆盖,此时最好显示的在此方法之前加上@override 关键字来告诉编译器你要做什么
final:
向编译器告知一块数据是恒定不变的。比如1.一个用不改变的编译时常量。2.一个在运行时被初始化的值,而你不希望它被改变(如 final int i = rand.nextInt(20));
对于基本数据类型,final使得该值恒定不变;而对于对象的引用,final使得该引用恒定不变,但是却可以修改该对象的属性值(a[i]++)
//TODO: 将类中的一个属性声明为final,在子类中尝试改变它
空白final:
private final int j; //被声明为final但又未被指定初值的final变量叫空白final
空白final必须在构造器中进行初始化,否则将不能通过编译,不信你可以做下尝试
final参数:
形参被声明为fianl时,将无法更改形参引用所指向的对象
void f(final Apple apple){
//apple = new Apple(); //Illegal
}
final方法:
方法锁定,以防任何继承类修改它的含义(即不能被覆盖)
final和private:
类中所有的private方法都隐示的被指定为final
final类:
被声明为final的类不能被继承
初始化及加载:
类的代码在初次使用时才被加载,即加载发生于创建类或该类的子类的第一个对象之时,但是当访问static域时,也会发生加载(构造器也是static方法)
在命令行中执行 java Beetle之后发生的事:
1.试图访问Beetle.main()方法,即入口,但发现此时并未加载Beetle
2.找出Beetle的class文件,执行加载过程,如果已被加载,则跳过加载
3.如果Beetle是某个类的子类,首先去加载其父类
4.父类加载完成后执行初始化,此时static 变量会被初始化
5.子类的加载和子类的static初始化
6.加载全部完成,执行main方法
7.如果在main中创建对象,将进行成员的初始化,见P96
备注:加载类的动作仅发生一次