public class A{
public static int x = 1;
public int m(A a, B b){
return a.m(b, b) + x;
}
}
public class B extends A {
public int m(A a1, B a2){
if(a1 == a2)
return x;
return super.m(a1,a2);
}
}
这是一个来自我正在考试的科目考试的问题。覆盖 - 参数差异
public class Main{
public static void main(String[] args){
B b1 = new B(){int m(A a, A b){ return 10; }};
System.out.println(b1.m(b1, b1));
}
}
问题是,下面的输出是什么。我的答案是正确的,但我没有完全明白为什么。
由于B对象的内部类是(A,A)。我是否认为它不能覆盖超级方法m,因为它是(A,B)?如果两个方法的参数交换了,它能重写吗?
既然它既不能覆盖也不能重载,它什么也不做,只是使用B类中的方法m?
对象的内部类是否仅为其自身工作?它是否像一个匿名课?
对所有问题表示歉意。
在此先感谢。
编辑:
从我的理解,到目前为止,其因为静态类型设置为B,那么B型是无法看到匿名类。如果这是公开的,它可以被看到,但它仍然不会被使用。
这使我对另一个问题感到困惑。
public class A{
public static int x = 1;
public int m(A a, B b){
return a.m(b, b) + x;
}
}
public class Main{
public static void main(String[] args){
A a1=new A();
A a2=new A(){
int m(A a,B b){
return 10;
}};
B b1=new B();
System.out.println(a1.m(a2,b1));
}
}
当下面被调用时,输出为11 当a1.m被调用时,它经过A2及B1的。
在A类中,当调用a.m(b,b)时。它调用动态类型。这是因为它一旦解析就更改为动态类型?那么现在它能够使用匿名类吗?
回答如下,请告诉我,如果事情是模糊的。这是颇有些运动在这里;) – fge