2017-10-21 8 views
1

誰かがスーパークラスからではなくサブクラスから変数をプリントする理由を説明することができますか?クラス変数をJavaでオーバーライドすることはできませんか?変数の上書きの説明Java継承

class A { 
    int i = 1; 
    int fun() { 
    return i; 
    } 
} 

class B extends A { 
    int i = 2; 
} 

class Main { 
public static void main(String[] args) { 
    System.out.println(new B().fun()); 
} 
} 

これは1の代わり2を出力します。

+3

フィールドはオーバーライドできません。 –

+0

'fun()'がAからBに拡張され、値が1のfunメソッドが呼び出されているためです。フィールドはメソッドのみをオーバーライドすることはできません – Lokesh

+0

'上書き'を意味し、 '上書き'は意味しません。Javaの変数を上書きすることはありません。 – EJP

答えて

1

サブクラスで宣言されたフィールドは、スーパークラスのフィールドを上書きしないためです。

オーバーライドはメソッドです。
あなたは現在のクラスのi値を使用したい場合、あなたはi価値を提供するためにgetI()方法を紹介することができます:

class A { 
    int i = 1; 
    int fun() { 
    return getI(); 
    } 
    int getI(){ 
    return i; 
    } 
} 

をサブクラスでそれをオーバーライドします。あなたがいる

class B extends A { 
    int i = 2; 

    int getI(){ 
    return i; 
    } 
} 
0

fun()機能からiの値を返します。 funメソッドがスーパークラスの一部であるため、クラスBからオーバーライド変数の値を戻す必要がある場合は、スーパークラスのiのみを参照しています。

しかし、常にJavaの変数を上書きすることは、予期しない結果をもたらす可能性があることを常に忘れています。

この方法でも使用できますか?

class A { 
    int i = 1; 
    int fun() { 
    return i; 
    } 
} 

class B extends A { 
    int i = 2; 
    int fun() { 
     return i; 
     } 
} 
class Main { 
public static void main(String[] args) { 
System.out.println(new B().fun()); // this will refer the override i 
} 
} 
関連する問題