興味深いコード スニペットを次に示します。
public class Superclass {
public static void main (String[] args){
Superclass obj = new Subclass();
obj.doSomething(); #prints "from Superclass"
}
private void doSomething(){System.out.println("from Superclass");}
}
class Subclass extends Superclass {
private void doSomething(){System.out.println("from Subclass");}
}
サブクラスがその親のプライベート メンバーを継承しないことはわかっていますが、ここで obj は、アクセスできないはずのメソッドを呼び出すことができます。コンパイル時には obj はタイプ Superclass であり、実行時にはタイプ Subclass です。
これはおそらく、doSomething() への呼び出しがドライバー クラス内で行われているという事実と関係があります。これはたまたま独自のクラスです (そして、そもそも doSomething() を呼び出すことができる理由)。
要するに、obj はその親のプライベート メンバーにどのようにアクセスできるのでしょうか?