Java 继承
Java继承是面向对象编程(OOP)中的一个基本特性。Java 中的继承允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码重用和层次化设计。通过继承,子类可以继承父类的公有方法和属性,并且可以覆盖父类的方法或扩展新的方法。
Java 继承的基本结构如下:
class Parent {
// 父类的属性和方法
}
class Child extends Parent {
// 子类可以继承父类的属性和方法,也可以定义自己的属性和方法
}
1. 继承的基本语法
在 Java 中,子类使用 extends 关键字来继承父类。
class Animal {
void sound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
void sound() {
System.out.println("狗叫:汪汪");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound(); // 调用子类中的 sound() 方法
}
}
输出:
狗叫:汪汪
2. 继承的特点
- 继承父类的成员变量和方法:子类继承父类的公有成员变量和方法,但不能继承父类的私有成员(
private)。 - 构造方法:子类不会继承父类的构造方法,但子类可以调用父类的构造方法。可以使用
super()来调用父类的构造方法。 - 方法覆盖(Overriding):子类可以覆盖(重写)父类的方法,从而改变或扩展父类的方法的行为。
- 方法重载(Overloading):子类可以通过定义多个方法名相同但参数不同的方法来实现方法的重载。
3. 使用 super 关键字
super():用来调用父类的构造方法,通常是子类构造方法的第一行代码。super.方法名():用来调用父类的方法。super.变量名:用来访问父类的成员变量。
3.1 调用父类的构造方法
子类可以通过 super() 来调用父类的构造方法。如果没有显式调用父类构造方法,编译器会自动调用父类的无参构造方法。
class Animal {
Animal() {
System.out.println("Animal 构造方法");
}
}
class Dog extends Animal {
Dog() {
super(); // 显式调用父类的构造方法
System.out.println("Dog 构造方法");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
}
}
输出:
Animal 构造方法
Dog 构造方法
3.2 调用父类的成员方法
如果子类覆盖了父类的方法,子类仍然可以使用 super 来调用父类的版本。
class Animal {
void sound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
void sound() {
super.sound(); // 调用父类的方法
System.out.println("狗叫:汪汪");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound();
}
}
输出:
动物发出声音
狗叫:汪汪
4. 方法覆盖(Overriding)
子类可以通过覆盖父类的方法来改变方法的实现。覆盖方法的签名必须与父类中的方法完全一致。
4.1 覆盖父类方法
子类通过相同的方法名、相同的参数列表来覆盖父类的方法。子类中的方法的访问修饰符可以与父类中的方法一致或更宽松(例如,如果父类方法是 protected,那么子类方法可以是 public),但不能更严格(例如,父类方法是 public,子类方法不能是 private)。
class Animal {
void sound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("狗叫:汪汪");
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
animal.sound(); // 调用 Dog 类的 sound() 方法
}
}
输出:
狗叫:汪汪
4.2 方法覆盖与多态
通过父类引用指向子类对象时,调用的方法是子类的覆盖方法(如果子类覆盖了父类的方法),这就是多态。
class Animal {
void sound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("狗叫:汪汪");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("猫叫:喵喵");
}
}
public class Test {
public static void main(String[] args) {
Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();
myAnimal.sound(); // 输出 "动物发出声音"
myDog.sound(); // 输出 "狗叫:汪汪"
myCat.sound(); // 输出 "猫叫:喵喵"
}
}
输出:
动物发出声音
狗叫:汪汪
猫叫:喵喵
5. 构造方法和继承
- 子类不能继承父类的构造方法,但可以通过
super()调用父类的构造方法。 - 如果父类没有无参构造方法,则子类必须显式调用父类的构造方法。
class Animal {
Animal(String name) {
System.out.println("动物的名字是:" + name);
}
}
class Dog extends Animal {
Dog(String name) {
super(name); // 调用父类的带参构造方法
System.out.println("狗的名字是:" + name);
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog("旺财");
}
}
输出:
动物的名字是:旺财
狗的名字是:旺财
6. 父类的访问权限
private:父类中的私有属性和方法不能被子类继承和访问。protected:父类中的保护属性和方法可以被子类继承,且可以在子类中访问。public:父类中的公共属性和方法可以被子类继承,并可以在任何地方访问。
7. 多重继承问题
Java 不支持类的多重继承(即一个类不能继承多个类)。这是为了避免出现菱形继承问题(多个父类之间方法冲突)。
但是,Java 支持接口的多重继承。一个类可以实现多个接口。
总结
- 继承是面向对象编程的一个核心特性,子类可以继承父类的成员(方法和属性),并可以重写或扩展父类的功能。
super关键字用于调用父类的构造方法或父类的方法。- 方法覆盖(Overriding)使得子类可以改变父类方法的实现,从而实现多态。
- Java 不支持类的多重继承,但支持接口的多重继承。
更多详细内容请关注其他相关文章!