Java中编译时和运行时多态的区别
多态性一词意味着具有多种形式。简单来说,我们可以将多态性定义为消息以多种形式显示的能力。在本文中,我们将看到两种类型的多态性之间的区别,编译时间和运行时间。
编译时多态性: 当一个对象在编译时与其功能绑定时,这被称为编译时多态性。在编译时,java 通过检查方法签名知道要调用哪个方法。所以这称为编译时多态性或静态或早期绑定。编译时多态性是通过方法重载实现的。方法重载表示可以在一个具有不同原型的类中拥有多个具有相同名称的函数。函数重载是实现多态的方法之一,但它取决于技术和我们采用哪种类型的多态。在java中,我们在编译时实现函数重载。以下是可以观察到编译时多态性的示例。
public class geekdocsDemo {
// 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 虚拟机在运行时而不是在编译时确定要调用的正确方法。它也称为动态或后期绑定。方法覆盖表示子类具有与父类中声明的方法相同的方法。这意味着如果子类提供了由其父类之一提供的方法的特定实现,那么它被称为方法覆盖。以下是可以观察到运行时多态性的示例。
// Implementing a class
class Test {
// Implementing a method
public void method()
{
System.out.println("Method 1");
}
}
// Defining a child class
public class geekdocsDemo 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 geekdocsDemo();
test.method();
}
}
运行结果:
Method 2
下表演示了运行时多态性和编译时多态性之间的区别:
编译时多态性 | 运行时多态性 |
---|---|
在编译时多态中,调用由编译器解析。 | 在运行时多态中,编译器不解析调用。 |
它也被称为静态绑定、早期绑定和重载。 | 它也被称为动态绑定、后期绑定和覆盖。 |
方法重载是编译时多态性,其中多个方法共享相同的名称,具有不同的参数或签名和不同的返回类型。 | 方法覆盖是运行时多态性,具有相同的方法,具有相同的参数或签名,但与比较的不同类相关联。 |
它是通过函数重载和运算符重载来实现的。 | 它是通过虚函数和指针来实现的。 |
它提供了快速执行,因为需要执行的方法在编译时就已经知道了。 | 与早期绑定相比,它的执行速度较慢,因为需要执行的方法在运行时是已知的。 |
编译时多态性不太灵活,因为所有事情都在编译时执行。 | 运行时多态性更加灵活,因为所有事物都在运行时执行。 |
不涉及继承。 | 涉及到继承 |