package P1;
public class Base {
private void pri( ) { System.out.println("Base.pri()"); }
void pac( ) { System.out.println("Base.pac()"); }
protected void pro( ) { System.out.println("Base.pro()"); }
public void pub( ) { System.out.println("Base.pub()"); }
public final void show( ) {
pri();
pac();
pro();
pub();
}
}
和
package P2;
import P1.Base;
public class Concrete1 extends Base {
public void pri( ) { System.out.println("Concrete1.pri()"); }
public void pac( ) { System.out.println("Concrete1.pac()"); }
public void pro( ) { System.out.println("Concrete1.pro()"); }
public void pub( ) { System.out.println("Concrete1.pub()"); }
}
我正在执行
Concrete1 c1 = new Concrete1();
c1.show( );
现在,输出显示为
Base.pri()
Base.pac()
Concrete1.pro()
Concrete1.pub()
有人可以解释为什么会这样吗?根据我对继承的理解,这应该发生:
1)P2.concrete1 继承 P1.Base
2)concrete1 的 c1 对象被创建
3)c1.show()
被调用。由于 P1.Base.show() 是public
,所以可以调用它。
4) 现在,在继承后的P2.concrete1中,只能访问它自己的方法(pri、pac、pro、pub)和P1.Base的可继承方法(pro、pub、show)。
现在为什么它甚至无法访问时在输出中显示 Base.pri() 和 Base.pac() ?
很明显,我对继承没有非常清楚的基本理解。有人可以解释这种情况以及继承实际上是如何“结构化”的。我曾经认为超类的可继承方法和字段只会叠加到子类上。但这种推理显然是错误的。
谢谢!