以下两种方案的java运行时覆盖规则是什么
情景1:
class A{
void display(Integer i){
sysout("In A Integer");
}
void display(Object obj){
sysout("In A Object");
}
}
class B extends A{
void display(int i){
sysout("In B int");
}
}
PSVM(){
A a=new B();
a.display(2); //In A Integer
a.display(new Integer(2)); //In A Integer
a.display("hello"); //In A Object
a.display(new Object()); //In A Object
a.display(null);
}
情景2:
class A {
void display(int i){
sysout("In A int");
}
}
class B extends A{
void display(Integer i){
sysout("In B Integer");
}
void display(Object obj){
sysout("In B Object");
}
}
PSVM(){
A a=new B();
a.display(2); //In A int
a.display(new Integer(2)); //In A int
a.display("hello"); // Compilation error
a.display(new Object()); //Compilation error
a.display(null); //Compilation error
}
我这里的查询很少: 1.如何进行一般运行时覆盖方法评估:任何可用的参考? 2.为什么在场景2中,a.display(new Intger(2))不会抛出编译错误?
答案 0 :(得分:1)
第一个问题:您可以在Oracle中找到本教程中覆盖的规则。另一个好的起点可能是site。当然,如果您正在寻找规范,那么只有Java Language Specification才能完成工作。
关于你的第二个问题:
a.display(new Integer(2)); //In A int
这是有效的,因为编译器看到:
因此,它可以使用A类中的 display(int)。编译器将取消整数对象作为封面后面的原始int值。
最后:在您的方案1中,您不覆盖任何内容。 B 中的显示方法不会覆盖 A中的任何内容 - 因为它具有不同的签名。因此,你仍然在调用A的方法!当你在B中的方法上放置@Override时,你会立即注意到它!
答案 1 :(得分:0)
让我们说理解 - JAVA尝试将参数(给定)中最接近的Data type
与被调用方法声明的参数(overriden)进行匹配。在Object
作为最宽对象的情况下,除整数之外的每个对象都被视为简单Object
。但是,感谢JAVA Autoboxing
,Integer
首先输入int
,因此作为整数而不是Object
传递。