多态和方法重载

jre*_*rey 27 java polymorphism overloading

我有一个快速而直接的问题:

我有这个简单的课程:

public class A
{
    public void m(Object o)
    {
      System.out.println("m with Object called");
    }

    public void m(Number n)
    {
       System.out.println("m with Number called");
    }
    public static void main(String[] args)
    {
       A a = new A();
       // why will m(Number) be called?
       a.m(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:实际上是实际调用Number的方法.对此感到抱歉.

如果我调用am(null),则使用Number参数调用方法.

我的问题是:这是为什么?这个指定的java语言规范在哪里?

axt*_*avt 27

首先,它实际上是打电话m(Number).

之所以会发生这种情况是因为这两种方法都适用,但却m(Number)最具体的方法,因为任何参数m(Number)都可以传递给m(Object),但反之亦然.

如果替换m(Object)m(String)(或添加其他方法,例如m(Date)),编译器将报告歧义,因为无法识别最具体的方法.

请参阅Java规范中选择最具体方法一节.

  • 好的,既然我实际运行了示例代码,我也看到了这一点.有意义的是,一旦我添加了m(Date n){...},我就得到了一个错误:"方法m(对象)对于类型是不明确的" (2认同)

Ara*_*ram 12

  1. 这不是多态或重写.这是方法重载.
  2. 我测试了这个并且调用了特定的方法(不是m(Object)),并且根据规范总是调用特定的方法.在Java中选择哪个重载为空?

  • +1表示覆盖和重载之间的区别 (2认同)

irr*_*ble 7

另一个相关问题供您考虑:

public static void main(String[] args)
{
   A a = new A();
   Object n = new Integer(1);
   a.m(n); // which method will be called?
}
Run Code Online (Sandbox Code Playgroud)