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