一、简介
在 Java 中,继承是面向对象编程的一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。继承使用 extends
关键字来实现,通过继承,子类可以复用父类的代码,同时还可以扩展或覆盖父类的功能。
主要优点:
代码复用
:子类可以直接使用父类的属性和方法,减少了代码的重复编写;扩展功能
:子类可以在继承父类的基础上添加新的属性和方法,或者重写父类的方法来实现特定的行为。
二、访问父类的属性和方法
创建动物类
// 动物类
public class Animal {
// 属性
protected String name;
// 方法
public void eat(String name) {
System.out.println(name + "正在吃东西");
}
}
创建动物类的子类
// 狗类
public class Dog extends Animal{
public static void main(String[] args) {
// 创建对象
Dog dog = new Dog();
// 访问父类的属性
dog.name = "中华田园犬";
// 访问父类的方法
dog.eat(dog.name);
}
}
运行结果:
中华田园犬正在吃东西
三、访问父类的构造器
子类通过使用 super
关键字来调用父类的构造方法,根据参数来调用具体的构造方法:
创建父类
// 动物类
public class Animal {
// 属性
protected String name;
// 无参构造
public Animal() {
}
// 有参构造
public Animal(String name) {
this.name = name;
System.out.println("父类的有参构造执行了");
}
}
创建子类
// 狗类
public class Dog extends Animal {
// 有参构造
public Dog() {
}
// 无参构造
public Dog(String name) {
super(name);
System.out.println("子类的有参构造执行了");
}
public static void main(String[] args) {
// 创建对象时,会根据传入的参数执行当前对象的构造方法
new Dog("土狗");
}
}
运行结果:
父类的有参构造执行了
子类的有参构造执行了
四、重写父类方法
创建父类
// 动物类
public class Animal {
// 方法
public void eat() {
System.out.println("父类的 eat() 方法");
}
}
创建子类
public class Dog extends Animal {
// 重写父类方法
@Override
public void eat() {
System.out.println("子类的 eat() 方法");
}
public static void main(String[] args) {
// 创建对象
Dog dog = new Dog();
// 调用方法
dog.eat();
}
}
运行结果:
子类的 eat() 方法
五、总结
注意事项:
-
访问修饰符
:父类中成员使用不同的访问修饰符,会影响子类对父类成员的访问权限。private 成员不能在子类中直接访问,protected 成员可以在子类中访问,public 成员则在任何地方都能访问。 -
方法重写
:子类重写父类方法时,方法的签名(包括方法名、参数列表和返回类型)必须与父类中被重写的方法完全相同,并且重写的方法访问权限不能比父类中被重写的方法更严格,例如父类方法是 public ,子类重写的方法不能是 protected 或 private 。 -
构造方法
:子类的构造方法在执行时会默认先调用父类的无参构造函数,如果父类没有无参构造函数,需要在子类构造方法中通过 super 显式调用父类的有参构造函数。 -
final关键字
:如果父类的方法被声明为 final ,则子类不能重写该方法。如果类被声明为 final ,则不能被继承。 -
多态性
:继承与多态紧密相关,在使用父类引用指向子类对象时,调用重写的方法会根据实际对象的类型执行相应子类的方法实现。
通过继承,你可以构建层次化的类结构,这有助于组织代码,避免重复代码,以及创建更复杂和可维护的系统架构。