标签:原因 私有 bre 这一 获得 map protected 成本 anim
1)Java语言不支持类的多重继承,也就是说,一个子类做多只能有一个父类 。如果要想实现多重继承,只能通过接口的多重继承来实现。
2)子类只能继承父类的非私有(public、protected)的成员变量和方法。
3)当子类中定义的成员变量与父类中的成员变量重名时,子类中的成员变量会覆盖父类中的成员变量,而不是继承父类中的成员变量。
4)当子类中的方法签名与父类中的方法签名相同(重名)时(前提是个数相同、方法类型相同),子类会覆盖父类中的方法,也不会继承。
给父类增加了一个方法A,这时子类与父类之间就可能越来越脱离is-a
举个例子:比如,鸟类有羽毛等属性,这里有一个需求是,定义一个有羽毛的鸡类,采用继承的方法很优雅也很方便,直接一个extends 就可以实现,但是如果有一天,这个鸟类添加了一个飞翔的公有方法,此前继承了鸟类的鸡类会自动继承了这个方法,鸡会飞翔?顶多就是矮距离飞跃。此时给鸡飞的方法就是破坏了鸡的封装性,鸡不应该有此方法。此时的鸡已经和有飞翔行为的鸟类之间不是is-a 关系了。
继承紧耦合体现在父类变就会影响子类,此时子类如果因此需要修改,重构的难度可能会很高。
继承树深度加深,结构越复杂。
组合是一种较弱的关系,是has-a的关系,给个代码:
1 public class Animal { 2 private void beat(){ 3 System.out.println("心脏跳动..."); 4 } 5 public void breath(){ 6 beat(); 7 System.out.println("呼吸中..."); 8 }
1 public class Bird { 2 //将Animal作为Bird的成员变量 3 private Animal a; 4 public Bird(Animal a){ 5 this.a = a; 6 } 7 public void breath(){ 8 a.breath(); 9 } 10 public void fly(){ 11 System.out.println("我在飞.."); 12 } 13 14 public static void main(String[] args){ 15 Animal animal = new Animal(); 16 Bird b = new Bird(animal); 17 b.breath(); 18 b.fly(); 19 } 20 }
标签:原因 私有 bre 这一 获得 map protected 成本 anim
原文地址:https://www.cnblogs.com/qiaoxin11/p/12543537.html