web-dev-qa-db-ja.com

Java:親クラスメソッドを使用して子クラス変数にアクセスする

私は次のシナリオを持っています:

public class A {

    private int x = 5;

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


public class B extends A {

    private int x = 10;

    /*public void print()
    {
        System.out.println(x);      
    }*/

    public static void main(String[] args) {
        B b = new B();
        b.print();
    }

}

コードを実行すると、出力は次のようになります。5。

親クラスのメソッドを介して子クラス(B)の変数(x)にアクセスする方法

これは可能ですかなし print()メソッドをオーバーライドしますか(つまり、Bでコメント解除します)?

[オーバーライドすると、print()メソッドのコード全体を再度書き換える必要があるため、これは重要です。]

[〜#〜]編集済み[〜#〜]

より明確化:-

  • 質問の動機は、親クラスのメソッドから子クラスのプライベート変数の値を使用することです。これは、望ましい結果を達成するために親クラスのプライベート変数の値を変更する必要はありません。
  • しかし、ここに投稿された答えは、私が以下に投稿した私の望ましい答えに導きました。

(あなたの時間と助けに感謝します)

14
Jayant
class A {
    private int x = 5;

    protected int getX() {
        return x;
    }

    protected void setX(int x) {
        this.x = x;
    }

    public void print() {
        // getX() is used such that 
        // subclass overriding getX() can be reflected in print();
        System.out.println(getX());
    }
}

class B extends A {
    public B() {
        // setX(10);  // perhaps set the X to 10 in constructor or in main
    }

    public static void main(String[] args) {
        B b = new B();
        b.setX(10);
        b.print();
    }
}

[〜#〜]編集済み[〜#〜]

以下は、抽象クラスとメソッドを使用して同様のシナリオを解決する一般的な回答です。

abstract class SuperA {
    protected abstract Object getObj();

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

class A extends SuperA {
    @Override
    protected Object getObj() {
        // Your implementation
        return null; // return what you want
    }
}

class B extends A {
    @Override
    protected Object getObj() {
        // Your implementation
        return null; // return what you want
    }

    public static void main(String[] args) {
        B b = new B();
        b.print();
    }
}
12
Victor Wong

ここに投稿されたすべての回答を読んだ後、私は探していたものを手に入れました。以下は私の質問に対する最良の答えであると私が感じているものです:

_public class A {
    private int x = 5;    
    protected int getX(){
        return x; 
    }    
    public void print(){
        System.out.println(getX());
    }
}
public class B extends A {
    private int x = 10;
    protected int getX(){
        return x; 
    }  
    public static void main(String[] args) {
        B b = new B();
        b.print();
    }
}
_

保護されたゲッターを設定してオーバーライドすることは、print()メソッド自体をオーバーライドするよりも優れています。これは、printメソッドの代わりに、子クラス変数の値にアクセスする必要のある巨大なメソッドが存在する可能性があるためです。 s)。

7
Jayant

質問を解決するには、保護されているように親クラスAのフィールドを定義し(子クラスで継承されるようにする)、子クラスBのコンストラクター内にフィールド値xを設定する必要があります。printメソッドは、親クラスから直接呼び出すことができるクラス。

これがお役に立てば幸いです。

public class A 
{
    // fields declaration 
    protected int x = 5;

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



public class B extends A 
{

    public B()
    {
        // set child x value. The field have been defined in the parent class
        x = 10;
    }

    public static void main(String[] args) 
    {
        A a = new A();
        a.print(); // print 5

        B b = new B();
        b.print(); // print 10
    }

}
2
Fabio Lanciotti

必要な値のゲッターを公開し、子クラスでそれをオーバーライドする必要があります。

そのようです:

public class A {

    private int x = 5;

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

    protected void setX(int x)
    {
        this.x = x;
    }

    protected int getX()
    {
        return x;
    }

}


public class B extends A {

    /*public void print()
    {
        System.out.println(x);      
    }*/

    public B()
    {
        setX(10);
    }

    public static void main(String[] args) {
        B b = new B();
        b.print();
    }

}
0

いつでもコンストラクタに追加できます。

public class B extends A {

    //this line is unnecessary: private int x = 10;

    /*public void print()
    {
        System.out.println(x);      
    }*/

    public B()
    {
        x=10;
    }


    public static void main(String[] args) {
        B b = new B();
        b.print();
    }

}

試してみても機能しないのは、デフォルト値が一度しか評価されないためです。したがって、Aのデフォルトが5の場合、Bでデフォルトの10を使用しても5のままです。

0
user1241335