掌握类的继承和extends关键字的使用方法与最佳实践
继承是面向对象编程的核心特性之一,它允许一个类(子类)获得另一个类(父类)的属性和方法。通过继承,我们可以实现代码复用、扩展功能和建立类之间的层次关系。
public class Dog extends Animal {
// Dog类继承了Animal类的所有非私有成员
}
@Override
public void makeSound() {
System.out.println("汪汪汪!");
}
public Dog(String name, int age) {
super(name, age, "犬科");
// 调用父类构造方法
}
不同的访问修饰符决定了子类对父类成员的访问权限:
修饰符 | 同一类 | 同一包 | 子类 | 其他包 |
---|---|---|---|---|
public | ✓ | ✓ | ✓ | ✓ |
protected | ✓ | ✓ | ✓ | ✗ |
default | ✓ | ✓ | ✗ | ✗ |
private | ✓ | ✗ | ✗ | ✗ |
在继承关系中,构造方法的调用遵循特定的顺序:
public class Animal {
public Animal() {
System.out.println("Animal构造方法被调用");
}
}
public class Dog extends Animal {
public Dog() {
super(); // 隐式调用,可以省略
System.out.println("Dog构造方法被调用");
}
}
// 创建Dog对象时的输出:
// Animal构造方法被调用
// Dog构造方法被调用
让我们通过一个完整的动物继承体系来理解继承的实际应用:
public class Animal {
protected String name;
protected int age;
protected String species;
public Animal(String name, int age, String species) {
this.name = name;
this.age = age;
this.species = species;
}
public void eat() {
System.out.println(name + "正在吃东西...");
}
public void makeSound() {
System.out.println(name + "发出了声音");
}
public String getInfo() {
return String.format("动物信息: 名称=%s, 年龄=%d岁, 种类=%s",
name, age, species);
}
}
public class Dog extends Animal {
private String breed;
public Dog(String name, int age, String breed) {
super(name, age, "犬科"); // 调用父类构造方法
this.breed = breed;
}
@Override
public void makeSound() {
System.out.println(name + "汪汪汪!");
}
@Override
public void eat() {
System.out.println(name + "正在吃狗粮,摇着尾巴很开心!");
}
// 子类特有的方法
public void wagTail() {
System.out.println(name + "开心地摇尾巴!");
}
@Override
public String getInfo() {
return super.getInfo() + ", 品种=" + breed;
}
}