本文讲述上篇文章 《java 基础(第零篇)对象与类》 遗留的问题继承与组合的区别,在讲述区别之前。先讲述继承的有关概念,如果你对继承很清楚的可以直接拉到下面阅读继承与组合的区别。
继承是面向对象三大特性之一。子类继承父类的特征和行为,使得子类对象拥有父类的属性和方法。子类亦可扩展其自己的方法。
为了封装性,尽量隐藏对象的属性,会使用 private 关键字修饰,但是这样一来,如果这些属性除了对外隐藏外,还允许子类继承访问,那么 protected 关键字就派上用场了。
继承可以对父类的方法进行重写覆盖,而重载的概念并不是继承的一部分,重载是指类本身的方法通过参数表的不同进行重载,是编译时多态的实现方法。
举个栗子:
- public class A extends B{
- public void method(){
- }
- public void method(int a){
- }
- }
- public class B{
- public void method(){
- }
- }
上面的 A 类继承了 B 类,其中 void method 方法是父类 B 所拥有的,但是子类对其进行了重写覆盖,这就是重写。而 A 类中的 void method(int a); 则是 A 类的 method 方法进行重载。通过方法参数表进行区分重载。
另外,静态方法不能重写,因为重写指的是根据运行时对象的类型来决定调用哪个方法,而不是编译时的,类静态方法是编译时确定的,即使你在子类中定义了一个和父类一样的静态方法,编译器也不会报错,从多态的角度看,这并不是对静态方法的重写,而是子类自己的方法。
看个代码就知道了:
- public class Base {
- public static void staticMethod() {
- System.out.println("父类静态方法执行了..");
- }
- }
- public class Son extends Base {
- public static void staticMethod() {
- System.out.println("子类静态方法执行了..");
- }
- }
- /*测试类*/
- public class Test {
- public static void main(String[] args) {
- Base b = new Son();
- b.staticMethod(); //1.
- b = new Base();
- b.staticMethod(); //2.
- Son son = new Son();
- son.staticMethod(); //3.
- }
- }
运行结果:
运行结果
按照实例方法的重写的规律,如果该方法是重写,那么代码第一处的执行应该是执行子类的重写方法,但是事实却未如此。由此看来,子类中看似重写的静态方法实际上不算一种重写。
(1) 子类自动继承父类接口,在多态时很方便
(2) 创建子类时无需创建父类对象
缺点:(1) 继承破坏封装性
给父类增加了一个方法 A,这时子类与父类之间就可能越来越脱离 is-a
举个例子:比如,鸟类有羽毛等属性,这里有一个需求是,定义一个有羽毛的鸡类,采用继承的方法很优雅也很方便,直接一个 extends 就可以实现,但是如果有一天,这个鸟类添加了一个飞翔的公有方法,此前继承了鸟类的鸡类会自动继承了这个方法,鸡会飞翔?顶多就是矮距离飞跃。此时给鸡飞的方法就是破坏了鸡的封装性,鸡不应该有此方法。此时的鸡已经和有飞翔行为的鸟类之间不是 is-a 关系了。
(2) 继承是紧耦合:
继承紧耦合体现在父类变就会影响子类,此时子类如果因此需要修改,重构的难度可能会很高。
(3) 子类对父类的扩展往往会增加系统结构复杂度
继承树深度加深,结构越复杂。
(4) 不支持在运行时指定父类
(5) 子类不能改变父类的接口
什么是组合?给个代码
- public class A {
- public void a1() {}
- public void a2() {}
- }
- public class B {
- private A a = new A();
- public void a1() {
- a.a1();
- }
- public void a2() {
- a.a2();
- }
- }
其中 B 类对 A 类这种复用的形式就是组合,这个是通过包装和方法转发实现的。
接下来讲述组合优缺点
优点这应该才是我们关心的问题吧。
在以下几种情况使用组合:
什么时候使用继承?
另外:
组合优于继承是面向对象设计原则之一
但我觉得也不能像滥用继承一样,一味地使用组合,该用继承的时候还是继承为佳。
以上是个人看法,可能不完全对,如有误,欢迎指教。
来源: http://www.jianshu.com/p/d345d1bc7e4a