Java アクセス修飾子 (アクセス制御文字)
Java は、クラス、プロパティ、メソッドのアクセス許可やその他の機能を制御するために修飾子を使用します。修飾子は通常、ステートメントの先頭に配置されます。例:
public class className { // body of class } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] arguments) { // body of method }
Java には多くの修飾子があり、アクセス修飾子と非アクセス修飾子に分けられます。このセクションではアクセス修飾子のみを紹介します。アクセス修飾子以外の修飾子については後で紹介します。
アクセス修飾子はアクセス制御文字とも呼ばれ、クラス、メンバー変数、メソッドの使用権を制御できるキーワードを指します。
オブジェクト指向プログラミングでは、アクセス制御文字は非常に重要な概念であり、クラス、変数、メソッド、コンストラクターへのアクセスを保護するために使用できます。
Java は 4 つの異なるアクセス許可をサポートします:
public: public
public として宣言されたクラス、メソッド、コンストラクター、インターフェイスは、他のクラスからアクセスできます。
相互にアクセスする複数のパブリック クラスが異なるパッケージで配布されている場合は、対応するパブリック クラスが配置されているパッケージをインポートする必要があります。クラスの継承により、クラスのすべてのパブリック メソッドと変数はそのサブクラスに継承できます。
次のメソッドはパブリック アクセス制御を使用します:
public static void main(String[] arguments) { // body of method }
Java プログラムの main() メソッドは public に設定する必要があります。そうしないと、Java インタープリターはクラスを実行できません。
protected: protected
protected として宣言された変数、メソッド、およびコンストラクターは、同じパッケージ内の他のクラスからアクセスでき、また、異なるパッケージ内のサブクラスからもアクセスできます。
protected アクセス修飾子はクラスとインターフェイスを変更できません。メソッドとメンバー変数は保護済みとして宣言できますが、インターフェイスのメンバー変数とメンバー メソッドは保護済みとして宣言できません。
サブクラスは、 protected 修飾子で宣言されたメソッドと変数にアクセスできるため、無関係なクラスがこれらのメソッドや変数を使用しないように保護されます。
以下の親クラスは protected アクセス修飾子を使用し、サブクラスは親クラスの bark() メソッドをオーバーロードします。
public class Dog{ protected void bark() { System.out.println("汪汪,不要过来"); } } class Teddy extends Dog{ // 泰迪 void bark() { System.out.println("汪汪,我好怕,不要跟着我"); } }
bark() メソッドが private として宣言されている場合、Dog 以外のクラスはこのメソッドにアクセスできなくなります。 bark() が public として宣言されている場合、すべてのクラスがこのメソッドにアクセスできます。メソッドをそのクラスのサブクラスにのみ表示したい場合は、メソッドを保護済みとして宣言します。
private: private
private アクセス修飾子は最も制限の厳しいアクセス レベルであるため、プライベートとして宣言されたメソッド、変数、コンストラクターには、それらが属するクラスからのみアクセスでき、クラスとインターフェイスをプライベートとして宣言することはできません。
プライベート アクセス型として宣言された変数には、クラス内のパブリック Getter/Setter メソッドを介して外部クラスからのみアクセスできます。
プライベート アクセス修飾子の使用は、主にクラスの実装の詳細を隠し、クラスのデータを保護するために使用されます。
次のクラスはプライベート アクセス修飾子を使用します:
public class Dog{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
この例では、Dog クラスの name 変数と age 変数はプライベート変数であるため、他のクラスは変数の値を直接取得および設定できません。他のクラスが変数を操作できるようにするために、2 組のパブリック メソッド getName()/setName() と getAge()/setAge() が定義されており、これらはプライベート変数の値の取得と設定に使用されます。
これは Java のキーワードであり、この章で説明します。Java のこのキーワードの詳細な説明のプレビューをクリックできます。
クラス内のプライベート変数にアクセスするメソッドを定義するには、次のような名前を付けるのが一般的です。変数名の前に「get」または「set」を追加し、変数の最初の文字を大文字にします。たとえば、プライベート変数名を取得するメソッドは getName()、名前を設定するメソッドは setName() です。これらのメソッドは頻繁に使用され、Getter メソッドおよび Setter メソッドと呼ばれる特定の名前が付いています。
デフォルト: キーワードを使用しないでください
修飾子なしで宣言された属性とメソッドは、同じパッケージ内のクラスに表示されます。インターフェイス内の変数は暗黙的に public static Final として宣言され、インターフェイス内のメソッドのアクセス権はデフォルトで public になります。
次の例に示すように、クラス、変数、メソッドは修飾子なしで定義されます:
class Dog{ String name; int age; void bark(){ // 汪汪叫 System.out.println("汪汪,不要过来"); } void hungry(){ // 饥饿 System.out.println("主人,我饿了"); } }
アクセス制御と継承
次のメソッド継承に注意してください (継承の概念を理解していない読者はここをスキップできます) 、または「Java 継承とポリモーフィズムのプレビュー」をクリックします) ルール:
親クラスで public として宣言されたメソッドは、子クラスでも public である必要があります。
親クラスで protected として宣言されたメソッドは、サブクラスで protected または public として宣言されます。非公開と宣言することはできません。
親クラスでデフォルト修飾子を使用して宣言されたメソッドは、サブクラスでプライベートとして宣言できます。
親クラスでprivateとして宣言されたメソッドは継承できません。
アクセス制御文字の使用方法
アクセス制御文字を使用すると、コードのアクセス許可を簡単に制御できます:
他のすべてのクラスからアクセスできるように作成したクラスを作成する必要がある場合、クラスをパブリックとして扱います。
自分のパッケージ内のクラスのみがクラスにアクセスできるようにする必要がある場合は、アクセス制御文字を省略できます。
クラス内のメンバー データを制御する必要がある場合、このクラスのメンバー データ アクセス制御コードをパブリック、保護、または省略に設定できます。
Java変数のスコープ
Javaでは、変数のスコープはクラスレベル、オブジェクトインスタンスレベル、メソッドレベル、ブロックレベルの4つのレベルに分かれています。
类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 C/C++ 中的 static 变量对比学习。类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化。
对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问。
方法级变量就是在方法内部定义的变量,就是局部变量。
块级变量就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如 if、for 语句的块。块是指由大括号包围的代码,例如:
{ int age = 3; String name = "www.weixueyuan.net"; // 正确,在块内部可以访问 age 和 name 变量 System.out.println( name + "已经" + age + "岁了"); } // 错误,在块外部无法访问 age 和 name 变量 System.out.println( name + "已经" + age + "岁了");
说明:
方法内部除了能访问方法级的变量,还可以访问类级和实例级的变量。
块内部能够访问类级、实例级变量,如果块被包含在方法内部,它还可以访问方法级的变量。
方法级和块级的变量必须被显示地初始化,否则不能访问。
演示代码:
public class Demo{ public static String name = "微学苑"; // 类级变量 public int i; // 对象实例级变量 // 属性块,在类初始化属性时候运行 { int j = 2;// 块级变量 } public void test1() { int j = 3; // 方法级变量 if(j == 3) { int k = 5; // 块级变量 } // 这里不能访问块级变量,块级变量只能在块内部访问 System.out.println("name=" + name + ", i=" + i + ", j=" + j); } public static void main(String[] args) { // 不创建对象,直接通过类名访问类级变量 System.out.println(Demo.name); // 创建对象并访问它的方法 Demo t = new Demo(); t.test1(); } }
运行结果:
微学苑 name=微学苑, i=0, j=3
更多Javaのアクセス修飾子と変数スコープの説明相关文章请关注PHP中文网!