17

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

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()メソッドのコード全体を再度書き直す必要があるため、これは重要です]

編集済み

より明確にする:-

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

(お時間を割いてご協力いただきありがとうございます)

4

5 に答える 5

16
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();
    }
}
于 2012-07-04T02:02:20.803 に答える
8

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

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メソッドの代わりに他の巨大なメソッドが存在する可能性があるため、保護されたゲッターを設定してオーバーライドする方が、メソッド自体をオーバーライドするよりも優れています。

于 2012-07-28T12:30:05.490 に答える
3

質問を解決するには、保護されたように親クラス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
    }

}
于 2014-08-01T15:26:39.733 に答える
0

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

そのようです:

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

}
于 2012-07-04T01:40:12.043 に答える
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();
    }

}

試してみても機能しない理由は、デフォルト値が評価されるのは1回だけだからです。したがって、Aでデフォルトの5の場合、Bでデフォルトの10を使用しても、5のままになります。

于 2012-07-04T01:40:30.933 に答える