2016-09-26 52 views
-1

什么是Java运行时重写规则如下2种情况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(新的Intger(2))不会引发编译错误?

+0

2.你为什么认为它应该创建一个? – SomeJavaGuy

+0

在这两种情况下,B对象都被分配给A引用。在这些场景中,哪些顺序运行时方法调用完成? – user3781572

+0

提示:上传代码的时候,然后把实例一致;就像:其他人可以简单地将其复制/粘贴到他们的编辑器中进行播放。你的例子使用一些PSVM()构造函数调用;然后你正在使用“sysout”,这是一种不存在的方法。换句话说:你有一个具体的代码问题。然后粘贴真正的代码,而不是伪代码! – GhostCat

回答

0

让我们来理解 - JAVA尝试将参数(给定)中最接近的可能Data type与被调用方法声明(覆盖)的参数进行匹配。在Object是最宽对象的情况下,除了整数以外的每个对象都被认为是简单的Object。但是,由于JAVA的Autoboxing,Integer首先被输入到int,因此作为整数而不是Object传递。

+0

感谢您的回复。我在这里有一个疑问,在场景1中,尽管我声明了display(int i),但对a.display(2)的调用正在引用显示(Integer i),尽管最接近的mach是int数据类型? – user3781572

+0

在第一个场景中的交易是,超类已经包含一个方法,可以采取一个整数作为参数,而不是调用一个子类的方法JAVA包装int到Integer并调用超类方法。注意:重写不是 - 在接近此处的位置,也避免使用这样的代码。 –

1

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

关于你的第二个问题:

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

做是因为编译器看到:

  1. 一个类的
  2. 一个有一个方法显示屏,采用一个int
  3. 它知道如何把一个整数INT

因此它可以使用显示器(INT)从类A的编译器拆箱的整数对象到原始int值为你后面的封面。

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

+0

感谢您的回复。我在这里有一个疑问,在场景1中,尽管我声明了display(int i),但对a.display(2)的调用正在引用显示(Integer i),尽管最接近的mach是int数据类型? – user3781572

+0

查看我的更新回答。在场景一中,根本没有压倒一切! – GhostCat