繁体   English   中英

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

[英]Default Reference Type of anonymous object in Java

假设我的代码是,

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”。 我知道多态,继承和传值的概念。 我的问题是为什么new B()引用类型是BA当我删除C类中的方法时,它是A类型。我错过了某种官方规则吗? 在编译阶段和运行时阶段会发生什么?

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

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

当有多个方法可以使用相同的规则(重载)访问时,会发生混淆。 在那种情况下, 将选择最具体的方法 在不存在的方法与B aA a将被选择,并且当存在B b将被选择,因为B比最具体的A用于与所述类型的方法B a

因此,在具体选择链中, Child最重要, Parent最少。

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

15.12.2.5。 选择最具体的方法

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM