这个单词多态性表示具有多种形式。简而言之, 我们可以将多态定义为消息以多种形式显示的能力。在本文中, 我们将看到两种类型的多态性之间的差异, 即编译时间和运行时间。
编译时多态:每当对象在编译时与其功能绑定时, 这就是所谓的编译时多态性。在编译时, java通过检查方法签名来知道要调用的方法。因此, 这称为编译时多态或静态或早期绑定。通过以下方式实现编译时多态方法重载。方法重载说, 在一个具有不同原型的类中, 你可以有多个具有相同名称的函数。函数重载是实现多态的方法之一, 但是它取决于我们采用哪种类型的多态。在Java中, 我们在运行时实现函数重载。以下是可以观察到编译时多态性的示例。
// Java program to demonstrate
// compile-time polymorphism
public class GFG {
// First addition function
public static int add( int a, int b)
{
return a + b;
}
// Second addition function
public static double add(
double a, double b)
{
return a + b;
}
// Driver code
public static void main(String args[])
{
// Here, the first addition
// function is called
System.out.println(add( 2 , 3 ));
// Here, the second addition
// function is called
System.out.println(add( 2.0 , 3.0 ));
}
}
输出如下:
5
5.0
运行时多态性:每当对象在运行时与功能绑定时, 这称为运行时多态。运行时多态可以通过以下方式实现方法覆盖.Java虚拟机确定在运行时而不是在编译时调用的正确方法。也称为动态或后期绑定。方法覆盖表示子类具有与父类中声明的方法相同的方法。这意味着, 如果子类提供其父类之一提供的方法的特定实现, 则称为方法重写。以下是可以观察到运行时多态的示例。
// Java program to demonstrate
// runtime polymorphism
// Implementing a class
class Test {
// Implementing a method
public void method()
{
System.out.println( "Method 1" );
}
}
// Defining a child class
public class GFG extends Test {
// Overriding the parent method
public void method()
{
System.out.println( "Method 2" );
}
// Driver code
public static void main(String args[])
{
Test test = new GFG();
test.method();
}
}
输出如下:
Method 2
下表说明了运行时多态和编译时多态之间的区别:
序号 | 编译时多态 | 运行时多态 |
---|---|---|
1 | 在"编译时多态"中, 调用由编译器解决。 | 在运行时多态中, 编译器不解决该调用。 |
2 | 也称为静态绑定, 早期绑定和重载。 | 也称为动态绑定, 后期绑定和覆盖。 |
3 | 方法重载是编译时的多态性, 其中一个以上的方法使用不同的参数或签名和不同的返回类型共享相同的名称。 | 方法覆盖是具有相同方法, 相同参数或签名但在不同类中关联的运行时多态性。 |
4 | 它是通过函数重载和操作符重载来实现的。 | 它是通过虚拟函数和指针实现的。 |
5 | 它提供了快速执行, 因为需要在编译时就早知道需要执行的方法。 | 与早期绑定相比, 它提供了较慢的执行速度, 因为在运行时已知需要执行的方法。 |
6 | 编译时多态性不太灵活, 因为所有事物都在编译时执行。 | 运行时多态性更加灵活, 因为所有事物都在运行时执行。 |