📜  Java编译时和运行时多态的区别(1)

📅  最后修改于: 2023-12-03 15:02:06.927000             🧑  作者: Mango

Java编译时和运行时多态的区别

在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 ,来确定调用 DogLabrador 类中的 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中非常重要的概念,它使得我们可以以一种更加抽象和灵活的方式来组织和设计程序。通过理解编译时多态和运行时多态之间的区别,我们可以更加深入地理解多态的本质,并在实践中更加熟练地使用多态。