8
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() にアクセスできないのに、出力に表示されるのはなぜですか?

継承の根本的な理解がはっきりしていないことは明らかです。誰かがこの状況と、継承が実際にどのように「構造化」されているかを説明できますか? スーパークラスの継承可能なメソッドとフィールドは、サブクラスにスーパーインポーズするだけだと思っていました。しかし、その論理は明らかに間違っています。

ありがとう!

4

2 に答える 2

12

簡単な答えは、可視のメソッドのみをオーバーライドできるということです。最初の 2 つのメソッドpriとは、pacそれぞれプライベートおよびパッケージで保護されています。プライベートメソッドはクラスの外部からは何も見えないため、オーバーライドできません。同様Concrete1に、別のパッケージにあるため、Base表示Base.pacできないため、オーバーライドできません。

priこれが意味することは、 でおよびpacメソッドを定義している間、これらはオーバーライドConcrete1ではなく、 のメソッドとたまたま同じ名前を持つメソッドに過ぎないということです。Base他の 2 つのメソッドpropubはそれぞれ保護され公開されているため、 に表示されConcrete1ます。その結果、 のpropubメソッドConcrete1は の同じ名前のメソッドをオーバーライドしますBase

showで定義されているためBase、 で定義されている 4 つのメソッドを呼び出してコンパイルされBaseます。実行されると、JVM はオーバーライドされたメソッドがあるかどうかを確認し、オーバーライドされたメソッドを実行します。上で説明したように、pripacは上書きされないため、Baseバージョンはそのまま実行され、そのままバージョンが実行さproれます。pubConcrete1

showメソッドをConcrete1の代わりにに移動するBaseと、 で定義されている 4 つConcrete1のメソッドが に表示されるため、これらのメソッドが実行されshowます。

于 2012-09-15T04:12:06.760 に答える
0

プライベート メソッドと修飾子のないメソッドは、設計上、そのサブクラスからは見えません。詳しい説明はこちらをご覧ください。

于 2012-09-15T04:16:00.687 に答える