2013-12-22 91 views
0

为什么在这里没有发生重载,即使将整数参数传递给方法“p”。 ?通过覆盖重载

public class Test { 
    public static void main(String[] args) { 
     B a = new A(); 
     a.p(10); 
     a.p(10.0); 
    } 
} 

class B { 
    public void p(double i) { 
     System.out.println(i * 2); 
    } 
} 

class A extends B { 
    // This method the method in B 
    public void p(int i) { 
     System.out.println(i); 
    } 
    //added below code 
    public void p(double i) { 
     System.out.println(i*5); 
    } 
} 



Output:50.0 
     50.0 
+2

使'A'延伸'B'令人难以置信的混淆。几乎每个世界上压倒一切的例子都让'A'成为父类。 –

回答

2

因为变量a被声明为B,仅在B声明的p方法是可见的,因此选择。没有压倒一切。

如有疑问,请在您最喜欢的IDE中用@Override注释您的方法。如果它没有实际覆盖任何东西,IDE将不会让它编译。


编辑完成后,您现在拥有A#p(double)形式的重写方法。当你调用

a.p(10); 
a.p(10.0); 

的方法p上可见B类将被调用。通过多态性,并且由于变量a的运行时类型为A,因此将调用在A中声明的重写方法。


注意,int论点

a.p(10); 

成为double通过widening primitive conversion

0

因为您通过引用来调用东西B。那只有一种方法。

+0

那么这里对象A的用法是什么?当对象(这里是“A”)特定的方法执行时? – user3126466

+0

@ user3126466:在这种情况下,没有用处。您的示例中没有重写的方法。 –

+0

现在我编辑并在类A中添加了overriden方法。因此,重载在此处不存在。 – user3126466

0

它总是调用B的方法,这是因为:

  • 变量是B型的,所以编译器只知道在double方法
  • A方法不会覆盖B的方法因为参数类型int不同于Bdouble - 它对呼叫代码是不可见的