Access ControlメカニズムがJavaで設計されているのはなぜですか?主な機能は2つあります。
(1)ユーザーが触れてはならない部品に触れないようにするためには、これらの部分は内部操作に必要ですが、クライアントプログラマーが必要とするインターフェイスの一部ではありません。
(2)クラスライブラリデザイナーがユーザーに大きな影響を与えることを心配することなく、クラスの内部作業を変更できるようにするため。
Javaのアクセス許可制御のレベルは次のとおりです。
public-> protected->パッケージアクセス(許可修飾子なし) - > private。
1。パッケージ
Javaのパッケージの概念は、C ++の名前空間の概念に非常に似ており、どちらもクラスの範囲を制限できます。 2つの最大の違いは、Javaのパッケージがクラスのツリー階層(およびJavaソースコードファイルのディレクトリ構造)を暗黙的に示していることです。これの利点は、クラスの独自性が、ファイルシステムのファイルパスの一意性の要件によって制限される可能性があることです。
1。コード組織
Javaソースコードファイル(.javaファイル)を作成するとき、このファイルは通常、コンパイルユニットと呼ばれます。コンピレーションユニットでは、最大で1つのパブリッククラスが許可されており、クラスの名前はファイル名(上品および小文字を含む)とまったく同じでなければなりません。
.javaファイルをコンパイルすると、.javaファイルの各クラスには.class出力ファイルがあり、ファイル名とクラス名は同じです。 Java Runnableプログラムは、パッケージ化してJavaドキュメントファイル(JAVAのJARドキュメントジェネレーターを使用したJARパッケージ)に圧縮できる。クラスファイルのセットです。 Javaインタープリターは、これらのファイルの検索、読み込み、解釈を担当しています。
クラスライブラリは、実際にはクラスファイルのセットです。各.javaファイルには、最大の1つのパブリッククラスと、任意の数の非公開クラスが許可されています。したがって、各ファイルにはアーティファクトがあります。これらのコンポーネントを整理したい場合(各ビルドには.javaファイルと複数の。クラスファイルがあります)、異なるグループを形成する場合は、Javaのキーワードパッケージを使用できます。
2。パッケージの関数
(1)クラスの検索と使用を容易にするために、同じパッケージ内の類似または関連する機能を備えたクラスまたはインターフェイスを整理します。
(2)フォルダーと同様に、パッケージはツリー型のディレクトリも使用してそれらを保存します。同じパッケージのクラス名は異なり、異なるパッケージのクラスの名前は同じである可能性があります。 2つの異なるパッケージに同じクラス名を持つクラスが同時に呼び出される場合、それらを区別するためにパッケージ名を追加する必要があります。したがって、パッケージは名前の競合を回避できます。
(3)パッケージもアクセス権を制限します。パッケージアクセス権を持つクラスのみがパッケージ内のクラスにアクセスできます。
3.パッケージを作成します
Javaでは、パッケージキーワードを使用して、コードが属するパッケージ(名前空間)を指定します。
構文形式:
パッケージPKG1 [。 PKG2 [。 pkg3…]];
注記:
(1)パッケージの名前は、コードのディレクトリ構造を暗黙的に指摘しています。
(2)同じディレクトリのパブリッククラス名(Javaファイル名)は一意でなければなりません。
(3)パッケージ宣言は、ソースファイルの最初の行にある必要があります。各ソースファイルには1つのパッケージ宣言のみがあり、このファイルの各タイプが適用されます。
(4)ソースファイルがパッケージ宣言を使用しない場合、クラス、関数、列挙、コメントなどが名前のないパッケージに配置されます。
(5)パッケージの名前は一般に小文字にあります。
例えば:
java.util.arrayListクラスのソースコードを確認すると、ファイルの最初の行が次のことがわかります。
パッケージjava.util;
そのコードディレクトリ構造は、Java/util/arraylist.javaです
4。インポートパッケージ
Javaでは、インポートキーワードを使用してパッケージをインポートします。
構文形式:
package1 [.package2…]。(classname |*);
例:
java.util.arraylistを例として見てみましょう。完全なクラスパスを持つ方法で使用することは非常に不便です。
java.util.arraylist <string> list = new Java.util.ArrayList <String>();
前のパスを省略したい場合は、インポートキーワードを使用できます。
java.util.arraylistをインポートします。
ファイルにパッケージをインポートした後、リストを宣言する以前のコードを次のように簡素化できます。
ArrayList <String> list = new ArrayList <String>();
2。アクセス権の修正者
1。パッケージ:パッケージアクセス許可
アクセス修飾子が提供されていない場合、パッケージアクセスであることを意味します。
デフォルトのアクセスにはキーワードはありませんが、通常はパッケージアクセスを指します(C ++の友人要素の概念に少し似ているように、フレンドリーとして表現されることもあります)。これは、パッケージ内の他のすべてのクラスがこのメンバーまたはメソッドにアクセスできることを意味しますが、このパッケージ外のすべてのクラスにアクセスできません。
例:
com.notes.packages.test.info
パッケージcom.notes.packages.test; publicclass info {void print(){system.out.println( "default method -print()"); }}com.notes.packages.test.publicdemo01
パッケージcom.notes.packages.test; publicClass publicDemo01 {publicStaticVoid main(string [] args){info x = new info(); x.print(); }}publicDemo01および情報は、同じパッケージの下でデフォルトレベルの情報 - print()にアクセスできます。
com.notes.packages.publicdemo02
パッケージcom.notes.packages; import com.notes.packages.test.info; publicClass publicdemo02 {publicStaticVoid Main(String [] args){info x = new info(); // x.print(); // エラー }}publicDemo02と情報は同じパッケージに含まれておらず、情報の方法のパッケージアクセス許可レベルにアクセスすることはできません-print()。
2。パブリック:インターフェイスアクセス許可
公開キーワードを使用すると、宣言されたメンバーまたはメソッドがすべての人がアクセスできることを意味します。
例:デフォルトレベルの許可例のprint()メソッド許可が公開に設定されている場合、publicdemo02にアクセスできます。
パッケージcom.notes.packages.test; publicClass info {publicVoid print(){system.out.println( "public method -print()"); }}3。プライベート:アクセスできません
秘密のキーワードを使用すると、宣言されたメンバーまたはメソッドが、このクラスを除く他のクラスにアクセスできないことを意味します。
アプリケーションシナリオ:シングルトンモード
4。保護:アクセス許可を継承します
新しいクラス(チャイルドクラスまたは派生クラスと呼ばれる)は、継承を介して既存のクラス(親クラスまたはベースクラスと呼ばれる)を再利用し、ベースクラスのメンバーと方法を拡張できます。ベースクラスの作成者は、特定のメンバーがすべてのクラスではなく、派生クラスにアクセスを割り当てることを望む場合があります。一般の人々はこれを行うことができず、この目的のために、保護された仕事をするために導入されました。 Protectedは、パッケージアクセス、つまり、派生したクラスや同じパッケージ内の他のクラスも保護されたメンバーまたはメソッドにアクセスできるようにします。
例:サブクラスが親クラスを継承した後、親クラスの保護されたメンバーにアクセスできます。
クラス父{プライベート文字列a = "private";保護された文字列b = "Protected"; public string c = "public";};クラスの息子は父親を拡張します{publicvoid print(){// System.out.println( "要素A:" + super.a); //エラーSystem.out.println( "要素B:" + super.b); System.out.println( "要素C:" + super.c); }} publicClass ProtectedDemo01 {publicStaticVoid main(string args []){son sub = new Son(); sub.print(); }};アクセス修飾子に関するメモ
以前の例では、クラスのメンバーと方法は、さまざまな許可修飾子で変更できます。
さらに、注意を払うポイントがいくつかあります。
(1)静的メンバーと静的メソッドの許可修飾子の使用は、通常のメンバーおよび方法と同じです。
(2)クラスは修飾子によって変更することもできますが、プライベートと保護された2つの許可の修辞的な単語を使用することはできません。
(3)一部の本では、パッケージアクセスはデフォルトアクセスとも呼ばれます。これは、デフォルトのキーワードであるJava SE8の新機能と簡単に混同されるため、私は個人的にこのように覚えることをお勧めしません。このキーワードはインターフェイスにのみ使用できます。その機能は、プログラマーがインターフェイス内のインターフェイスのデフォルトの実装を定義できるようにするためです(過去のJDKバージョンではこれを許可しませんでした。インターフェイスでのみメソッドを宣言できます)。
上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。