0

私は何かを誤解していると思います。もしそうなら、助けが必要です..

次の2つのクラスがあるとしましょう:

public abstract class Abstraction() {
   protected int number = 0;
   public void printNumber() {
       System.out.println(this.number);
       System.out.println(getNumber());
   }
   public int getNumber() {
       return this.number();
   }
}

public class Reality extends Abstraction {
   int number = 1;
   public Reality() {
       this.printNumber();
   }
}

// some other class
new Reality();

出力はどうあるべきですか?私は 0, 0 を取得しています (ここのコードはもう少し複雑ですが、それでも同じ問題です)。出力を 1,1 にする方法を教えてください。

4

4 に答える 4

9

クラスnumber内の は、クラス内の を上書きしません。したがって、クラスはまだ自分の値を として認識しています。 RealitynumberAbstractionAbstractionnumber0

解決策は次のとおりです。

public class Reality extends Abstraction {
   public Reality() {
       number = 1;
       this.printNumber();
   }
}

numberinは保護されているため、クラスAbstractionでアクセスできます。Reality


もう 1 つの例は、メソッド内のパラメーターです。

private int number;

public void myMethod(int number){
    number = 2;
}

フィールドは設定されず、代わりにパラメーターが として設定されprivate int number ます number2


最後に、キーワードthissuperキーワードについて、クラスの編集を参照してください。

public abstract class Abstraction() {
   protected int number = 0;
   public void printNumber() {
       System.out.println(this.number);
       System.out.println(getNumber());
   }
   public int getNumber() {
       return this.number();
   }
}

public class Reality extends Abstraction {
   int number = 1;
   public Reality() {
       System.out.println(number); //Will print 1
       System.out.println(this.number); //Will print 1
       System.out.println(super.number); //Will print 0
   }
}
于 2012-08-09T13:20:02.537 に答える
1

抽象クラスでセッター メソッドを作成できます。

public void setNumber(int value) {
this.number = value;
}

変数はスーパークラスの変数を上書きしないため、これを達成しようとしている方法は機能しません。

これが役立つことを願っています!

于 2012-08-09T13:22:08.497 に答える
1

ローカル変数を作成していますRealityが、printNumber()メソッドはまだ0のメンバー変数を参照しています。

ローカル変数を作成せずに、代わりに次のようにフィールドを使用する場合:

number = 1;

大丈夫でしょう。

フィールドの理解に問題がある場合は、いつでもここにある公式ドキュメントを参照できます: Oracle java docs

于 2012-08-09T13:20:37.823 に答える
-1
public class Reality extends Abstraction {
    int number = 1;
    public Reality() {
        this.printNumber();
    }
}

コードの上にnumberは、クラスのインスタンス変数Realityとスーパークラスの呼び出しメソッドがあります。スーパークラスでprintNumber()は、メソッドはnumber0で初期化されるため、値0を出力します。

のサブクラス変数値を取得する場合はnumber、次のようにメソッド引数として値を渡す必要があります。

public Reality(int num) {
    this.printNumber();
}
于 2012-08-09T13:38:01.370 に答える