【JavaSE专栏63】多态,父类引用子类的对象,面向对象编程中的重要概念

简介: 【JavaSE专栏63】多态,父类引用子类的对象,面向对象编程中的重要概念

本文讲解了 Java 中面向对象多态的概念及语法,并给出了样例代码。多态是面向对象编程中的一个重要概念,它允许使用父类的引用变量来引用子类的对象,实现对不同子类对象的统一处理。


一、什么是多态

多态是面向对象编程中的一个重要概念,它允许使用父类的引用变量来引用子类的对象,实现对不同子类对象的统一处理

在 Java 中,多态性可以通过继承和方法的重写来实现。当一个父类引用变量指向一个子类对象时,可以通过这个父类引用变量调用子类中重写的方法。

多态性的好处在于它能够通过统一的父类接口,实现对不同子类对象的调用和处理,这样可以提高代码的灵活性、可扩展性和可维护性

举个例子,假设有一个动物类 Animal 和它的两个子类 Dog 和 Cat。

Animal类中有一个 eat() 方法,而 Dog 和 Cat 类中分别重写了这个方法。

通过多态性,可以使用 Animal 类型的引用变量来引用 Dog 或 Cat 对象,然后通过这个引用变量调用 eat() 方法,程序会根据实际引用的对象类型来自动选择相应的方法进行调用。

class Animal {
    public void eat() {
        System.out.println("Animal is eating.");
    }
}
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog is eating.");
    }
}
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("Cat is eating.");
    }
}
public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();
        animal1.eat();  // 输出: Dog is eating.
        animal2.eat();  // 输出: Cat is eating.
    }
}

在上面的例子中,animal1animal2 都是 Animal 类型的引用变量,但它们分别指向了 Dog 和 Cat 对象。虽然它们的类型是 Animal,但在运行时会根据实际引用的对象类型来调用相应的方法,实现了多态性。


二、为什么要多态

Java 中多态的存在有以下 5 55 个好处,请同学们认真学习。

  1. 灵活性:多态使得代码更加灵活和可扩展。通过使用父类的引用变量来引用不同子类的对象,可以实现对不同对象的统一处理,从而提高了代码的灵活性。
  2. 可替换性:多态性使得代码更具有可替换性。由于父类引用变量可以引用子类的对象,所以可以在不改变代码的情况下,替换成不同的子类对象,从而实现了代码的可替换性。
  3. 统一接口:多态性使得代码具有统一的接口。通过父类定义的接口和方法,可以在多个子类中共享,并且通过父类引用变量来调用这些方法,从而实现了代码的统一接口,使得程序设计更加规范和统一。
  4. 代码重用:多态性通过继承的机制实现了代码的重用。子类可以继承父类的属性和方法,从而避免了重复编写相同的代码,提高了代码的复用性。
  5. 扩展性:多态性使得代码更具有可扩展性。通过继承和重写父类的方法,子类可以在父类的基础上进行功能的扩展,添加新的属性和方法,从而实现了代码的扩展性。

通过合理地应用多态性,可以设计出结构清晰、可扩展、可维护的代码,提高开发效率和代码质量。多态性是面向对象编程中的一个重要特性,它能够提高代码的灵活性和可扩展性,使得程序设计更加符合面向对象的原则。


三、如何进行多态

在 Java 中,实现多态的基础是继承和方法的重写,下面是一个简单的示例代码来说明多态的实现,请同学们认真学习。

// 父类 Animal
class Animal {
    public void eat() {
        System.out.println("Animal is eating.");
    }
}
// 子类 Dog
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog is eating.");
    }
}
// 子类 Cat
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("Cat is eating.");
    }
}
public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog(); // 父类引用指向子类对象
        Animal animal2 = new Cat(); // 父类引用指向另一个子类对象
        animal1.eat(); // 调用重写后的方法,输出:Dog is eating.
        animal2.eat(); // 调用重写后的方法,输出:Cat is eating.
    }
}

在上面的示例中,Animal 是父类,而 Dog 和 Cat 是子类。父类 Animal 中有一个 eat() 方法,而子类 Dog 和 Cat 分别重写了这个方法。

在 Main 类的 main() 方法中,通过Animal类型的引用变量 animal1animal2 来引用 Dog 和 Cat 对象。

animal1animal2 虽然是 Animal 类型的引用变量,但它们指向的实际上是 Dog 和 Cat 对象。

当调用 animal1.eat()animal2.eat() 时,由于这两个引用变量分别指向了不同的子类对象,所以会根据实际引用的对象类型来调用相应的重写方法。

这就是多态的体现,同一个方法调用可以根据不同的对象类型执行不同的实现,实现了代码的灵活性和可扩展性。


四、多态和封装、继承的联系

在 Java 中,多态、封装和继承是面向对象编程的三个重要特性,它们之间存在密切的联系和互相支持的关系。

  1. 继承和多态
  • 继承是通过创建一个新类,从现有的类派生出新类,新类继承了现有类的属性和方法。子类可以重写父类的方法,实现自己的特定逻辑,这就是多态的体现。
  • 多态是指同一个方法调用可以根据对象的不同类型执行不同的实现。通过继承和方法的重写,可以在父类引用变量中引用不同子类对象,实现对不同对象的统一处理。
  1. 封装和继承
  • 封装是将数据和方法封装在一个类中,对外部隐藏实现细节,只提供公共接口供其他类访问。
  • 继承可以继承父类的属性和方法,子类可以直接使用父类的公共接口,不需要知道具体实现细节,实现了封装的特性。
  1. 多态和封装
  • 多态性通过父类定义的接口和方法,使得不同子类对象可以通过父类引用变量来调用相同的方法。
  • 封装将数据和方法封装在类中,对外部隐藏实现细节,通过提供公共接口来访问类的功能。多态性使得对外部调用者来说,无需关心具体的实现,只需要使用公共接口调用方法。

所以多态、封装和继承是面向对象编程中的三个重要特性,它们相互关联、相互支持,共同构成了面向对象编程的基础。多态性通过继承和方法的重写实现,封装通过隐藏实现细节保护数据和方法,继承则通过子类继承父类的属性和方法来重用代码和扩展功能。


五、多态的面试题

一、什么是多态?

多态是面向对象编程的一个重要概念,指的是同一个方法调用可以根据对象的不同类型执行不同的实现。具体来说,通过继承和方法重写,子类可以重写父类的方法,并且通过父类引用变量来引用不同子类的对象,实现对不同对象的统一处理。

二、多态的实现方式有哪些?

在 Java 中,多态可以通过以下方式实现。

  • 继承:子类继承父类的属性和方法,并且可以重写父类的方法,实现不同的行为。
  • 方法重写:子类可以重写父类的方法,即在子类中重新定义方法的实现逻辑。
  • 接口实现:一个类实现一个或多个接口,通过接口引用变量来调用实现类的方法。

三、态的好处是什么?

多态具有以下几个好处。

  • 灵活性:通过多态,代码更加灵活和可扩展,可以根据实际需求来替换或添加新的对象,而不需要改变现有的代码。
  • 可替换性:通过多态,同一个父类引用变量可以引用不同子类的对象,实现了代码的可替换性。
  • 统一接口:通过多态,可以定义一个统一的接口和方法,实现了不同对象的统一操作,提高了代码的规范性和可维护性。
  • 代码重用:通过继承和多态,可以重用父类的属性和方法,避免了重复编写相同的代码。
  • 扩展性:通过多态,可以在子类中添加新的属性和方法,实现了代码的扩展性。

四、请举一个多态的例子。

一个常见的多态例子是动物类和它的子类,比如猫类和狗类。可以定义一个 Animal 类作为父类,拥有一个 eat() 方法。然后再定义猫类和狗类作为子类,分别重写 eat() 方法。通过父类引用变量来引用猫类和狗类的对象,并调用 eat() 方法,可以实现不同动物对象的不同行为。


六、总结

本文讲解了 Java 中面向对象多态的概念及语法,并给出了样例代码,在下一篇博客中,将讲解 Java 抽象类和接口的知识点。


相关文章
|
3月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
5月前
|
Java
深入理解Java中的类与对象:封装、继承与多态
深入理解Java中的类与对象:封装、继承与多态
|
7月前
面向对象编程:类、对象、继承与多态
面向对象编程:类、对象、继承与多态
46 0
|
存储 设计模式 编译器
【继承与多态常见面试题】建议收藏
【继承与多态常见面试题】建议收藏
146 0
|
7月前
|
编译器 C++
继承和多态中的常见面试题(二)
继承和多态中的常见面试题(二)
|
7月前
|
Java 编译器
【JAVA面向对象编程】--- 探索子类如何继承父类
【JAVA面向对象编程】--- 探索子类如何继承父类
43 0
|
安全 Java 编译器
教你精通JavaSE之第八章、继承和多态
前提:必须在子类中使用,才能调用父类的属性或行为1. super . 成员变量2. super . 成员方法3. super ( ) 调用父类的构造方法。
49 0
|
安全 Java 编译器
《JavaSE-第九章》之继承与多态
《JavaSE-第九章》之继承与多态
|
Java 程序员
JavaSE/封装、继承、多态
JavaSE/封装、继承、多态
|
Java
java学习第十三天笔记-面向对象244-子类能继承父类的那些内容3成员方法是否被继承
java学习第十三天笔记-面向对象244-子类能继承父类的那些内容3成员方法是否被继承
77 0
java学习第十三天笔记-面向对象244-子类能继承父类的那些内容3成员方法是否被继承