首页 / JAVA / java – 覆盖 – 参数差异
java – 覆盖 – 参数差异
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 覆盖 – 参数差异,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1868字,纯文字阅读大概需要3分钟。
内容图文
![java – 覆盖 – 参数差异](/upload/InfoBanner/zyjiaocheng/760/16118b252bfa4b528c9f0fa07aebe782.jpg)
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 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)时.它调用动态类型.这是因为一旦解析它会变为动态类型吗?那么现在它可以使用anon类了吗?
解决方法:
这里有几点:
>匿名内部类中的方法不公开,因此无法覆盖公共方法.如果必须覆盖非抽象方法,请始终使用@Override.
> b1的(静态)类型是B,因此匿名类型中声明的额外方法不可用.虽然你可以做以下事情:
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)中的参数发生时,情况不完全相同.
内容总结
以上是互联网集市为您收集整理的java – 覆盖 – 参数差异全部内容,希望文章能够帮你解决java – 覆盖 – 参数差异所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。