2013-01-24 167 views
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中的方法()被调用。为什么是这样?

回答

2

你明确地实现它的方式。从基类super呼叫的方法,其是A

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

所以方法链接是这样的:

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

对不起错字。想问为什么来自类A的method()被调用。 –

+0

@VictorCheung,请参阅更新。 –

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()。

0

您拨打doMethod与超级关键字。它意味着它会调用父类的实现 更多关于super keyword

1

我觉得你的问题是,如果在class Aprivate void method(){System.out.print("from A");}是私有的,那么为什么是印刷的“从”在class B

答案很简单,你不能调用类的method()形成任何其他类。但是你可以用它自己的对象调用它。

当您拨打super.doMethod();时,其超级功能和method()是它自己的方法,因此它可以调用它。

0

您的代码给出简单对象创建(B OBJ =新B();),并使用超级呼叫。超级像其他人一样使用父级。 ,这是更有趣,如果你尝试类似(A = OBJ新B())事情会有所不同。

0

A类中的method()方法是私有的,私有方法不能被重写。重写时最好使用@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");} 
}