2005年4月のSybexCompleteJava 2認定研究ガイド(ISBN0782144195)を読んでいます。この本は、Java認定に合格したいJava開発者を対象としています。
アクセス修飾子(および他の修飾子)に関する章の後で、次の質問(#17)を見つけました:
正誤問題:クラスYがクラスXを拡張し、2つのクラスが異なるパッケージにあり、クラスXにabby()という保護されたメソッドがある場合、Yの任意のインスタンスがYの他のインスタンスのabby()メソッドを呼び出すことができる。
この質問は私を少し混乱させました。
私の知る限り、同じクラス(またはサブクラス)の任意の変数で保護されたメソッドを呼び出すことができます。階層の上位にある変数(実装するインターフェースなど)で呼び出すことはできません。
たとえば、オブジェクトを継承したからといって、オブジェクトのクローンを作成することはできません。
しかし、質問は変数型については何も述べておらず、インスタンス型についてのみ述べています。
少し戸惑い、「本当」と答えました。
本の答えは
誤り。別のパッケージのスーパークラスから保護されたメソッドを継承するオブジェクトは、それ自体でそのメソッドを呼び出すことができますが、同じクラスの他のインスタンスでは呼び出すことはできません。
ここでは、変数タイプについては何もありません。インスタンスタイプについてのみです。
これは非常に奇妙です、私はそれを理解していません。
誰かがここで何が起こっているのか説明できますか?