之前了解到的关于protected的访问权限不外乎同包以及子类具有访问权限。
但是今天了解到对于继承基类的子类,同包和不同包的情况下,使用基类对象访问基类protected权限的变量和方法是有区别的。
具体说来是,对于继承了基类的子类:
<1> 如果和基类在同一个包中,则在子类内可以创建子类本身的实例对象并访问基类的protected类型变量,也可以创建基类的实例对象并访问基类的protected类型变量。
<2> 如果子类和基类不在同一个包中,则在子类中只可以创建子类本身的实例对象访问基类的protected类型变量,不能创建基类的实例对象并访问基类的protected类型变量。
以下为测试代码:
定义基类,设置protected权限的实例域 test
package ProtectedTest;
public class BaseClass
{
private String test = "test";
protected String test1 = "test1";
}
在同一包中定义继承BaseClass的子类ChildClass1
测试在子类中定义BaseClass的对象,访问test
在子类中定义ChildClass1的对象,访问test
package ProtectedTest;
public class ChildClass1 extends BaseClass
{
public void fun1()
{
ChildClass1 childInstance = new ChildClass1();
System.out.println(childInstance.test1);
BaseClass baseInstance = new BaseClass();
System.out.println(baseInstance.test1);
}
public static void main(String[] args)
{
ChildClass1 childInstance1 = new ChildClass1();
childInstance1.fun1();
}
}
测试结果:
test1
test1
在另外的包中定义继承BaseClass的子类ChildClass2
同样测试在子类中定义BaseClass的对象,访问test,结果编译报错,test不可见
在子类中定义ChildClass2的对象,访问test
import ProtectedTest.BaseClass;
import ProtectedTest.ChildClass1;
public class ChildClass2 extends BaseClass
{
public void fun2()
{
ChildClass2 childInstance = new ChildClass2();
System.out.println(childInstance.test1);
BaseClass baseInstance = new BaseClass();
//此处报错,test1不可见
System.out.println(baseInstance.test1);
}
public static void main(String[] args)
{
ChildClass2 childInstance1 = new ChildClass2();
childInstance1.fun2();
}
}