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)创建了具体1的c1对象
3)调用c1.show()
。由于P1.Base.show()是public
,因此可以调用它
4)现在,在继承之后的P2.concrete1中,只有它自己的方法(pri,pac,pro,pub)和P1.Base的可继承方法(pro,pub,show)都可以访问。
现在为什么它们甚至无法访问时会在输出中显示Base.pri()和Base.pac()?
很明显,我对继承没有一个非常明确的基本理解。有人可以解释这种情况以及继承实际上是如何“结构化”的。我曾经认为超类的可继承方法和字段会叠加到子类上。但这种推理显然是错误的。
谢谢!