继承
目录
继承的概念
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
class 父类 {
}
class 子类 extends 父类 {
}
public class Animal {
private String name;
private int id;
public Animal(String myName, int myid) {
//初始化属性值
}
public void eat() { //吃东西方法的具体实现 }
public void sleep() { //睡觉方法的具体实现 }
}
public class Penguin extends Animal{
}
为什么需要继承
代码存在重复,导致代码量大且臃肿,而且维护性不高(主要表现是后期需要修改的时候,需要修改很多的代码,容易出错)。要从根本上解决这两段代码的问题,就需要继承。
继承的特性
- 子类拥有父类非 private 的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
继承的优点和缺点
优点
-
代码复用:
继承允许子类复用父类的代码,这避免了在多个类中编写重复代码的需要。如果多个类共享某些共同的行为或属性,可以通过将它们放在一个公共的父类中来实现。 -
扩展性:
子类可以在继承父类的基础上添加新的属性和方法,或者覆盖(Override)父类中的方法以实现不同的行为。这使得子类能够根据需要定制和扩展功能。 -
多态性:
继承是实现多态性的基础之一。多态性允许我们以统一的接口使用不同的对象,这些对象可以是同一类型的不同子类实例。 -
维护性:
当需要修改某个类的行为时,如果该类被其他多个类继承,则只需在父类中修改即可,而无需在每个子类中分别修改。这降低了维护成本,提高了代码的可维护性。
缺点
-
紧耦合:
继承可能导致类之间的紧耦合。如果子类过度依赖父类的实现细节,那么当父类发生变化时,子类可能会受到影响,这增加了代码的脆弱性。 -
层次结构僵化:
继承结构一旦确定,就很难在不破坏现有代码的情况下进行修改。例如,如果需要在两个不相关的类之间共享某些功能,但这两个类已经通过继承与其他类建立了关系,那么添加新的共享功能可能会变得复杂。 -
过度继承:
过度使用继承(如创建过深的继承层次结构)可能会导致代码难以理解和维护。此外,这也可能导致代码复用过度,因为子类可能会继承一些不需要的属性和方法。 -
限制了灵活性:
在某些情况下,使用组合(Composition)而不是继承可能更加灵活。组合允许对象在运行时动态地获得其他对象的行为和属性,而继承则是一种静态的、编译时的关系。 -
初始化顺序问题:
在复杂的继承结构中,子类对象的初始化可能依赖于父类对象的完全初始化。如果子类在父类完全初始化之前就尝试访问父类的某些资源或方法,可能会导致错误。