继承与私人方法

时间:2013-01-24 05:41:56

标签: java inheritance

给出以下代码块:

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()。为什么是这样?

6 个答案:

答案 0 :(得分:2)

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

调用方法
public void doMethod(){super.doMethod();}

所以方法链是这样的:

B.doMethod() -> A.doMethod() -> A.method() -> "from A"

答案 1 :(得分:1)

我认为您的问题是,如果class A private void method(){System.out.print("from A");}是私有的,那么为什么要在class B中打印“来自A”。

答案非常简单,你不能在任何其他类中调用A类的method()。但你可以用它自己的对象来调用它。

当你调用super.doMethod();时,它的super函数和method()是它自己的方法,所以它可以调用它。

答案 2 :(得分:0)

因为,见下文:

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

在B组的doMethod()中,你使用super.doMethod()来攻击A类的doMethod()。所以很明显它是打印A级的doMethod()。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您的代码提供了简单的对象创建(B obj = new B();)和使用super的调用。超级用于父类提到的其他人。如果你尝试类似(A obj = new B();)这样的东西可能会有所不同,这更有趣。

答案 5 :(得分:0)

类A中的

方法()是私有方法,私有方法不能被覆盖。当覆盖它时,最好使用@Override annotion。

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");}
}