0

给定以下代码块:

public class Trial {
    public static void main (String[] args){
        B obj = new B();
        obj.doMethod(); #prints "From A".
    }
}

class A {
    private void method(){System.out.print("from A");}
    public void doMethod(){method();}
}

class B extends A {
    public void method(){System.out.print("from B");}
    public void doMethod(){super.doMethod();}
}

事实证明,调用了类 A 中的 method()。为什么是这样?

4

6 回答 6

2

您以这种方式明确实现它。super从基类调用方法A

public void doMethod(){super.doMethod();}

所以方法链是这样的:

B.doMethod() -> A.doMethod() -> A.method() -> "from A"
于 2013-01-24T05:43:31.063 回答
1

我认为您的问题是如果 inclass A private void method(){System.out.print("from A");}是私有的,那么为什么要在class B.

答案很简单你不能打电话method()从任何其他类中调用 A 类。但是你可以用它自己的对象来调用它。

当您调用super.doMethod();then 它的 super 函数并且method()是它自己的方法时,它可以调用它。

于 2013-01-24T05:54:03.970 回答
0

A 类中的 method() 是私有的,私有方法不能被覆盖。并且在覆盖时最好使用@Override 注释。

class B extends A {

    @Override
    public void method(){System.out.print("from B");} // Compile error
}

如果您将方法更改为静态方法,也会发生类似的事情。

class A {
    public static void method(){System.out.print("from A");}
}

class B extends A {
    public static  void method(){System.out.print("from B");}
}
于 2013-01-24T06:04:02.340 回答
0

您使用super关键字调用 doMethod 。这意味着它将调用父实现更多关于超级关键字

于 2013-01-24T05:46:02.480 回答
0

您的代码提供了简单的对象创建 (B obj = new B();) 和使用 super 的调用。Super 与其他人提到的父类一样使用。如果您尝试更有趣的 (A obj = new B();) 之类的方法,情况可能会有所不同。

于 2013-01-24T05:56:14.257 回答
0

因为,见下文:

class B extends A {
    public void method(){System.out.print("from B");}
    public void doMethod(){super.doMethod();}
}

在B 类的doMethod() 中,您使用super.doMethod() 调用A 类的doMethod()。所以很明显它是在打印 Class A 的 doMethod()。

于 2013-01-24T05:44:17.573 回答