Java 复用类

2014-11-24 07:48:23 · 作者: · 浏览: 0


一、复用工具

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》