下面两种情况下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.
第一个问题:您可以在Oracle的本教程中找到重写的规则。另一个好的起点可能是那个网站。当然,如果您正在寻找规范,那么只有Java语言规范才能完成这项工作。
关于第二个问题:
a.display(new Integer(2)); //In A int
这样做是因为编译器看到:
- a属于a
- 有一个方法display,它接受一个int 它知道如何将Integer转换为int
因此,它可以在类a中使用display(int)。编译器将将整数对象unbox拆成一个基本的int值。
最后:在场景1中,没有覆盖任何内容。B 中的显示方法不会覆盖A中的任何内容-因为它具有不同的签名。因此,您仍然是从A调用该方法!你会立即注意到,当把@Override放在你的方法在B!
为了便于理解—JAVA尝试将参数(给定)中最接近的Data type
与被调用方法声明(覆盖)的参数进行匹配。在这两种情况下,Object
是最宽的对象,除整数之外的所有对象都被认为是简单的Object
。然而,由于JAVA的Autoboxing
, Integer
首先被输入到int
中,因此作为一个整数而不是Object
传递。