-1

以下に示すように、以下のクラスを開発しました

class Ab {
    int i = 10; 
    static void getF() {
        System.out.println("I am good");
    }
}
class Hamm extends Ab {
    int i = 10; 
    static void getF() {
        System.out.println("I am good and bad boy");
    }
    public static void main(String[] args) {
         //Hamm h = new Hamm();      
        // h.getF(); //Ham
        Ab a = new Hamm();  //reference of parent class
        //a.getF(); // Ab class

    }
}

さて、私の質問は、クラス Ab の変数 i を取得しているが、クラス Hamm のメソッド getF() を取得しているシナリオが存在するということです。アドバイスしてください。

4

5 に答える 5

2

メソッドが非静的であることを宣言します。とにかくインスタンスメソッドとして使用します。静的メソッドはオーバーライドできません。

これが実際のサンプルです:

class Ab {
    int i = 10; 
    void getF() {
        System.out.println("I am good");
    }
}
class Main extends Ab {
    int i = 10; 
    @Override
    void getF() {
        System.out.println("I am good and bad boy");
    }
    public static void main(String[] args) {
         //Hamm h = new Hamm();      
        // h.getF(); //Ham
        Ab a = new Main();  //reference of parent class
        a.getF(); // Ab class

    }
}

そしてideoneのリンク。

于 2013-02-21T10:12:03.993 に答える
0

のインスタンスを作成する場合、Hammインスタンスは子クラスで定義された変数とメソッドを使用しますHamm。これは、親のメソッド/フィールドをオーバーライドするためです。

于 2013-02-21T10:10:53.180 に答える
0

静的メソッドとクラス変数 (属性) は、インスタンス メソッド (非静的メソッド) のようにオーバーライドできません。

于 2013-02-21T10:11:43.743 に答える
0

Java のメソッドは多態的です。C++ を知っている場合は、非静的メソッドはすべて「仮想」であると考えてください。これは、実際の実装が呼び出されることを意味します。たとえば、あなたの場合、実装は class で行われますHmmm

ただし、フィールドは多態的ではないため、 type の変数であるため、クラスに属する変数をa.i返します。iAbaAb

于 2013-02-21T10:12:38.157 に答える
0

あなたの問題は、サブクラスのメソッドを非表示にするメソッドを静的にしたためだと思います。したがって、メソッドを呼び出すたびに、親クラスのメソッドが実行されます。ところで、変数 'i' を両方の場所で 10 に初期化したので、値がどこから来ているかをどのように知ることができますか?

于 2013-02-21T10:14:24.250 に答える