5

setCoors(int x, int y) というプライベート メソッドを持つクラスが与えられます。そのクラスのコンストラクターにも setCoors があります。別のクラスでは、setCoors を呼び出すメソッド setLocation が必要です。これは可能ですか?

新しい質問:

メソッドをパブリックに設定することが許可されていない場合、これは可能ですか?

public class Coordinate{
    public Coordinate(int a, int b){
        setCoors(a,b)
    }
    private void setCoords(int x, int y)
}

public class Location{
    private Coordinate  loc;
    public void setLocation(int a, int b)
        loc = new Coordinate(a,b)
}
4

6 に答える 6

7

最善かつ最も役立つ回答は、質問の文脈によって異なります。

質問がプライベートの意図された意味についての初心者の質問である場合、答え「いいえ」は完全に適切です. あれは:

  • A のプライベート メンバーは、クラス A 内でのみアクセスできます
  • A のパッケージ プライベート メンバーは、A のパッケージ内のクラス内でのみアクセス可能です。
  • A の保護されたメンバーは、A のパッケージ内のクラスおよび A のサブクラス内でのみアクセス可能です。
  • A のパブリック メンバーは、A が表示されている場所ならどこからでもアクセスできます。

さて、もし、これは一筋縄ではいかないかもしれませんが (ブライアンに感謝します :))、その質問は、「プライベートはプライベートを意味することは知っていますが、言語の抜け穴はありますか?」という質問を見ている、より「高度な」コンテキストから来ている」 では、まあ、そのような抜け穴があります。こんなふうになります:

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

class C {
    private int x = 10;
    private void hello() {System.out.println("Well hello there");}
}

public class PrivateAccessDemo {
    public static void main(String[] args) throws Exception {
        C c = new C();
        List<Field> fields = Arrays.asList(C.class.getDeclaredFields());
        for (Field f: fields) {
            f.setAccessible(true);
            System.out.println(f.getName() + " = " + f.get(c));
        }
        List<Method> methods = Arrays.asList(C.class.getDeclaredMethods());
        for (Method m: methods) {
            m.setAccessible(true);
            m.invoke(c);
        }
    }
}

出力:

x = 10
Well hello there

もちろん、これは実際にはアプリケーション プログラマーが行うことではありません。しかし、そのようなことができるという事実は知っておく価値があり、無視すべきものではありません。とにかく私見。

于 2011-10-08T05:31:09.330 に答える
5

いいえ、privateメソッドが定義されているクラス内でのみメソッドを呼び出すことができることを意味します。setLocationにあるクラスの新しいインスタンスを作成するsetCoordsか、 の可視性を変更する必要があるでしょうsetCoords

編集:投稿したコードは機能します。クラスのすべてのインスタンスがLocation独自のCoordinateオブジェクトにバインドされることに注意してください。コード内の別の場所に新しいCoordinateオブジェクトを作成すると、その内部状態を変更できなくなります。言い換えれば、ライン

Coordinate myCoord = new Coordinate(4, 5);

座標とmyCoordを永遠に持つオブジェクトを作成します。45

于 2011-10-08T05:28:03.670 に答える
4

privateプライベートであることを意味します

他のクラスに呼び出させたい場合は、プライベートにしない方がよいのではないでしょうか?

于 2011-10-08T05:26:55.473 に答える
3

子供が宿題をする: 答えはノーです。彼の仕事のためにクレイジーな回避策が必要なガイ: 答えはイエスです。ただし、はるかに重要なのは、setCoorsメソッドが int 引数を取らないことです。SilverBullet2 つのオブジェクトを取る必要があります。

于 2011-10-08T05:50:10.090 に答える
3

privateメソッドが定義されているクラスの外部からアクセスできないメソッドはありません

于 2011-10-08T05:28:12.453 に答える
1

private定義されたクラス内でのみアクセスできることを意味します。

于 2011-10-08T05:29:53.640 に答える