Java の保護されたアクセス修飾子をナビゲートする
問題:
package1 の 2 つのクラス A を考えます。および package2 の C (C は A を拡張します)。クラス A はインスタンス変数を定義しますprotectedInt は protected 修飾子を使用して宣言されます。ただし、Eclipse は、クラス C からこの protectedInt にアクセスするとエラーを報告します。これは、他のパッケージからサブクラス内へのアクセスを許可するドキュメントの protected の定義と矛盾しているようです。
答え:
誤解は、保護されたアクセスが許可される特定の状況から生じます。 JLS (セクション 6.6.2) は、保護されたメンバーは実際に他のパッケージのサブクラスからアクセスできるが、そのサブクラスのインスタンスまたはサブクラスのサブクラスのインスタンスに対してのみアクセスできることを明確にしています。
具体的には、保護されたメンバーはフィールド アクセス式 (例: E.Id) またはメソッド呼び出し式 (例: E.Id(. . .)) を介してアクセスされる場合E の型は、サブクラス自体 (つまり、S) または S のサブクラスです。
指定されたシナリオでは、a.protectedInt にアクセスしようとするコードは、A のインスタンスを式 E として使用しています。 A は C のサブクラスではないため、このアクセスは JLS ルールに従って許可されません。
したがって、 protected 修飾子はサブクラス内の保護されたメンバーへのアクセスを許可しますが、サブクラスまたはそのサブクラスのインスタンスのみ。
以上がJava では、別のパッケージ内のサブクラスがそのスーパークラスの保護されたメンバーにアクセスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。