【问题标题】:Method overloading and inheritance in javajava中的方法重载和继承
【发布时间】:2014-11-12 11:59:55
【问题描述】:

我有以下程序,但它不会编译:

public class A {

    public void method() {
        System.out.println ("bla");
    }
}

class AX extends A {

    public void method(int a) {
        System.out.println ("Blabla");
    }

    public static void main(String[] args) {
        A a2 = new AX();
        a2.method(5);
    }
}

为什么 a2.method(5) 不使用 subclasses 方法?这个方法是不是重载了?

【问题讨论】:

  • a2.method(5)肯定调用子类的方法,因为A 中没有匹配签名的方法。
  • 对象 A 不知道方法(int)是谁。 . .
  • 不会调用AX的方法。 a2 仅对 A 类中的方法可见。

标签: java inheritance polymorphism overloading


【解决方案1】:

只有A 类的方法对编译器可见。这是因为根据A a2 = new AX();,您的对象a2A 类型。如果您将此行更改为AX a2 = new AX();,它将起作用。

【讨论】:

    【解决方案2】:

    也许你混淆了overloadingoverriding这两个术语。

    Overloading 正在添加一种与现有方法同名的不同方法,其输入参数和返回类型不同。它与继承无关。从继承的角度来看,重载只是添加一个新方法。你的班级A 不知道它的后继新方法是什么。

    Overriding 正在用不同的实现替换方法。 A 知道有一个方法存在,因此你可以在它的后继 AX 中更改它。

    你有两种可能。在A 中定义public void method(int a)

    public class A {
    
        public void method() {
            System.out.println ("bla");
        }
    
        public void method(int a) {
            System.out.println ("Blabla from A");
        }
    }
    

    或使用 AX

    AX a2 = new AX();
    a2.method(5);
    

    因为知道public void method(int a) 的唯一类是AX

    【讨论】:

      【解决方案3】:

      在 Java 中可见性由Object type 确定,而不是由Reference type 确定。

      在你的情况下:

      A a2 = new AX();
      
      Object type A, so compiler can't find method(int a);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        • 2017-01-07
        • 2011-02-27
        • 2015-12-25
        • 1970-01-01
        • 2014-11-24
        • 1970-01-01
        相关资源
        最近更新 更多