类的复用
类的复用有两种方式:组合和继承。一种是通过new对象使用类里面的方法达到复用类的效果。第二种是直接把类的东西搬过来作为自己类的一部分。
继承
继承后的类new出来的对象不是一个简单的对象,其实它包含了基类的对象作为子对象。导致这个现象的原因是继承基类的时候会继承基类的构造函数(默认是继承基类的无参构造函数,如果没有要super显示的继承基类的构造函数且必须放在子类构造函数的“第一行”。),而构造函数是用来new出对象的。具体看下面代码。
package E;
public class A {
A() {
System.out.println("wewe");
}
}
package E;
public class B extends A {
B(int i) {
System.out.println("asd");
}
public static void main(String[] args) {
B b = new B(1);
}
}
/*output:
"wewe"
"asd"
*/
这说明子类默认继承了基类的无参构造函数。当父类没有手动构建无参构造函数时子类会报错。总之子类要继承父类的构造函数不是默认继承无参构造函数就是显示继承有参构造函数。
代理
java并没对代理提供直接支持,但是自己可以手动实现。代理是指不直接用该类来创建对象,而是使用另外一个类产生一个对象,这个类里面使用了组合来间接的复用原始类,可以不用代理所有方法,从而达到不暴露直接类的目的。如下代码:
package S;
public class C {
public void test1() {
System.out.println("C");
}
}
package S;
public class D {
private C c = new C();
public void test2() {
c.test1();
}
}
继承和组合怎么选择
由于类是为了构建对象用的,如果是继承那么子类对象是包含父类对象的,如果是组合那么组合成的对象就是一个组合体。比如“图形类”就是长方形类的父类,而构建一个“车对象”就要组合“引擎对象”、“轮子对象”、“窗户对象”等。该怎么选择是可以通过常识来判断的。