protected なコンストラクタは子クラスから単純な new ではアクセスできない
JLS2 6.6.2.2 より。でも、super() や無名クラス生成を通じてはアクセスできる。
package foo; public class ProtectedConstructor { protected ProtectedConstructor() { } }
package bar; import foo.ProtectedConstructor; class ProtectedConstructorChild extends ProtectedConstructor { ProtectedConstructorChild() { super(); ProtectedConstructor obj1 = new ProtectedConstructor() { }; ProtectedConstructor obj2 = new ProtectedConstructor(); // コンパイルエラー } }
要するに、protected というのは「単に自身を使うだけなのは(たとえ子クラスからでも)許さないが、子クラスで拡張する際の補助には使えるよ」という意味なのだろう。