Java——继承
一、继承是什么?
继承是Java面向对象编程的核心特性,允许子类(派生类)继承父类(基类/超类)的属性和方法,形成类层次结构。子类通过extends
关键字继承父类,实现代码复用和扩展。
核心要点:
- 关系模型:符合
is-a
关系(如Dog
是Animal
)1。 - 继承内容:非私有(非
private
)的属性和方法10。 - 单继承限制:Java类只能直接继承一个父类,但可通过接口实现多继承111。
示例:
class Animal { // 父类
void eat() { System.out.println("Eating..."); }
}
class Dog extends Animal { // 子类
void bark() { System.out.println("Barking..."); }
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 继承父类方法
dog.bark(); // 子类扩展方法
}
}
二、继承怎么用?
1. 语法与步骤
- 使用
extends
关键字:子类声明继承父类。 - 构造方法调用:
- 子类构造方法默认调用父类无参构造(隐式
super()
)。 - 若父类没有无参构造,需显式调用
super(参数)
,且必须为构造方法的第一行38。
- 子类构造方法默认调用父类无参构造(隐式
示例:
class Parent {
Parent(int x) { System.out.println("Parent构造方法"); }
}
class Child extends Parent {
Child() {
super(10); // 显式调用父类有参构造
System.out.println("Child构造方法");
}
}
2. 方法重写(Override)
- 规则:子类方法名、参数列表、返回类型与父类相同,访问权限不能更严格8。
- 使用
@Override
注解:增强可读性并触发编译器检查。
示例:
class Animal {
void sound() { System.out.println("动物叫声"); }
}
class Cat extends Animal {
@Override
void sound() { System.out.println("喵喵~"); } // 重写父类方法
}
3. super
关键字
- 用途:
- 调用父类方法:
super.methodName()
。 - 访问父类属性:
super.fieldName
8。
- 调用父类方法:
三、继承的用途
- 代码复用:避免重复编写公共代码(如多个类共享
name
和id
属性)15。 - 扩展功能:子类可添加新方法或重写父类方法(如
Dog
类扩展bark()
方法)6。 - 多态支持:父类引用指向子类对象,实现运行时动态绑定8。
- 层次化管理:构建清晰的类层次结构(如
动物 → 哺乳动物 → 狗
)7。
四、关键细节与注意事项
-
访问权限:
- 子类无法直接访问父类的
private
成员,需通过公有方法(如getter/setter
)间接访问310。 protected
成员允许子类跨包访问8。
- 子类无法直接访问父类的
-
构造方法顺序:
- 父类构造方法先于子类执行3。
- 多层继承时,构造方法按继承链从上到下依次调用8。
-
避免滥用继承:
- 优先使用组合(has-a关系)而非继承,仅在符合
is-a
关系时使用6。 - 过深的继承层次会增加代码耦合度10。
- 优先使用组合(has-a关系)而非继承,仅在符合
-
final
关键字限制:final
修饰的类不可被继承,方法不可被重写,变量不可被修改8。
-
接口与抽象类:
- 接口(
implements
)支持多继承,定义行为规范;抽象类(extends
)提供部分实现11。
- 接口(
五、典型问题与解决方案
Q1:如何解决父类没有无参构造的问题?
答案:子类构造方法中必须显式调用父类有参构造super(参数)
3。
Q2:子类能否继承父类的静态方法?
答案:可以继承,但不能重写(静态方法属于类,不存在多态性)8。
Q3:如何实现类似“多继承”的功能?
答案:通过接口实现多继承(如class C implements A, B
)111。
参考资料
- 1 菜鸟教程 - Java继承基础概念与示例
- 3 CSDN - 继承的使用方法与构造方法调用
- 57 继承的作用与设计原则
- 810 继承的细节与限制
- 11 接口与继承的区别