Java运行时方法覆盖规则

时间:2016-09-26 12:52:38

标签: java polymorphism method-overriding

以下两种方案的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))不会抛出编译错误?

2 个答案:

答案 0 :(得分:1)

第一个问题:您可以在Oracle中找到本教程中覆盖的规则。另一个好的起点可能是site。当然,如果您正在寻找规范,那么只有Java Language Specification才能完成工作。

关于你的第二个问题:

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

这是有效的,因为编译器看到:

  1. a 属于 A
  2. 的方法显示采用 int
  3. 它知道如何将整数转换为 int
  4. 因此,它可以使用A类中的 display(int)。编译器将取消整数对象作为封面后面的原始int值。

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

答案 1 :(得分:0)

让我们说理解 - JAVA尝试将参数(给定)中最接近的Data type与被调用方法声明的参数(overriden)进行匹配。在Object作为最宽对象的情况下,除整数之外的每个对象都被视为简单Object。但是,感谢JAVA AutoboxingInteger首先输入int,因此作为整数而不是Object传递。