引用《The Complete Reference》中的经典例子来说明Java包中类成员的访问权限问题
下面的例子显示了访问修饰符的所有组合。该例有两个包和五个类。记住这两个不同包中的类需要被存储在以它们的包p1、p2命名的目录下。
第一个包定义了三个类:ProtectionDerived 和 SamePackage:
Protection类以合法的保护模式定义了四个int变量,变量n默认权限,变量n_pri是private权限,变量n_pro是protected权限,变量n_pub是public权限。Derived类作为Protection同一个包中的子类出现。
SamePackage类作为Protection同一个包中的非子类出现。
第二个包定义了两个类:Protection2 和 OtherPackage。Protection2类作为Protection的其他包中的子类出现。
OtherPackage类作为Protection的其他包中的非子类出现。这些类都试图访问Protection中的所有成员,访问受限的语句被注释掉,并加以注明。
下面是Protection.java文件:
package p1;
public class Protection
{
int n = 1;
private int n_pri = 2;
protected int n_pro = 3;
public int n_pub = 4;
public Protection()
{
System.out.println("base constructor");
System.out.println("n = "+n);
System.out.println("n_pri = "+n_pri);
System.out.println("n_pro = "+n_pro);
System.out.println("n_pub = "+n_pub);
}
}
下面是Derived.java文件:
package p1;
class Derived extends Protection
{
Derived()
{
System.out.println("derived constructor");
System.out.println("n = "+n);
//class only
//System.out.println("n_pri = "+n_pri);
System.out.println("n_pro = "+n_pro);
System.out.println("n_pub = "+n_pub);
}
}
下面是SamePackage.java文件:
package p1;
class SamePackage
{
SamePackage()
{
Protection p = new Protection();
System.out.println("same package constructor");
System.out.println("n = "+p.n);
//class only
//System.out.println("n_pri = "+p.n_pri);
System.out.println("n_pro = "+p.n_pro);
System.out.println("n_pub = "+p.n_pub);
}
}
下面是Protection2.java文件:
package p2;
class Protection2 extends p1.Protection
{
Protection2()
{
System.out.println("derived other package constructor");
//class or package only
//System.out.println("n = "+n);
//class only
//System.out.println("n_pri = "+n_pri);
System.out.println("n_pro = "+n_pro);
System.out.println("n_pub = "+n_pub);
}
}
下面是OtherPackage.java文件:
package p2;
class OtherPackage
{
OtherPackage()
{
p1.Protection p = new p1.Protection();
System.out.println("other pacage constructor");
//class or package only
//System.out.println("n = "+p.n);
//class only
//System.out.println("n_pri = "+p.n_pri);
//class,subclass or package only
//System.out.println("n_pro = "+p.n_pro);
System.out.println("n_pub = "+p.n_pub);
}
}
下面试试这两个包,通过以下两个测试文件
包p1的测试文件:
/*
Demo package p1.
*/
package p1;
public class Demo
{
public static void main(String[] args)
{
Protection ob1 = new Protection();
Derived ob2 = new Derived();
SamePackage ob3 = new SamePackage();
}
}
包p2的测试文件:
/*
Demo package p1.
*/
package p1;
public class Demo
{
public static void main(String[] args)
{
Protection ob1 = new Protection();
Derived ob2 = new Derived();
SamePackage ob3 = new SamePackage();
}
}
编译:
运行Demo1:
运行Demo2:
由此我们可以得到以下结论: