子类对象无法调用protected方法

子类对象无法调用protected方法 都知道protected权限包括同一个包默认的包访问权限和子类的访问权限。但对于子类的访问权限可能有些模棱两可。这里先给出结论在不同包中的子类的类定义中可以使用父类的protected方法但在不同包的子类对象不可以通过这个子类对象来调用protected方法。测试代码在com包中有个用来继承的基类分别有一个成员函数和静态函数。packagecom;publicclassbase{protectedvoidf(){System.out.println(member function);}protectedstaticvoidstaticF(){System.out.println(static function);}}测试类在默认包中下面被注释掉的函数都是无法通过编译的。importcom.base;publicclasstestP{publicstaticvoidmain(String[]args){base bnewbase(){//匿名内部类且此处向上转型{f();}//实例初始化块};//b.f(); //无法通过编译//b.staticF();classderivedextendsbase{//局部内部类{f();}//实例初始化块}derived dnewderived();//此处没有向上转型//d.f(); //无法通过编译//derived.staticF();base bbnewbase();//直接创建父类//bb.f(); //无法通过编译//bb.staticF();}}通过测试发现在子类的类定义中可以直接调用到父类的protected函数。提示如果子类又定义了一个重名的函数那么就要用super.f()了通过子类对象无法调用到父类的protected函数不管是不是用父类引用来接的上面的这个匿名内部类用父类引用接的局部内部类用子类引用的。直接创建基类对象通过基类对象也是无法调用到父类的protected函数。因为此时就是默认的包访问权限自然也就不可以。相对而言在同一个包中的java文件就可以访问了packagecom;//也在com包中的测试类publicclasstestP2{publicstaticvoidmain(String[]args){base bnewbase(){{f();}};b.f();b.staticF();classderivedextendsbase{{f();}}derived dnewderived();d.f();derived.staticF();base bbnewbase();//直接创建父类bb.f();bb.staticF();}}