0

なぜ「保護された」言葉が必要なのか、誰か説明してもらえますか? 私の理解が正しければ、

デフォルト アクセス: 同じパッケージ内のクラスで使用できます。

保護されたアクセス: 同じパッケージ内の既定のアクセス + 任意のパッケージ内の継承されたクラス (サブクラス) で利用可能。基本的に、同じパッケージで同じデフォルト アクセス権を取得します。

では、いつ使用する必要がありますか?コードのスタイルだけですか?継承の観点からそれを扱うつもりであることを示すために?
ありがとうございました。

package firstPack;

public class First {
    protected int a;
    protected void Chat(){
        System.out.println("Here I am");
    }
}

package secondPack;  

import firstPack.First;

public class Second extends First{
    public static void main(String [] args){
        First f=new First();
//      f.Chat();
//      System.out.println(f.a);
    }
}

このコードを使用してテストしました。うまくいきませんでした。

4

3 に答える 3

2

protected同じパッケージ内のサブクラスだけでなく、すべてのサブクラスに表示されることを意味します。

于 2013-10-16T19:08:10.657 に答える
0

First テストコードの問題は、クラスインスタンスの保護されたメンバーにFirstクラス参照を介してアクセスしようとしていることです。Secondクラスは同じパッケージに含まれFirstていないため、基本クラスのインスタンスの保護されたフィールドにはアクセスできませんがクラスから継承された独自のフィールドFirst(クラスを含む) にはアクセスできることに注意してくださいprotected。だから何か

First f = new First();
f.chat();//chat is protected in base class.

Secondクラスではコンパイルされませんが、次のようなものです

public void test() {
    a = 1;  // have access to inherited protected field or 
    chat(); // methods of base class 
}

public static void main(String[] args) {
    Second f = new Second();
    f.chat();
    System.out.println(f.a);
}

Second クラスは継承されたメンバーにアクセスできるため、問題ありません。

派生クラスまたは同じパッケージ内のクラスのみがその保護されたメンバーにアクセスできるため、mainメソッド内のコードはクラス内に配置されているためにのみ機能することに注意してください。したがって、このコードが次のような他のクラス内に配置される場合SecondFirst

class Test{
    public static void main(String[] args) {
        Second f = new Second();
        f.chat();
        System.out.println(f.a);
    }
}

Testコンパイルされません(拡張されていないか、と同じパッケージにないため、保護されたメンバーにアクセスできませんFirst)。

于 2013-10-16T19:40:44.047 に答える
0

protected修飾子: 同じパッケージ内の他のクラス、またはそれらが参照されているクラスのサブクラス (つまり、同じパッケージまたは別のパッケージ) によってアクセスさます。

参照

ここに画像の説明を入力

于 2013-10-16T19:10:07.163 に答える