Java 基础教程

多态(Polymorphic)

Java 多态是指同一个方法名可以在不同的类中具有不同的实现方式。具体来说,多态是通过继承和方法重写来实现的。

多态的作用

提高代码的灵活性和可扩展性

通过使用多态,可以编写出更通用的代码,可以处理不同类型的对象,而不需要针对每个具体的子类编写特定的代码。这样可以减少代码的重复性,提高代码的可维护性和可扩展性。

实现接口的统一

多态使得不同的对象可以通过相同的接口进行交互。这样就可以定义一组通用的接口,而不需要关心具体的对象类型。这样可以提高代码的可读性和可维护性。例如:

// 动物基础类
public class Animal {
   //...
}

// 动物狗类
public class Dog extends Animal {
   //...
}

// 动物猫类
public class Cat extends Animal {
   //...
}

如果此时有一个方法,定义如下:

public void sound(Animal animal) {
   // animal
}

上面代码中,sound() 方法接收一个 Animal 类,而 Animal 就是动物的通用接口。

实现方法的重写和覆盖

多态允许子类重写父类的方法,从而可以在不同的子类中实现不同的行为。这样可以根据实际需要,为每个子类定制特定的行为。

实现运行时绑定

多态的一个重要特性是运行时绑定,也称为动态绑定。在运行时,程序会根据对象的实际类型来调用对应子类中的方法。这样可以根据对象的实际情况,动态地确定调用哪个方法,实现更灵活的代码执行。

多态有两个概念

在 Java 中,多态有两个重要的概念:父类引用指向子类对象和方法重写。

父类引用指向子类对象

通过父类引用指向子类对象,我们可以在不知道具体子类类型的情况下,调用子类的方法。

具体来说,当一个父类引用指向一个子类对象时,可以通过这个父类引用调用子类中重写的方法。这样做的好处是在编写代码时,可以更加灵活地处理不同类型的对象,提高代码的可扩展性和复用性。

例如:

// 动物基础类
public class Animal {
   public void sound() {
       System.out.println("动物发出声音");
   }
}

// 动物:狗
public class Dog extends Animal {
   @Override
   public void sound() {
       System.out.println("狗叫:汪汪汪");
   }
}

// 动物:猫
public class Cat extends Animal {
   @Override
   public void sound() {
       System.out.println("猫叫:喵喵喵");
   }
}

public class Main {
   public static void main(String[] args) {
       // animal1 和 animal2 变量均为 Dog 和 Cat 的父类类型变量,但是实际指向具体子类
       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       animal1.sound(); // 输出:狗叫:汪汪汪
       animal2.sound(); // 输出:猫叫:喵喵喵
   }
}

在上面的代码中,Animal 类是父类,Dog 和 Cat 类是其子类。在 main 方法中,animal1 和 animal2 分别是 Animal 类的引用,但分别指向了 Dog 和 Cat 类的对象。当调用animal1.sound() 和 animal2.sound() 时,实际上会根据对象的实际类型来调用对应子类中的 sound 方法,输出不同的结果。

方法重写

方法重写则是指子类可以重写父类的方法,使得同一个方法名可以有不同的实现。例如:

// 动物基础类
public class Animal {
   public void sound() {
       System.out.println("动物发出声音");
   }
}

// 动物:猫
public class Cat extends Animal {
   @Override
   public void sound() {
       // 重写父类 sound() 方法
       System.out.println("猫叫:喵喵喵");
   }
}

public class Main {
   public static void main(String[] args) {
       Animal animal1 = new Animal();
       Animal animal2 = new Cat();
       animal1.sound(); // 输出:动物发出声音
       animal2.sound(); // 输出:猫叫:喵喵喵
   }
}

在上面代码中,Animal 类是父类,Cat 类是其子类。在 main 方法中,animal1 和 animal2 分别是 Animal 类的引用,但是 animal1 指向 Animal 对象,animal2 指向 Cat 对象。当调用 animal1.sound() 将调用 Animal 类的 sound() 方法。而,animal2.sound() 将调用其子类 Cat 的 sound 方法。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号