一、复用工具
1. 组合 : 只需在新类中产生现有类的对象 。(is - a 有一个) 新类是由现有类的对象组成。 (引用初始化与作用域?) 2. 继承 : 按照现有类的类型来创造新类。 (has - a 有一个)无需改变现有类的形式,采用现有类的形式并在其中添加新代码。3. 代理 : 我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露了该成员对象的所有方法(就像继承)。
二、关键字this 与 super 的区别
| this | super | |
| 使用范围 | 调用本类的属性和方法 | 从子类调用父类的属性和方法 |
| 调用属性(成员) | this.属性,从本类中查找 | super.属性,从父类中查找 |
| 调用构造 | 必须放在首行 | 必须放在首行 |
| 调用方法(函数) | this.方法,从本类中查找 | super.方法,从父类中查找 |
| 其他 | this表示当前对象 | super表示父类,但不是父类实例 |
资料: 《Java中super的几种用法并与this的区别》 http://blog.csdn.net/anmei2010/article/details/4093118
三、构造器
1. 构造方法的特征 与类名相同它具有与类相同的名称
它不含返回值类型的定义
它不能在方法中用return语法返回一个值 *每个类没有显示写出构造器,会默认产生一个无参构造。 *如果是子类的话,默认的无参构造包含一个super()方法。 *如果显示的写出一个有参构造,不会产生默认的无参构造。 *父类仅有有参构造,子类必须构造中显示调用
四、初始化
class Insect {
private int t = printInit("init SuperClass not static attribute");
private int i = 9;
protected int j;
Insect() {
System.out.println("execute SuperClass constructor.");
System.out.println("i = " + i);
System.out.println("j = " + j +"\n --初始化父类,先初始非静态变量后构造方法\n");
j = 39;
}
private static int x1 = printInit("init SuperClass static attribute");
static int printInit(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = printInit("init SubClass not static attribute");
public Beetle() {
System.out.println("execute SubClass constructor.");
System.out.println("k = " + k);
System.out.println("j = " + j +"\n --初始化子类,先初始非静态变量后构造方法");
}
private static int x2 = printInit("init SubClass static attribute\n --首先以先父后子类顺序初始化static变量结束\n");
public static void main(String[] args) {
System.out.println("init SubClass constructor\n --下面new Beetle()开始调用子类构造器\n");
Beetle b = new Beetle();
}
}
输出结果:
init SuperClass static attribute init SubClass static attribute --首先以先父后子类顺序初始化static变量结束 init SubClass constructor --下面new Beetle()开始调用子类构造器 init SuperClass not static attribute execute SuperClass constructor. i = 9 j = 0 --初始化父类,先初始非静态变量后构造方法 init SubClass not static attribute execute SubClass constructor. k = 47 j = 39 --初始化子类,先初始非静态变量后构造方法
结论: 1. 先初始化所有父类子类static属性、先后顺序按继承体系先初始化父类static属性,再初始化子类static属性。 2. 再依照继承体系,由上(父类)至下(子类)逐层进行初始化。 3. 每一层都是先初始化当前所有属性、再调用当前构造器。
五、清理
与初始化顺序相反,先执行子类dispose方法在执行父类dispose方法六、final
| 放置位置 | 细分 | 描述 |
|---|---|---|
| 属性 | 基础类型 | 永远不变 |
| 引用类型 | 指向对象的引用不能改变,但是其指向的对象本身可以改变。数组也是如此。 | |
| 空白final | 未初始化,确保使用前初始化 必须在构造中初始化,IDE会自动提示 |
|
| 方法 | 方法内容不会被修改。 不能被覆盖,可以继承。 可以调用的方法不能修改其功能。 |
|
| 类 | 类不会被继承。 所有域隐士定义为final |
《Java关键字final、static使用总结》
http://lavasoft.blog.51cto.com/62575/18771/
七、参考资料:
《Java 编程思想 4》