1

変更する必要のあるJavaパブリッククラスがあります(1つのメソッドのみ)。クラスはパッケージに含まれているため、最初のクラスを拡張する新しいクラスを作成し、変更する必要のあるメソッドをオーバーライドします。

クラスAは

public class A {
    GL gl;
    GLU glu;
    PGraphicsOpenGL pgrap;
    //other fields

    //constructor

    public void method() {
        this.gl = pgrap.gl;
        this.glu = pgrap.glu;
        //something else I don't want in class B
    }
}

クラスBは次のようなものです

public class B extends A {

    //constructor that recalls super()

    public void method() {
        super.gl = pgrap.gl;
        super.glu = pgrap.glu;
    }
}

しかし、次のエラーが発生しますsuper.gl = pgrap.glThe field A.gl is not visible。パッケージにgetterメソッドが記述されていません。どうすればよいですか?

ありがとう。

注:パッケージを再コンパイルしたり、クラスBをパッケージに追加したりすることはできません。

4

5 に答える 5

8

デフォルトのアクセス指定子は、次のインスタンスを使用してこの変数にアクセスできるpackage-privateのと同じパッケージ内のクラスを意味します。AA

A a = ....
a.gl = ...; // this works.

そして、package-privateメンバー(およびprivateメンバー)は継承されずprotectedpublicメンバーのみが継承されます。

A#method()はすでに割り当て操作を行っているので、呼び出しsuper.method()B#method()目的の動作を取得します。または、それらをとしてマークする必要がありますprotected

于 2012-10-03T12:13:58.397 に答える
3

クラスのメンバーへのアクセスの制御

A.glおよびA.gluはパッケージプライベートです(明示的な修飾子はありません)。それらにアクセスできる唯一の方法は、クラスBがクラスAと同じパッケージに含まれている場合です。

それらが保護されている場合は、必要に応じてアクセスできます。

保護された修飾子は、メンバーが(package-privateの場合と同様に)独自のパッケージ内でのみアクセスでき、さらに、別のパッケージ内のそのクラスのサブクラスからのみアクセスできることを指定します。

于 2012-10-03T12:16:33.737 に答える
2

フィールドglgluパッケージにアクセスできます。アクセス修飾子を使用protectedして、サブクラスでそれらにアクセスできるようにします。

于 2012-10-03T12:14:19.790 に答える
1

変数を次のように定義しますprotected.

protected int gl;
protected int glu;

変数にはデフォルトのアクセス権があるため、同じパッケージで変数にアクセスできます。protectedしたがって、子クラスがアクセスできるように、Bを移動するか、Bを定義する必要があります。

于 2012-10-03T12:15:35.703 に答える
1

Bクラスの同じパッケージでクラスを宣言できず、クラスAを直接変更できないと仮定すると、A選択はリフレクションによって行うことだけです。

public void method() {
  Field[] fields = this.getClass().getSuperClass().getDeclaredFields();

  for (Field field : fields) {
    if (field.getName().equals("gl")) {
      field.setAccessible(true);
      field.set(this, pgrap.gl);
    }
  }
}
于 2012-10-03T12:17:49.530 に答える