java中的方法重载和继承

时间:2014-11-12 11:59:56

标签: java inheritance polymorphism overloading

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

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)不使用子类方法?这种方法不是重载吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

也许您会混淆术语overloadingoverriding

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

Overriding正在用不同的实现替换方法。 A知道存在一种方法,因此您可以在其后续版AX中更改它。

你有两种可能性。在public void method(int a)中定义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

答案 2 :(得分:0)

Object type确定的Java可见性,而不是Reference type

在你的情况下:

A a2 = new AX();

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