gpt4 book ai didi

java - Java多态性中的困惑

转载 作者:行者123 更新时间:2023-12-02 00:06:10 25 4
gpt4 key购买 nike

我对java多态性感到困惑。在动态方法绑定(bind)中,jvm 在运行时决定必须调用哪个类方法。假设我有 A、B 和 C 三个类(class)。

class A{
int get(){
return 10;
}

int getParent(){
return 10;
}
}

class B extends A
{
int get(){
return 20;
}
}

public class C
{
public static void main(String args[])
{
A a = new A();
A a1 = new B();
System.out.println(a.get());/////////////////////////LINE1
System.out.println(a1.get ());////////////////////////LINE2
System.out.println(a.getParent());////////////////////////LINE3
}
}

我在编译时和运行时绑定(bind)时对第 1 行和第 3 行感到困惑。在第 3 行中,它是 a.getParent() 并且此方法仅在父类中,因此它必须在运行时决定。

在第 1 行中,引用和对象都来自同一个类,因此它必须决定什么。

请向我发送有关运行时和编译时绑定(bind)如何工作的任何好的链接。

最佳答案

    class A
{
public doIt( )
{
//this does something
}
}

class B extends A
{
public doIt( )
{
//this does something
}
}

class C extends B
{
public doIt( )
{
//this does something
}

}

public static void main(String[] args) {
A x = new B( );

x.doIt( );

}

引起很多困惑的语句是“A x = new B();”陈述。虽然变量 x 是 A 类型的对象,但它被实例化为 B 类的对象——因为“= new B( );”声明的一部分。 Java 运行时基本上会查看此语句并说“尽管 x 被明确声明为类型 A,但它被实例化为类 B 的对象,因此我将运行类 B 中定义的 doIt() 方法的版本”。

由于 Java 中所谓的动态绑定(bind),对象 x 执行的 doIt() 方法的版本是 B 类中的版本 - 上面的代码可以被认为是动态绑定(bind)的示例。动态绑定(bind)基本上意味着实际调用的方法实现是在运行时确定的,而不是在编译时确定的。这就是为什么它被称为动态绑定(bind) - 因为将要运行的方法是在运行时选择的。动态绑定(bind)也称为后期绑定(bind)。

早期绑定(bind)中,数据和方法在编译时绑定(bind),如下所示后期绑定(bind)数据和方法将在运行时绑定(bind)。

关于java - Java多态性中的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13838097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com