📅  最后修改于: 2023-12-03 15:02:06.927000             🧑  作者: Mango
在Java中,多态是一种非常常见的概念。它是面向对象程序设计中的一个非常重要的特性。
Java中的多态主要有两种形式:编译时多态和运行时多态。在这篇文章中,我们将会详细介绍这两者之间的区别。
编译时多态也被称为静态多态,它是指在编译时就确定了方法或函数的调用。因为Java是静态类型语言,所以在编译时就可以确定每个变量的类型。因此,编译器可以根据变量声明的类型,来决定具体执行哪个方法或函数。
编译时多态的特点:
例如:
public class Dog {
public void bark() {
System.out.println("汪汪汪!");
}
}
public class Labrador extends Dog {
@Override
public void bark() {
System.out.println("旺旺旺!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Labrador();
dog.bark();
}
}
在以上例子中,编译时多态是通过变量声明类型 Dog dog
,来确定调用 Dog
或 Labrador
类中的 bark()
方法。
运行时多态也被称为动态多态,它是指在程序运行时才能确定具体调用哪个方法或函数。在Java中,运行时多态是通过继承和方法重写来实现的。
运行时多态的特点:
例如:
public class Animal {
public void speak() {
System.out.println("动物发出声音!");
}
}
public class Cat extends Animal {
@Override
public void speak() {
System.out.println("猫发出'喵喵'声!");
}
}
public class Dog extends Animal {
@Override
public void speak() {
System.out.println("狗发出'汪汪'声!");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Cat();
animal.speak();
animal = new Dog();
animal.speak();
}
}
在以上例子中,至始至终只有一个对象被创建,而且它是由 Animal
类型的变量 animal
引用的。因此,当我们在运行时尝试调用 speak()
方法时,具体该调用哪个方法只有在程序运行时才会被确定。具体来说,当 animal
指向 Cat
对象时,调用的是 Cat
类中的 speak()
方法,而当 animal
指向 Dog
对象时,调用的是 Dog
类中的 speak()
方法。
多态是Java中非常重要的概念,它使得我们可以以一种更加抽象和灵活的方式来组织和设计程序。通过理解编译时多态和运行时多态之间的区别,我们可以更加深入地理解多态的本质,并在实践中更加熟练地使用多态。