java – 覆盖 – 参数差异
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)); } } 问题是,以下输出是什么.我在答案1中是对的.但我没有完全理解为什么. 由于B对象的内部类是(A,A).我是否正确认为它不能覆盖超级方法m,因为它是(A,B)?如果交换了两个方法的参数,它是否能够覆盖? 既然它既不能覆盖也不能超载,它什么都不做,只是在B类中使用方法m? 对象的内部类是否仅适用于自身?它就像一个异类吗? 为所有问题道歉. 提前致谢. 编辑: 从我到目前为止的理解,因为静态类型设置为B,所以类型B无法看到anon类.如果将其设置为公开,则可以看到它,但仍然不会使用它. 这使我对另一个问题感到困惑. public class A{ public static int x = 1; public int m(A a,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. 在A类中,当调用a.m(b,b)时.它调用动态类型.这是因为一旦解析它会变为动态类型吗?那么现在它可以使用anon类了吗? 解决方法
这里有几点:
>匿名内部类中的方法不公开,因此无法覆盖公共方法.如果必须覆盖非抽象方法,请始终使用@Override. B b1 = null; System.out.println(new B(){int m(B a,B b){ return 10; }.m(b1,b1)); 要么 final B b1 = null; new B() { { System.out.println(this.m(b1,b1)); } int m(B a,B b) { return 10; } }; >语言选择具有最具体参数(如果存在)的覆盖,而不是最不具体的参数.在前面的示例中进行了更正例如System.err.println(“donkey”.toCharArray());不会调用println(Object).>重写方法可以放宽返回类型,“协变返回类型”(自1.5起).当超类型中的泛型参数类型(例如Comparable)中的参数发生时,情况不完全相同. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |