Javaのアクセス修飾子protectedで少しハマったので、調べた内容をメモしておきます。
通常、protectedと指定されたフィールドやメソッドは「同一package内と、そのクラスを継承したサブクラス内からアクセスできる」と説明されます。私自身も同様の理解だったのですが、次のようなケースで予想外の挙動となりました。
クラスBaseとChildが別のpackageに属する場合、
package base;
public class Base {
protected void baseMethod() {
System.out.println("Base method.");
}
}
package child;
import base.Base;
public class Child extends Base {
public void childMethod(Base base) {
base.baseMethod(); // NG
}
}
Childクラスの中でBaseクラスの引数を受け取ってbaseMethod()を呼び出そうとすると、”The method baseMethod() from the type Base is not visible”と怒られてしまうのです。
Continue reading →