Java初心者の質問:Parent.print()はコンソールに「hallo」を出力しますが、Child.print()も「hallo」を出力します。「child」を出力する必要があると思いました。 。どうすればこれを解決できますか?
public class Parent {
private String output = "hallo";
public void print() {
System.out.println(output);
}
}
public class Child extends Parent {
private String output = "child";
}
現在、2つの別個の変数があり、Parent
のコードはParent.output
についてのみ認識しています。 Parent.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");
}
}
それは本当にあなたが何をしたいかに依存します。
Child
はParent
であるため、output
のprivate
インスタンス変数にアクセスできません。あなたがする必要があるのはそれをprotected
にし、Child
のコンストラクターでoutput
を"child"
に設定することです。
つまり、2つのoutput
変数は異なります。
protected
で出力をParent
に変更した場合にも、これを行うことができます。
public void print(){
output = "child"
super.print();
}
子が「子」を出力しない理由は、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関数を一度だけ実装し、重複するオーバーライドされたメソッドを必要としません。
私が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();
}
}