都知道protected权限包括:同一个包(默认的包访问权限),和子类的访问权限。但对于子类的访问权限可能有些模棱两可。这里先给出结论:
在不同包中的子类的类定义中,可以使用父类的protected方法;但在不同包的子类对象,不可以通过这个子类对象来调用protected方法。
测试代码
在com包中有个用来继承的基类,分别有一个成员函数和静态函数。
package com; public class base { protected void f(){ System.out.println("member function"); } protected static void staticF(){ System.out.println("static function"); } } 测试类在默认包中,下面被注释掉的函数都是无法通过编译的。
import com.base; public class testP { public static void main(String[] args) { base b = new base(){//匿名内部类,且此处向上转型 {f();}//实例初始化块 }; //b.f(); //无法通过编译 //b.staticF(); class derived extends base{//局部内部类 {f();}//实例初始化块 } derived d = new derived();//此处没有向上转型 //d.f(); //无法通过编译 //derived.staticF(); base bb = new base();//直接创建父类 //bb.f(); //无法通过编译 //bb.staticF(); } } 通过测试发现:
- 在子类的类定义中,可以直接调用到父类的protected函数。(提示,如果子类又定义了一个重名的函数,那么就要用
super.f()了) - 通过子类对象无法调用到父类的protected函数,不管是不是用父类引用来接的(上面的这个匿名内部类用父类引用接的;局部内部类用子类引用的)。
- 直接创建基类对象,通过基类对象也是无法调用到父类的protected函数。因为此时就是默认的包访问权限,自然也就不可以。
相对而言,在同一个包中的java文件就可以访问了:
package com;//也在com包中的测试类 public class testP2 { public static void main(String[] args) { base b = new base(){ {f();} }; b.f(); b.staticF(); class derived extends base{ {f();} } derived d = new derived(); d.f(); derived.staticF(); base bb = new base();//直接创建父类 bb.f(); bb.staticF(); } } 来源:51CTO
作者:anlian523
链接:https://blog.csdn.net/anlian523/article/details/100181354