Java面试题:请解释Java中的继承和多态?

时间:2024-03-26 22:41:09

一、请解释Java中的继承和多态?
Java中的继承(Inheritance)和多态(Polymorphism)是面向对象编程(OOP)的两大基本特性,它们允许开发者创建灵活、可扩展的代码。

继承

继承是一种允许一个类(子类)继承另一个类(父类)的属性和行为的机制。子类会继承父类的所有公有(public)和受保护(protected)成员,但不会继承父类的私有(private)成员。继承的目的是为了代码的复用,减少冗余代码。
Java中的继承是通过使用 extends 关键字来实现的。子类会继承父类的所有非私有成员,包括方法和方法体,也可以覆盖(override)父类的方法。

// 父类
public class Animal {
    public void makeSound() {
        System.out.println("Animal makes a sound");
    }
}
// 子类
public class Dog extends Animal {
    // 子类可以覆盖父类的方法
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}
public class TestInheritance {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();
        
        myAnimal.makeSound(); // 输出: Animal makes a sound
        myDog.makeSound();    // 输出: Dog barks
    }
}

多态

多态是指允许不同类的对象对同一消息做出响应的特性。换句话说,多态性允许一个接口(抽象类或接口)有多个实现(子类)。这意味着不同的对象可以被当作同一类型的对象来对待,并且可以通过指向其父类的引用来调用方法,从而实现运行时方法的分发。
Java中的多态可以通过方法重载(overloading)和方法重写(overriding)来实现。方法重载是指在同一个类中存在多个同名方法,但它们的参数列表不同。方法重写是指子类覆盖父类的同名方法。

// 接口
public interface Animal {
    void makeSound();
}
// 父类
public class Mammal implements Animal {
    @Override
    public void makeSound() {
        System.out.println("Mammal makes a sound");
    }
}
// 子类
public class Dog extends Mammal {
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}
public class TestPolymorphism {
    public static void main(String[] args) {
        Animal myMammal = new Mammal();
        Animal myDog = new Dog();
        
        myMammal.makeSound(); // 输出: Mammal makes a sound
        myDog.makeSound();    // 输出: Dog barks
        
        // 多态的例子
        Animal[] animals = new Animal[2];
        animals[0] = myMammal;
        animals[1] = myDog;
        
        for (Animal animal : animals) {
            animal.makeSound();
        }
        
        // 输出:
        // Mammal makes a sound
        // Dog barks
    }
}

在这个例子中,MammalDog 都是 Animal 类型的对象。尽管它们是不同的类,但它们都实现了 Animal 接口,并且都有 makeSound() 方法。当我们通过 Animal 类型的引用调用 makeSound() 方法时,MammalDog 对象会根据它们的实际类型执行相应的方法。这就是多态性的魅力,它允许我们编写更加通用和可扩展的代码。

相关文章