【问题标题】:Default Reference Type of anonymous object in JavaJava中匿名对象的默认引用类型
【发布时间】:2018-07-10 14:34:09
【问题描述】:

假设我的代码是,

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 类型。这是我错过的某种官方规则吗?在编译阶段和运行阶段会发生什么?

【问题讨论】:

  • 提示:new B() 不是匿名对象,是B 类型的对象。

标签: java oop reference


【解决方案1】:

BA 的子级。所以B 可以用来代替A

所以当你删除类型为B b 的方法时。它直接选择A a的方法,不会混淆。

当有多个方法可以使用相同的规则(重载)访问时,就会出现混乱。在这种情况下,将选择最具体的方法。在没有B a 的方法时,将选择A a,当有B b 时,将选择B,因为A 对于B a 类型的方法比A 更具体。

所以在选择具体的链条中,Child 的优先级最高,Parent 的优先级最低。

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

15.12.2.5. Choosing the Most Specific Method

如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。 Java 编程语言使用选择最具体方法的规则。

【讨论】:

  • 由于这是方法重载,“最具体的方法选择”发生在编译阶段,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多