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类中的方法时它是类型的.我错过了某种官方规则吗?在编译阶段和运行时阶段会发生什么?
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)
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符.Java编程语言使用选择最具体方法的规则.