ホームページ >Java >&#&チュートリアル >Java のアクセス許可修飾子の例を示した詳細な説明
アクセス許可シンボル:
(1) public:
メンバーの場合: 同じパッケージ内であっても、別のパッケージ内であっても、他のクラスはそれらにアクセスできます。
クラスの場合: 同じことが当てはまります。
(2)friendly:
メンバーに対して、私はいつもこう言います: クラスのメンバーに権限の変更がない場合、彼らはデフォルトのパッケージ アクセス権限を持ちます。これは、Friendly で表されます。Friendly はキーワードではないことに注意してください。 Java はこちら これは私が好きな表現方法です。同じパッケージ内の他のクラスはそれにアクセスできますが、パッケージの外にはアクセスできません。パッケージを使用しない同じフォルダー内のクラスの場合、Java はまずこれらのクラスをディレクトリ
に属するデフォルトのパッケージとして自動的に表示し、クラス内のフレンドリーなメンバーは相互に呼び出すことができます。たとえば、次の 2 つのクラスは同じフォルダー内の 2 つのファイルにありますが、パッケージは導入されていませんが、同じデフォルト パッケージに属しています。
class Sundae{ //以下两个方法缺省为friendly Sundae(){} Void f() {System.out.println(“Sundae.f()”); } public class IceCream{ public static void main(String[] args){ Sundae x = new Sundae(); x.f(); } }
クラスの場合: 同じパッケージ内のクラスが使用できます。つまり、クラスはパブリックまたはフレンドリーとしてのみ宣言できます。
(3)プライベート:メンバー向け: メンバーが所属するクラス内でのみアクセスできます。
class Sundae{ private Sundae(){}//只能在Sundae class中被调用 Sundae(int i) {} static Sundae makASundae() { return new Sundae(); } } public class IceCream{ public static void main(String[] args){ // Sundae class中构造函数Sundae()是private, // 所以不能用它进行初始化 //Sundae x = new Sundae(); Sundae y = new Sundae(1);//Sundae(int)是friendly,可以在此调用 Sundae z = Sundae.makASundae(); } }
クラスの場合: クラスをプライベートとして宣言することはできません。
(4)protected:
クラス、データメンバー、コンストラクター、メソッドメンバーはすべてデフォルトの権限を使用できます。つまり、キーワードを記述しません。デフォルトの権限は同じパッケージ権限です。同じパッケージ権限を持つ要素は、それらが定義されているクラス内および同じパッケージ内のクラス内でのみ呼び出すことができます。
例: package c05.local;
import pack1.Cookie; //注意:在这里ChocolateChip继承了类Cookie,按道理bite()方法也在 //ChocolateChip中,可以用x.bite直接调用,但是不可以的,因为类ChocolateChip //和Cookie类不在一个包中,各自具有包访问权限,为了能够使用x.bite()必须要把 //Cookie方法的访问权限换成public或者protected,但是一旦换成public所有的人就 //可以访问了,这样达不到隐私的要求,所以设置成protected最好,既可以顺利访问,也可以 //避免外面的类调用,保护好隐私的作用 public class ChocolateChip extends Cookie { public ChocolateChip() { System.out.println("ChocolateChip constructor"); } public static void main(String[] args) { ChocolateChip x = new ChocolateChip(); x.bite(); // Can't access bite } } ///:~
package pack1; public class Cookie { public Cookie() { System.out.println("Cookie constructor"); } protected void bite(){System.out.println("bite");} }
クラスの場合: クラスを保護されたものとして宣言することはできません
クラス権限の変更については、以下に詳しい説明があります:
クラスのアクセス権限:
public : によってアクセスできますすべてのクラス。デフォルト: デフォルトはフレンドリーと呼ばれます。ただし、Java 言語にはフレンドリー修飾子はありません。この名前は C++ から来ています。デフォルトのアクセス許可は、パッケージレベルのアクセス許可です。アクセス権修飾子を書かずにクラスを作成した場合、デフォルトのアクセス権では、たとえこのクラスがインスタンス化できたとしても、同じパッケージ内のクラスにアクセスできます (もちろん、このクラスがインスタンス化機能を持たない場合は、そのクラスのインスタンス化機能がただし、たとえば、このクラスはパブリック コンストラクターを提供しません)。
注:
1. 各コンパイル単位 (クラス ファイル) は、パブリック クラスを 1 つだけ持つことができます 2. パブリック クラスの名前 (大文字と小文字を含む) は、クラス ファイルと同じ名前にする必要があります。
3. パブリッククラスはクラスファイル(*.java)内に存在する必要はありません。 customers顧客(おそらくこのクラスを呼び出すクラス)はこれに悩まされており、しばらくすると、元のアプローチを完全に変更し、古いバージョンを完全に放棄し、新しいバージョンに置き換える可能性があります。
4. クラスをプライベートにしたり、保護したりすることはできません。
5. 特定のクラスのオブジェクトを生成したくない場合は、そのクラスのすべてのコンストラクターをプライベートに設定できます。ただし、この方法でも、このクラスのオブジェクトを生成できます。つまり、クラスの静的メンバー (プロパティとメソッド) が生成できます。
First.java:
package Number; import Test.*; public class Frist extends Test { protected String s1 = "你好"; public static void main( String[] args) { String s2 = "java"; //System.out.println(s1); System.out.println(s2); Frist t = new Frist(); System.out.println(t.s); t.show(); return; } } Test.java: package Test; public class Test { protected String s = "hello test"; //可以被同包中的类访问以及子类访问,该子类可以是与包Test不同 public void show() { Test1 t1 = new Test1(); return; } } class Test1 { Test1() { Test t = new Test(); System.out.println(t.s); } }
java hello test hello test