方法覆盖包装类

时间:2016-03-18 15:50:14

标签: java

public class A
{
    public void display(int i)
    {
        System.out.println("Inside A");
    }
}

public class B extends A
{
    public void display(Integer i)
    {
        System.out.println("Inside B");
    }
}


public class starter
{
    public static void main (String args[])
    {
        A a = new B();
        a.display(5);
        System.out.println("So now you know or not");
    }
}

输出:内部A

有人可以解释这个输出吗?通常应该调用子方法。当我们有一个包装类和一个使用继承的原始类时,Java如何表现?

1 个答案:

答案 0 :(得分:4)

B#display 覆盖A#display,因为签名不同。

事件int可以装入Integer s,这与此无关。

您可以使用@Override注释轻松验证这一点。

由于a的引用类型为A,因此使用文字整数(您的给定5参数)的完全匹配来解析该方法,即int因此调用A#display

您仍然可以通过使用此习惯用法强制调用B#display(不适用于生产代码):

((B)a).display(new Integer(5));

这会将您的a变量转换为B类型,从而允许在上下文中查看B的{​​{1}}方法。

它还会传递display而不是Integer,因此会使用int B方法的签名并允许解析该方法。