尝试使用父类方法时Java调用子类方法

时间:2012-09-04 15:29:54

标签: java inheritance

如果我有两个班,A和B,

public class A {
    public int test() {
        return 1;
    }
}

public class B extends A{
    public int test() {
        return 2;
    }
}

如果我这样做:A a1 = new B(),那么a1.test()会根据需要返回2而不是1。 这只是Java的一个怪癖,还是有这种行为的原因?

8 个答案:

答案 0 :(得分:5)

这称为polymorphism。在运行时,将根据a1的“真实”类型调用正确的方法,在这种情况下为B

正如维基百科所说的那样:

  

工业中多态的主要用法(面向对象   编程理论)是物体属于不同的能力   类型以响应同名的方法,字段或属性调用,   每一个都根据适当的类型特定行为。该   程序员(和程序)不必知道确切的类型   预先确定对象,因此确定的确切行为   运行时(这称为后期绑定或动态绑定)。

答案 1 :(得分:3)

不,这是正确的(这是由于多态性)。所有方法调用都在对象上运行,而不是引用类型。

此处您的对象属于B,类型,因此将调用class B的测试方法。

答案 2 :(得分:2)

这是polymorphism,更具体地说是Java overriding。如果要从类B调用A类测试方法,则需要使用super来调用超类方法。 e.g:

public class B extends A{
   public int test() {
       return super.test();
}

答案 3 :(得分:0)

这是预期的行为。 B类中的方法test()将覆盖A类方法test()

答案 4 :(得分:0)

有关

A a1 = new B();

a1指向B的对象,这是运行时的真实类型。因此,值从对象B打印。

答案 5 :(得分:0)

A obj = new A();
obj.test()

将返回1

A obj = new B();
obj.test()

将返回2

B obj = new B();
obj.test()

将返回2

正如其他答案中所述,这是多态性的工作原理。

This帖子可能会让事情变得更清晰

答案 6 :(得分:0)

Java使用动态绑定(或后期绑定),因此调用B的方法,而不是A。这与静态绑定相反。有一个很好的例子here

答案 7 :(得分:0)

你将你的对象声明为A但是你的实例是B.所以将被调用的方法来自B类。如果你要在B中注释方法测试,B扩展A(我们可以说A是B的父级)然后回想一下这个方法,在这种情况下,调用的方法将从A类测试并返回1.