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

tez*_*ezz 2 java oop reference

假设我的代码是,

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
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,第3行打印"BB".如果我void print(B b)在C类中删除我的方法,那么第3行打印"AA".我知道多态,继承和传值的概念.我的问题是为什么引用类型new B()是类型的B,A当我删除C类中的方法时它是类型的.我错过了某种官方规则吗?在编译阶段和运行时阶段会发生什么?

Sur*_*tta 7

B是个孩子的A.所以B可以用来代替A.

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

当有多个方法可以使用相同的规则(重载)访问时,会发生混淆.在那种情况下,将选择最具体的方法.在没有方法的情况下B a,A a将选择和何时B b选择因为B最具体A的方法而不是类型的方法B a.

因此,在具体选择的链条中,Child具有最大优先级并且Parent最少.

B > A > ... > .. >Object
Run Code Online (Sandbox Code Playgroud)

15.12.2.5.选择最具体的方法

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