2016-09-29 18 views
0

Javaでオーバーライド機能を使用している間、私は疑念を抱いています。私は、静的メソッドをオーバーライドできないことを読ん静的メソッド継承と静的変数継承の違いは何ですか?

class Vehicle { 
    static int speed = 50; 

    public static void display() { 
     System.out.println(speed); 
    } 
} 

class Jeep extends Vehicle { 
    int speed = 100; 

    void display() { //GETTING COMPILE TIME ERROR 
     System.out.println(speed);//will print speed of Bike 
    } 

    public static void main(String args[]) { 
     Jeep b = new Jeep(); 
     System.out.println(b.speed); 

    } 
} 

は、以下のコードを考えてみましょう。

しかし、上記のコードでは、親クラスのVehicleで静的変数 'speed'を宣言しました。子クラスに同じ名前の 'speed'という名前のインスタンス変数を作成しました。子クラスで静的変数 'speed'の値を変更したため、コンパイル時エラーは発生しませんでした。

表示方法をオーバーライドしようとするとコンパイル時に問題が発生しますが、両方とも親クラスで静的であっても変数 'スピード'を再宣言してもエラーは発生しません。

サブクラスのspeed変数は、親クラスの静的変数speedを隠しますが、displayメソッドで同じことを実行せず、コンパイル時のエラーを表示する理由がありますか?

+0

を参照している?上書きすることができない理由については

インスタンスのフィールドまたはメソッド? 'スピード'または 'ディスプレイ'? (それは重要です) –

+0

あなたは子クラスの静的変数 'speed'の何も変更していませんか? – SomeJavaGuy

+0

フィールドは、静的であるかどうかにかかわらず、上書きすることはできません。フィールドに問題はありません。 –

答えて

3

static関数はオブジェクトの特定の部分ではなく、オブジェクトに適用されない限り実際には意味がありません。

だからこそ、static機能を無効にすることはできません。

1

コードでは、サブクラスは新しいフィールドとして宣言された同じ名前(スピード)のフィールドを定義し、スーパークラスのフィールドは隠されています。つまり、同じ名前のサブクラスフィールドによって隠されています。

影付きフィールドは、サブクラスがそのスコープ内で同じ名前のフィールドを宣言したのではなく、サブクラスによって継承されていないことを示します。

フィールドの非表示は、スーパークラスの値に影響しません。隠しフィールドにアクセスするには、単にsuper.fieldname(静的なので、あなたの場合はVehicle.speed)を使用します。

フィールドはオーバーライドすることはできませんが、Javaでは非表示にする必要があります。

フィールドのシャドーイングは、コードを読みにくく混乱させるので、多くの人が悪い習慣とみなします。静的フィールドはバテシバは、あなたの質問のポストに優れた答えを提供するかについて、あなたは求めている Why doesn't Java allow overriding of static methods?

関連する問題