当重写方法X时,从继承方法调用X是否会使用覆盖或重写的X实现?

时间:2014-11-20 11:34:45

标签: java inheritance methods

我用这个方法有两个java类:

class A {
    void m1 () {
        ...
    }

    void m2 () {
        ...
        m1();
        ...
    }
}

class B extends A {
    @Ovveride
    void m1() {
        ...
    }

    void m3() {
        m2();
    }
}

我不确定在m1()内调用的m2()内部m3()是否是在B内定义的新实现或A中的实现。

我希望使用B中定义的m2()实现来调用A BUT中定义的m1()方法。我的代码是正确的吗?

3 个答案:

答案 0 :(得分:2)

这正是将要发生的事情。 B类覆盖方法m1并继承m2。在m2内部,当前对象上有一个m1 的调用。 (记住:“m1();”是“this.m1();”的简称。)由于在B的实例上重写了m1,因此将调用重写的方法。

但是不要相信我的话,亲自尝试吧!放入一两个简单的System.out.println将证明这一点。

答案 1 :(得分:0)

您的代码是正确的,但请注意以下事项:

  1. 首先,您没有指定曝光等级(私密,受保护等),在这种情况下,您的方法默认曝光等级是"包受保护"。
  2. 您需要实例化B才能使用它的覆盖方法:

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

  3. 现在你的obj m1方法实际上会链接到B.m1()

答案 2 :(得分:0)

A类:

public class A {
public void m1(){
    System.out.println("Method1 from class A");
}
public void m2(){
    System.out.println("Method2 from class A");
    m1();
}

}

B组:

public class B extends A{
@Override
public void m1(){
    System.out.println("Method1 from class B");
}
public void m3(){
    m2();
}

}

主要:

public class TestAB {
public static void main(String[] args) {
    A a=new A();
    B b=new B();
    a.m1();a.m2();
    System.out.println();
    b.m1();
    b.m3();
}

}

结果:

A类的Method1 A类的方法2 A类的方法1

B类的Method1 A类的方法2 B类的方法1