Java のアクセス許可修飾子の例を示した詳細な説明

高洛峰
リリース: 2017-01-24 15:36:29
オリジナル
2324 人が閲覧しました

アクセス許可シンボル:
(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:

メンバーの場合: 同じパッケージ内のクラスはアクセスできます (パッケージ アクセス権)。基本クラスは、すべてのクラスではなく、保護されたクラスを通じて派生クラスへのアクセス権を基本クラスのメンバーに付与します (派生クラス アクセス)。許可)。

(5)default (デフォルトの権限)

クラス、データメンバー、コンストラクター、メソッドメンバーはすべてデフォルトの権限を使用できます。つまり、キーワードを記述しません。デフォルトの権限は同じパッケージ権限です。同じパッケージ権限を持つ要素は、それらが定義されているクラス内および同じパッケージ内のクラス内でのみ呼び出すことができます。

例: 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
ログイン後にコピー

Java のアクセス許可修飾子の例と詳細な説明については、PHP 中国語 Web サイトの関連記事に注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート