視聴者の皆様、今日は Java のアクセス修飾子に関する関連問題について説明します。これはインタビューでもよく聞かれる質問です。
簡単に言えば、アクセス修飾子は、コードにアクセスできるときとコードにアクセスできないときを区別するために、コード作成者によって作成されます。 Java のアクセス制限は、フレンドリー (いわゆるデフォルト タイプ)、パブリック、プライベート、プロテクトの 4 つのカテゴリに分類されます。
今日は、区別するのがより難しい 2 つのカテゴリ、つまりフレンドリーと保護について見ていきます。
まずフレンドリーについて見てみましょう。メンバーの前に修飾子を追加しない場合、そのメンバーのアクセス レベルは、現時点では、そのクラスと同じパッケージ内の他のクラスはこれらのメンバーにアクセスできますが、異なるパッケージ クラス内の他のクラスはアクセスできません。これらのメンバーは次のようになります:
Java code
package com.a1;
/**
* A はパッケージ com.a1 に属します
* @author Will
*
*/
public class A {
//メンバーはすべてデフォルトのアクセスレベル
int i ;
String str;
void print(){
}
}
Java コード
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.str);
}
}
Java コード package com.b1;
import com.a1.A;
/**
* testA2 は com.b1 に属します
*
* @author Will
*
*/
public class testA2 {
パブリック静的ボイドMain (String [] ARGS) {
// testa2 は A と同じパッケージに属していないため、フレンドリーなメンバーにアクセスできません
// コメントを削除するとエラーが報告されます );パッケージが指定されていない場合、異なるフォルダー内のクラス ファイルが相互にフレンドリーなメンバーを呼び出すことができるという状況が発生します。これは、パッケージが指定されていない場合、すべてのファイルがデフォルトでデフォルトのパッケージに属するためです。メンバー同士を呼び合うことができます。
次に、保護された型を見てみましょう。この型はフレンドリー (つまりデフォルト) 型と非常に似ていますが、唯一の違いは継承です。簡単に言うと、クラス ファイルが同じパッケージ (継承を含む) に属していない限り、他のクラス ファイルは友好的なメンバーにアクセスできませんが、クラスが継承する場合は、同じパッケージに属しているかどうかに関係なく、継承の場合、サブクラスは親クラスの保護されたメンバーにアクセスできます。
Java コード
package com.a1;
/**
* A はパッケージ com.a1 に属します
* i、str はフレンドリー型です
* j、str1 は保護型です
* @author Will
*
*/
String str;
protected String str1;
Public A(){
}
void print(){
System.out.println("i:"+i+";str:"+str)
}
protected void print( int k){
print(int k)
package com.a1 /** * testA1 は com.a1 に属します * @author Will *
*/
public class testA1 {
public static void main(String[] args) {
メンバー可以// ProteCted 型のメンバーにもアクセスできます
a a a = new a ();
system.out.println(a.j); System.out.println(a.str1);
Java コード
package com.b1;
import org.junit.Test
public void test()延長します延長します= New Extendsa ();
// パッケージと継承がなくなると、親に優しいメンバーを呼び出すことができなくなります
// .println (extendsA.i); 継承の場合、Callable の親クラスは protected になります。メンバー
System.out.println(extendsA.j);
extendsA.print(1) }
;