たとえば、クラスがありますMan
が保護されている場合、( class のインスタンス) がオブジェクト( class の別のインスタンス)の保護/プライベート属性を変更できるMan.age
理由がわかりません。彼はそれができないはずです(IMO)。chuckNorris
Man
age
jackBauer
Man
私の考えでは、保護/プライベート属性の値は、クラスではなく、オブジェクト自体にのみ属していると考えられています...
説明が必要だと思いますが、混乱しています。
マチューは正しい。cuckNorrisはjackBauer.ageを行うことができます
しかし、その上で問題はありません。Man 内部で Man インスタンス属性を参照している場合、それは Man クラスをコーディングしていることを意味するため、何をしているのかがわかります。
問題は、その Man クラスを渡すと、Man クラスがどのようにコーディングされているかを知らなくても Man 属性にアクセスできる場合です。
セッターとゲッターは、私が知らない、知る必要のないビジネス ロジックを実行している可能性があります。しかし、Mam をコーディングした人は知っています。
次の Java クラスを検討してください。
public class Base {
private int a
protected int b;
public Base(int a,int b) {
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public int getB() {
return b;
}
}
...
Base foo = new Base(1,2);
Base bar = new Base(3,4);
foo
インスタンスが保護された変数またはプライベート変数を変更できる方法はありません(おそらくダーティリフレクションを介する場合を除く)bar
必要に応じて許可することもできますが、
public class Base {
private int a
protected int b;
public Base(int a,int b) {
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public int getB() {
return b;
}
public void changeB(int newB,Base other) {
other.b = newB;
}
}
...
Base foo = new Base(1,2);
Base bar = new Base(3,4);
foo.changeB(5,bar);
changeB
オブジェクト内のものを変更することからメソッドを保護することはできませんother
[*]。プログラムの動作に注意する必要があります。一部の言語では、引数を unchangeable としてマークできますがother
、Java ではそうではありません。大したことではありません。
[*} のすべてのフィールドをBase
final としてマークすることで可能ですが、オブジェクトが構築された後にインスタンス自体でさえメンバーを変更することはできません。
プライベート属性は、クラス内のメソッドによってのみアクセスできます。保護された属性は、子孫クラスでのみアクセスできます。したがって、オブジェクト jackbauer は、クラス Man のオブジェクトchuckNorris でプライベートまたは保護されているものを変更できません。これが役立つことを願っています