3

Java には、次の 3 つのレベルのアクセスがあります。

  • 公開 - 世界に公開
  • プライベート - クラスのみに公開
  • 保護 - クラスとそのサブクラスに対してのみ開かれます (継承)。

では、なぜ Java コンパイラはこれを許可するのでしょうか?

TestBlah.java:

public class TestBlah {

    public static void main(String[] args) {
        Blah a = new Blah("Blah");
        Bloo b = new Bloo("Bloo");
        System.out.println(a.getMessage());
        System.out.println(b.getMessage()); //Works
        System.out.println(a.testing);
        System.out.println(b.testing); //Works
    }
}

Blah.java:

public class Blah {
    protected String message;

    public Blah(String msg) {
        this.message = msg;
    }

    protected String getMessage(){
        return(this.message);
    }   
}

Bloo.java:

public class Bloo extends Blah {
    public Bloo(String testing) {
        super(testing);
    }
}
4

5 に答える 5

14

実際には次のようになります。

クラスとそのサブクラスと同じパッケージのクラスのみに公開(継承)

それが理由です

于 2008-12-02T03:20:08.200 に答える
11

保護されているとは、同じパッケージ内のサブクラスまたは他のクラスを意味するためです。

そして実際には、修飾子を省略した場合、同じパッケージ内の他のクラスへのアクセスを提供する 4 番目の "デフォルト" レベルのアクセスがあります。

protectedデフォルトとpublicアクセスの間もそうです。

于 2008-12-02T03:18:18.467 に答える
5

具体的にprotectedは、C++の場合と同じように機能することを期待しています。

ただし、Javaでは意味が異なります。Javaでは、保護されたメソッドをクラス(明らかに)、同じパッケージ内の他のすべてのクラス、およびこのクラスのサブクラスで使用できます。他のパッケージのクラスは、この元のクラスをサブクラス化しない限り、アクセスできません。

継承マーカーの詳細については、この同様の質問を参照してください。

個人的には、ほとんど使用していませんprotected。私はフレームワークではなくアプリケーションを開発しているので、publicメソッドやprivateデータを定義する可能性がはるかに高く、クラス全体をとしてマークすることがよくありfinalます。

于 2008-12-02T03:44:13.267 に答える
5

実際には、「公開」、「保護」、「非公開」の 4 つのレベルのアクセスがあります。デフォルトは、パッケージ プライベートまたはパッケージ保護とも呼ばれます。デフォルトでは、パッケージへのアクセシビリティが制限されます。デフォルトは非常に便利で、頻繁に使用しています。

于 2008-12-02T04:15:21.923 に答える
3

はを拡張し、保護されているため、呼び出すb.getMessage()ことができます。あなたが言及したように、保護されていると、サブクラスがメソッドにアクセスできます。bBlooBlahgetMessage()

ただし、次のエラーがあります。

  • コンストラクターでsuper()引数なしで呼び出すとエラーになります。String パラメーターを使用して定義したためBloo、コンパイラーはパラメーターのないコンストラクターを見つけることができません。Blah
  • メソッドの呼び出しnew Blah()TestBlah main、上記と同じ理由でエラーになります。
  • どのクラスにも変数を定義していないため、 and を参照するa.testingとエラーになります。b.testingtesting
于 2008-12-02T03:23:24.150 に答える