继承和组合的选择
我们之前学过,继承是隐式的,组合是显示的,其实实际当中组合和继承都可以在新的类里面放他们的子对象。不过区别是,组合中成员对象一般都是private修饰的,但是为了让用户直接访问新类里面组合对象,就需要将组合的成员对象设置为public。

我们来看一个例子:
class E {
public void s(){}
public void r(){}
public void s(){}
}
class W {
public void i(int p){}
}
class WD {
public void ru(){}
public void rd(){}
}
class D {
public WD wd = new WD();
public void op(){}
public void cl(){}
}
public class C{
public E e = new E();
public W[] w = new W[4];
public D
l = new D(),
r = new D();
public C() {
for(int i = 0; i < 4; i++){
w[i] = new W();
}
}
public static void main(String[] args) {
C c = new C();
c.l.w.ru();
c.w.[0].i(60);
}
}
对于继承而已,我们一般可以把它当做公共类来用,也就是说导出类是专用类,基类是通用的公共类,也可以称为通用类。
如何使用protected关键字

protected关键字的访问权限是介于private和public之间的,比如有时候我们不想让类的用户访问某个成员,但是又想让导出类和同一个包里面的类访问,那么就可以使用protected关键字来实现。但是通常我们不建议用protected关键字来修饰类的成员,一般建议用private关键字来修饰,确保类属性的安全性,但是我们可间接使用protected方法来实现导出类和同一个包类的访问权限。
我们来举个例子看一下:
class V {
private String name ;
protected void set(String n){ name = n;}
public V (String name){ this.name = name}
public String toString(){
return “is ” + name;
}
}
public class C extends V{
private int or;
public C(String name, int or) {
super(name);
this.or = or;
}
public void change(String name,int or) {
set(name);
this.or = or;
}
public String toString(){
return “C ” + or+”: ” +super.toString();
}
public static void main(String[] args) {
C c = new C(“LL”,10);
print(c);
c.change(“B”,20);
print(c);
}
}
/*Output:
C 10: is LL
C 19: is B
通过这个例子我们可以看出,change()方法之所以可以调用方法set(),就是因为方法set()的访问权限是protected。
除此之外,而且我们还可以看出导出类C里面的toString()方法重写了基类的方法。
向上转型

继承的概念中,导出类可以看作是基类的一种类型。比如现在有一个乐器类I作为基类,还有一个吉他类J作为导出类,我们来看一下用这两个类来书写的例子,我们会理解的更加透彻:
class I {
public void play()
static void r(I i){
i.play();
}
}
public class W extends I {
public static void main(String[] args) {
W w = new W();
I.r(w);
}
}
在这个例子中我们看到,r()方法本应该传递一个I类型的参数,但实际却传递了一个W类型的参数,这很让人费解,但是也没有报错。其实这块进行了一个向上的转化,叫做向上转型,也就是说将W类型转为了I类型,是一个向上的过程。
向上转型是属于安全的转型,但是在转型的过程中,会丢失基类中没有的方法。与向上转型相反的就是向下转型,也就是基类或者叫通用类转为专用类或者叫导出类。
讲到这里,我们都知道,继承和组合都可以复用代码,但是什么时候使用继承,什么时候使用组合,这就需要分析一下,我们需要向上转型不,如果需要向上转型,就要使用继承,如果不需要向上转型,那就最好不要用继承。