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() にアクセスできないのに、出力に表示されるのはなぜですか?
継承の根本的な理解がはっきりしていないことは明らかです。誰かがこの状況と、継承が実際にどのように「構造化」されているかを説明できますか? スーパークラスの継承可能なメソッドとフィールドは、サブクラスにスーパーインポーズするだけだと思っていました。しかし、その論理は明らかに間違っています。
ありがとう!