您的位置:首页 > 编程语言 > Java开发

java之继承与组合

2016-10-03 16:07 225 查看
1.Question:有没有听说过组合优于继承这样的说法?如果有听说过,那么你是怎么理解的?

继承是一种多态工具,而不是一种代码复用工具。有些开发者喜欢用继承的方式来实现代码复用,即使在没有多态的情况下。

在什么时候使用继承呢?只能在类之间有“父子”关系的情况下使用

a.不要仅仅为了代码的复用而继承。当你使用组合来实现代码的复用时,是不会产生继承关系的。过度使用继承的话,如果修改了父类,会损坏所有的子类。这是因为子类和父类的紧耦合关系是在编译期产生的。

b.不要仅仅为了多态而继承。如果你的类间没有继承关系,并且你想要实现多态,那么你可以通过接口和组合的方式来实现,这样不仅可以实现代码的重用,同时也可以实现运行时的灵活性。

c.继承——发生在编译时,因为它是静态的

   代理或是组合——发生在运行时,因为它更具有动态性和灵活性,类可以在运行时多态地根据一个结果有条件或者是无条件地进行组合。但是继承却是静态的。
2.你能通过实例来区别编译期继承还是运行时继承,以及Java支持哪种吗?
继承表示动作和属性从一个对象传递到另一个对象的场景。Java语言本身只支持编译期继承,它是通过“extends”关键字来产生子类的方式实现的。
public class Parent {
public String saySomething(){
return "Parent is called";
}
}
public class Child extends Parent{
@Override
public String saySomething() {
// TODO Auto-generated method stub
return super.saySomething()+",Child is called";
}
public static void main(String[] args){
Parent p = new Child();
System.out.println(p.saySomething());
}
}
“Child”类的saySomething()方法的调用会返回“Parent is called,Child is Called”,因为子类的调用继承了父类的“Parent is called”,关键字“super”是用来调用“Parent”的方法的。
运行时继承表示在运行时构建父/子类关系。Java语言本身不支持运行时继承,但是有一种替代的方案叫做“代理”或者是“组合”。这样就可以模拟运行时继承的实现。
组合的实现:
子类代理了父类的调用!
public class Child{
//创建一个父类的实例,通过这个实例来调用父类中的方法
private Parent p = null;
public Child(){
this.p = new Parent();
}
public String saySomething(){
return this.p.saySomething()+",Child is called";
}
public static void main(String[] args){
System.out.println(new Child().saySomething());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 继承 多态