[#0 x 004]classおよびclassメンバーへのアクセス権について

1863 ワード

1.classのアクセス権
 
classのアクセス権はpublicとpackageの2種類のみで、privateとprotectedは存在しません(内部クラスは特例です).各コンパイルユニット(すなわち.javaファイル)には、最大1つのpublic classしかありません.また、ある場合は、public class名がファイル名と同じである必要があります.classアクセス権限はmemberアクセス権限の基礎です.2.メンバーのアクセス権
classがアクセス可能である場合、memberのアクセス権限は意味があります.private、package、protected、public、具体的には詳しくは言いません.protectedにはpackage権限が含まれています.
 
7月27日補足:メンバーのアクセス権はクラスに対して
public:すべてのクラスに表示されます.
protectd:Ext Class表示+package.
package:同じpkg内のクラスに表示されます.
private:memberが存在するクラスのみが表示されます.
私たちがここで言っているのはすべてClassで、Objectではありません.時には理解の上でこのような混同があります:
class Test
{
	private int i;
}

public class PrivateTest
{
	public static void main(String[] args)
	{
		Test t = new Test();
		System.out.println("i = " + t.i); // syntax error
	}
}

私たちは確かにTestオブジェクトtを獲得し、iも確かにtのmemberですが、iにアクセスするのはPrivateTestクラスで、privateの定義によると、ここでは依然としてエラーが発生します.
したがって、memberのアクセス権は、オブジェクトではなくクラスに対してです.単純にオブジェクト(参照)を取得すれば、オブジェクト内のすべてのメンバーに自由にアクセスできるとは思えない.
 
10月10日補足:見える意味
クラスAのフィールドiがクラスBに対して表示されている場合、クラスBではクラスのオブジェクトによって参照できます(A a=new A();(staticフィールドの場合はクラス名)でフィールドiにアクセスします.すなわち、クラスBにa.iを直接書くことができます(staticフィールドの場合はA.iを書くことができます).
では、クラスAのフィールドiが次の場合、振り返ってみましょう.
public:すべてのクラスに表示-->すなわち、すべてのクラスにa.iまたはA.iと書くことができます.
protectd:Ext Classの表示+package-->すなわち、クラスAと同じパッケージのクラスのみ、またはクラスAのサブクラスにa.iまたはA.iと書くことができる
package:同じpkg内のクラスが表示されます-->すなわち、クラスAと同じパッケージのクラスにa.iまたはA.iと書くことができるのは、クラスAと同じパッケージのクラスのみです
private:メンバーが存在するクラスのみが表示されます-->すなわち、クラスA自体のみがa.iまたはA.iを直接使用できます
 
ここではもう一つの問題に関連しています.つまり、私自身がよく使う表現:private、packageは継承できません.実はここprivate,package権限フィールドはサブクラスが見えないため継承できません.[#0 x 006]では、ext classは暗黙的にbase classを含むと理解でき、base classはmemberのアクセス権に基づいてmemberをext classに露出するかどうかを決定する.