Java 4 アクセス制御権限

1. 背景:

        Java のクラス メンバーのアクセス制御権限を理解する

2.Java には 4 つのアクセス制御権限があります。

        プライベート、プロテクト、パブリック、デフォルト

彼らの具体的なアクセス権は何ですか? 例を使って分析してみましょう:

ここには、内部アクセス、継承関係、同じパッケージ、異なるパッケージなど、いくつかのシナリオがあります

(1) まず、2 つのパッケージを作成する必要があります。

com.test.accessrights.pk1 および com.test.accessrights.pk2 は、異なるパッケージ間のアクセス権の違いをテストするために使用されます。

次に、親クラスとして父クラスを作成し、それを pk1 パッケージに配置し、次の 4 つの属性を作成します。

public class Father {
    private String param1 ="这是private";
    protected String param2 ="这是protected";
    public String param3 = "这是public";
    String param4 ="这是default";
}

次に、Father クラス内で 4 つのプロパティにアクセスできるかどうかをテストします。

public class Father {

private String param1 ="这是private";
protected String param2 ="这是protected";
public String param3 = "这是public";
String param4 ="这是default";

public static void main(String[] args) {
    Father father = new Father();
        System.out.println("father 实例访问:"+father.param1);
        System.out.println("father 实例访问:"+father.param2);
        System.out.println("father 实例访问:"+father.param3);
        System.out.println("father 实例访问:"+father.param4);}
}

コードにはコンパイル エラーはなく、 4 つの型すべてがクラス内アクセスをサポートしていることがわかります

次に、pk1 パッケージに Child クラスを作成し、Father クラスを継承し、Father オブジェクトと Child オブジェクトを通じてそれぞれプロパティにアクセスします。

public class Child extends Father{

public static void main(String[] args) {

Father father = new Father();
System.out.println(father.param2);
System.out.println(father.param3);
System.out.println(father.param4);

Child child = new Child();
System.out.println(child.param2);
System.out.println(child.param3);
System.out.println(child.param4);

}

}

同じパッケージ内で、サブクラスは親クラスのプライベート型以外の型の属性とメソッドにアクセスできることがわかります

(2) では、同じパッケージ内にない場合でも、サブクラスのアクセス権は上記の例と同じでしょうか?

pk2 パッケージ内に Child2 クラスを作成し、Father クラスから継承し、Father オブジェクトを作成してそのプロパティにアクセスすると、パブリック型である param3 のみにアクセスでき、他の型にはアクセスできないことがわかります。

 

次に、Child2 クラスのオブジェクトを作成し、サブクラス経由で親クラスの属性にアクセスして様子を確認すると、保護されたパブリック型である param2 と param3 にアクセスできることがわかりました。

 

このことから、 privateの場合はクラス内でのみアクセスできることがわかりますが、 protected の場合は、現在、内部アクセスに加えて、異なるパッケージ内であってもサブクラスからもアクセスできます。デフォルトの場合、内部アクセスに加えて、サブクラスがアクセスする場合は同じパッケージの条件を満たす必要がありますが、パブリックの場合は、現時点では制限はありません。

(3) それで、他に何か状況はありますか?継承関係にない同じパッケージ内のどのクラスがアクセスできるかをテストしてみましょう。

pk1 パッケージで、Stranger クラスを作成し、Father、Child、Child2 オブジェクトを作成し、プロパティにアクセスする方法を確認します。

public class Stranger {

public static void main(String[] args) {

Father father=new Father();
System.out.println("father对象访问:"+father.param2);
System.out.println("father对象访问:"+father.param3);
System.out.println("father对象访问:"+father.param4);

Child child = new Child();
System.out.println("child对象访问:"+child.param2);
System.out.println("child对象访问:"+child.param3);
System.out.println("child对象访问:"+child.param4);

Child2 child2 =new Child2();
System.out.println("child2对象访问:"+child2.param2);
System.out.println("child2对象访问:"+child2.param3);}
}

Father オブジェクトと Child オブジェクトはどちらも param1 以外の他の属性にアクセスできます。これは、同じパッケージ内の protected が同じパッケージ内の非サブクラス アクセスを満たし、default も同じパッケージ内の非サブクラス アクセスを満たすことを示しています

Child2 は Stranger の同じパッケージ内のクラスではないため、Stranger は Child2 の param2 属性と param3 属性にのみアクセスできます。これは何を意味しますか?

次に、pk2 に Stranger2 クラスを作成し、それを使用して、Father、Child、および Child2 に対応するプロパティにアクセスします。

public class Stranger2 {

public static void main(String[] args) {

Father father=new Father();
System.out.println("father 实例访问:"+father.param3);
Child child = new Child();

System.out.println("child 实例访问:"+child.param3);

Child2 child2 = new Child2();
System.out.println("child2 实例访问:"+child2.param3);}
}

最後に、public である param3 のみにアクセスできることがわかりました。これまでのところ、少なくとも public には制限がなく、private には最も多くの制限があることがわかります。では、残りの 2 つ (protected とdefault) のルールは何ですか? 。

上記の例からわかるように、同じパッケージ内では、Father クラスの protected 属性はサブクラスからアクセスでき、同じパッケージ内の他のクラスからもアクセスできます。他のパッケージでは、protected 属性サブクラスでは、サブクラスを介してアクセスされます。オブジェクト アクセスは、親オブジェクトを介してアクセスすることはできません。また、他のクラスでもアクセスできません。同じパッケージ内で、親クラスデフォルト属性は、サブクラスからアクセスでき、また、他のクラスからもアクセスできます。 Stranger2 から クラス内のからの結論は、異なるパッケージ内の他のクラスからはデフォルトにアクセスできないということですが、この属性には Stranger クラスの child2 を通じてアクセスすることはできず、Child2 クラスの例を通じて、この属性にアクセスすることはできません。 child2 オブジェクトにもアクセスできないことがわかります。Father クラスのデフォルト属性にアクセスするということは、他のパッケージのサブクラスからデフォルトにアクセスできないことを意味するため、サブクラスであるかどうかに関係なく、他のパッケージのクラスからデフォルトにアクセスすることはできません。

【表を使ってまとめる】

アクセス制御権限 (はいはアクセスできることを意味します)
プライベート デフォルト 保護された 公共
同じカテゴリ はい はい はい はい
同じパッケージ内のクラス はい はい はい
サブクラス はい はい
他のパッケージのクラス はい

おすすめ

転載: blog.csdn.net/u013302168/article/details/132483164