8

Javaの初心者向けの質問があります。Parent.print()はコンソールに「hallo」を出力しますが、Child.print()も「hallo」を出力します。「子」を印刷する必要があると思いました。どうすればこれを解決できますか?

public class Parent {

    private String output = "hallo";

    public void print() {
        System.out.println(output);
    }

}

public class Child extends Parent {

   private String output = "child";

}
4

4 に答える 4

9

現在、2つの別々の変数があり、のコードはParentについてしか認識していませんParent.outputParent.outputの値を「子」に設定する必要があります。例えば:

public class Parent {

  private String output = "hallo";

  protected void setOutput(String output) {
    this.output = output;
  }

  public void print() {
    System.out.println(output );
  }
}

public class Child extends Parent {
  public Child() {
    setOutput("child");
  }
}

別のアプローチは、Parentクラスに目的の出力を取得するコンストラクターを与えることです。

public class Parent {
  private String output;

  public Parent(String output) {
    this.output = output;
  }

  public Parent() {
    this("hallo");
  }

  public void print() {
    System.out.println(output );
  }
}

public class Child extends Parent {
  public Child() {
    super("child");
  }
}

それは本当にあなたが何をしたいかに依存します。

于 2010-11-15T19:36:21.713 に答える
3

ChildParentであるため、のoutputインスタンス変数にアクセスできませんprivate。あなたがする必要があるのはそれを作ることであり、 setprotectedのコンストラクターで。Childoutput"child"

つまり、2つのoutput変数は異なります。

protected出力を次のように変更した場合にも、これを行うことができますParent

public void print(){
    output = "child"
    super.print();
}
于 2010-11-15T19:35:13.943 に答える
1

子が「子」を出力しない理由は、javaの継承では、フィールドではなくメソッドのみが継承されるためです。変数outputは子によってオーバーライドされません。

あなたはこのようにそれを行うことができます:

public class Parent {
    private String parentOutput = "hallo";

    String getOutput() {
        return output;
    }

    public void print() {
        System.out.println(getOutput());
    }
}

public class Child extends Parent {
    private String childOutput = "child";

    String getOutput() {
        return output;
    }
}

また、String変数は別の名前である必要はありませんが、わかりやすくするためにここで名前を変更しました。

もう1つの、より読みやすい方法は、これを行うことです。

public class Parent {
    protected String output;

    public Parent() {
        output = "hallo";
    }

    public void print() {
        System.out.println(output);
    }
}

public class Child extends Parent {
    public Child() {
        output = "child";
    }
}

この例では、変数はです。これprotectedは、親と子の両方から読み取ることができることを意味します。クラスのコンストラクターは、変数を目的の値に設定します。この方法では、print関数を1回だけ実装し、オーバーライドされたメソッドを複製する必要はありません。

于 2010-11-15T19:57:45.003 に答える
0

extendキーワードを理解しようとしたとき、私は2つのクラスを使用していました。それが基本的な考え方の理解にも役立つことを願っています。

Parent.java

public class Parent {
    private int a1;
    private int b1;


    public Parent(int a, int b){
        this.a1 = a;
        this.b1 = b;
    }

    public void print() {
        System.out.println("a1= " + this.a1 + " b1= " + this.b1);
    }

}

Child.java

public class Child extends Parent {
        public Child(int c1, int d1){
        super(c1,d1);
    }

    public static void main(String[] args) {
        Parent pa = new Parent(1,2);
        pa.print();
        Child ch = new Child(5,6);
        ch.print();
    }

}
于 2015-03-02T13:20:25.787 に答える