gpt4 book ai didi

java - Java中匿名对象的默认引用类型

转载 作者:行者123 更新时间:2023-12-02 17:50:43 27 4
gpt4 key购买 nike

假设我的代码是,

class A {
void print() {
System.out.println('A');
}
}

class B extends A {
@Override
void print() {
System.out.println("B");
}
}

class C {
void print(A a) {
System.out.println("AA");
}
void print(B b) {
System.out.println("BB");
}
}

class test {
C c = new C();
c.print(new B()); // line 3
}

当我运行这段代码时,第 3 行打印“BB”。如果我删除 C 类中的方法 void print(B b),则第 3 行将打印“AA”。我了解多态性、继承和值传递的概念。我的问题是,为什么当我删除类 C 中的方法时,new B() 的引用类型是 B 类型,并且是 A 类型。这是我错过的某种官方规则吗?编译阶段和运行阶段会发生什么?

最佳答案

BA 的子级。因此可以使用B来代替A

因此,当您删除类型为 B b 的方法时。它直接选择带有 A a 的方法,不会造成混淆。

当有多个方法可以使用相同的规则(重载)访问时,就会发生困惑。在这种情况下,将选择最具体的方法。如果没有 B a 的方法,将选择 A a,当存在 B b 时,将选择 B对于类型为 B a 的方法,code> 比 A 最具体。

因此,在选择具体的链中,Child 具有最高优先级,Parent 具有最低优先级。

B > A > ... > .. >Object

15.12.2.5. Choosing the Most Specific Method

If more than one member method is both accessible and applicable to a method invocation, it is necessary to choose one to provide the descriptor for the run-time method dispatch. The Java programming language uses the rule that the most specific method is chosen.

关于java - Java中匿名对象的默认引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48542910/

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