視聴者の皆様、今日は Java のアクセス修飾子に関する関連問題について説明します。これはインタビューでもよく聞かれる質問です。
簡単に言えば、アクセス修飾子は、コードにアクセスできるときとコードにアクセスできないときを区別するために、コード作成者によって作成されます。 Java のアクセス制限は、フレンドリー (いわゆるデフォルト タイプ)、パブリック、プライベート、プロテクトの 4 つのカテゴリに分類されます。
今日は、区別するのがより難しい 2 つのカテゴリ、つまりフレンドリーと保護について見ていきます。
まずフレンドリーについて見てみましょう。メンバーの前に修飾子を追加しない場合、メンバーのアクセス レベルは、現時点では、そのクラスと同じパッケージ内の他のクラスはこれらのメンバーにアクセスできますが、別のパッケージ内のクラスはアクセスできません。
package com.a1; /** * A属于 com.a1 这个包 * @author Will * */ public class A { //成员均为默认访问级别 int i; String str; void print(){ System.out.println("i:"+i+";str:"+str); } }
package com.a1; /** * testA1属于com.a1 * @author Will * */ public class testA1 { public static void main(String[] args) { //由于testA1与A属于同一个包下,所以可以访问友好型的成员 A a=new A(); System.out.println(a.i); System.out.println(a.str); a.print(); } }
package com.b1; import com.a1.A; /** * testA2属于com.b1 * * @author Will * */ public class testA2 { public static void main(String[] args) { // 由于testA2与A不属于同一个包下,所以不能访问友好型的成员 // 去掉注释符会报错 A a = new A(); //System.out.println(a.i); //System.out.println(a.str); //a.print(); } }
もちろん、読者は状況に遭遇するかもしれません。つまり、パッケージが指定されていない場合、異なるフォルダー内のクラス ファイルが相互にフレンドリーなメンバーを呼び出すことができます。その理由は次のとおりです。パッケージが指定されていない場合。 、すべてのファイルはデフォルトでデフォルト パッケージに属しているため、フレンドリーなメンバーを互いに呼び出すことができます。
次に、保護された型を見てみましょう。この型はフレンドリー (つまりデフォルト) 型と非常に似ていますが、唯一の違いは継承です。簡単に言うと、クラス ファイルが同じパッケージ (継承を含む) に属していない限り、他のクラス ファイルは友好的なメンバーにアクセスできませんが、クラスが継承する場合は、同じパッケージに属しているかどうかに関係なく、継承の場合、サブクラスは親クラスの保護されたメンバーにアクセスできます。