Java运行时方法重写规则



下面两种情况下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.p udisplay (new integer(2))不抛出编译错误?

第一个问题:您可以在Oracle的本教程中找到重写的规则。另一个好的起点可能是那个网站。当然,如果您正在寻找规范,那么只有Java语言规范才能完成这项工作。

关于第二个问题:

a.display(new Integer(2)); //In A int

这样做是因为编译器看到:

  1. a属于a
  2. 有一个方法display,它接受一个int
  3. 它知道如何将Integer转换为int

因此,它可以在类a中使用display(int)。编译器将整数对象unbox拆成一个基本的int值。

最后:在场景1中,没有覆盖任何内容。B 中的显示方法不会覆盖A中的任何内容-因为它具有不同的签名。因此,您仍然是从A调用该方法!你会立即注意到,当把@Override放在你的方法在B!

为了便于理解—JAVA尝试将参数(给定)中最接近的Data type与被调用方法声明(覆盖)的参数进行匹配。在这两种情况下,Object是最宽的对象,除整数之外的所有对象都被认为是简单的Object。然而,由于JAVA的Autoboxing, Integer首先被输入到int中,因此作为一个整数而不是Object传递。

最新更新