たとえ子クラスからでもprotectedフィールドに無制限にアクセスできるわけではない

JLS2 6.6.2, 6.6.7 より。

package foo;
public class ProtectedField {
    protected int i;
}
package bar;
import foo.ProtectedField;
public class ProtectedFieldChild extends ProtectedField {
    int test(ProtectedFieldChild p) {
        // OK
        return p.i;
    }

    int test(ProtectedField p) {
        // コンパイルエラー。
        // 親クラス型であるProtectedFieldを通じては
        // i にアクセスできない。
        return p.i;
    }

    int test(ProtectedFieldGrandChild p) {
        // OK。ProtectedFieldGrandChild は
        // ProtectedFieldChild の子クラスだから。
        return p.i;
    }

    int test(buz.ProtectedFieldGrandChild p) {
        // OK。たとえ別パッケージでも、
        // 自身の子クラスならよい。
        return p.i;
    }

    class Inner {
        int test(ProtectedFieldChild p) {
            // OK。Inner は ProtectedField の子クラスではないが、
            // ProtectedField の子クラスの body の中だから。
            return p.i;
        }

        int test(ProtectedField p) {
            // コンパイルエラー。
            return p.i;
        }
    }
}

class ProtectedFieldGrandChild extends ProtectedFieldChild {
}
package buz;
public class ProtectedFieldGrandChild extends bar.ProtectedFieldChild {
}