web-dev-qa-db-ja.com

Java拡張例

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";

}
8

現在、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");
  }
}

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

9
Jon Skeet

ChildParentであるため、outputprivateインスタンス変数にアクセスできません。あなたがする必要があるのはそれをprotectedにし、Childのコンストラクターでoutput"child"に設定することです。

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

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

public void print(){
    output = "child"
    super.print();
}
3
Jeremy

子が「子」を出力しない理由は、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
Mike Miller

私が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();
    }

}
0
KostasA