1

私は大学生で、Java の継承を理解しようとしています。docs.oracle サイトによると、コンストラクターを除いて、クラスのすべてのメンバーが継承されます。これは理にかなっています。問題は、実験を行ったがうまくいかなかったことです。ここにあります:

public class One{
    public void outPrint(){
        System.out.println("Hello World!");
    }//end outPrint
}//end One.java

public class Two extends One{
    //empty
}//end Two.java

public class Three extends Two{
    public static void main(String[]args){
        outPrint();
    }//end main
}//end Three.java

Three を実行すると、非静的メソッド outPrint() は静的コンテキストから参照できません。これはもちろん、コンパイラが outPrint() をインスタンス メンバーとして認識しているためです。キーワード「static」を outPrint() メソッド ヘッダーに追加すると、すべてが正常に機能します。

これが私の混乱の原因です。継承できないコンストラクターだけでなく、そのすべてのインスタンスメンバーもそうです。誰かが私にこれをもう少しうまく説明できますか? 「静的」の使用を伴わない回避策はありますか? 「スーパー」でいくつかの実験を試みましたが、役に立ちませんでした。前もって感謝します!

4

4 に答える 4

5

呼び出すオブジェクトをインスタンス化する必要があります。

例えば

Three t = new Three();
t.outPrint();

定義したメソッドは静的であり、オブジェクト ( / / ) のインスタンスmain()がありません。特定の名前空間に存在するだけです。OneTwoThree

したがって、 Three is-a であることを実証できることに注意してください。One

One t = new Three();
t.outPrint();

また、各サブクラスのメソッドをオーバーライドするoutPrint()と、元のオブジェクト インスタンスのインスタンス化および/または参照の方法に応じて、どのメソッドが呼び出されるかを確認できます。

于 2013-07-04T13:12:18.523 に答える