Ⅰ权限
关于java类中的成员访问权限:
default
:仅本类和同一个package
中的类可以访问public
:都可以访问private
:仅本类可以访问protected
:仅本类,派生类及同一个package
中的类可以访问
Ⅱ 测试
首先给出一个 base
类,这个类包含于 test1
这个包中:
package test1;
// this is the base class for protected member of both variable and function testing
public class TestProtectedBase {
protected int _protected_member = 0;
protected int getProtectedMember() {
return this._protected_member;
}
}
可以看到这个类中包含了一个受保护的成员变量以及一个返回这个变量的受保护的成员函数。
① 同一个包内的访问
显然,此时不管是不是这个 base
类的派生类,包含在 test1
中的任意一个类中的函数都可以访问成员变量或者是函数:
public class SamePackageProtectedTest {
public static void main(String args[]) {
// test 1
// 在同一个包中的类中访问变量
TestProtectedBase base = new TestProtectedBase();
System.out.println(base._protected_member);
System.out.println(base.getProtectedMember());
}
}
如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/41eae0060c0b97ea959c2ba354d26d25.png)
图 1 无报错
② 不同包内的访问
这个时候需要分两种情况:
- 不同包中的非派生类对
test1.base
中的受保护成员的访问 - 不同包中的派生类对
test1.base
中的受保护成员的访问
当此时该类为 base
的派生类时,可以进行访问:
package test2;
import test1.TestProtectedBase;
public class TestProtectedDerivedA extends TestProtectedBase{
// test4
// 不同包中的派生类内部可以访问
protected void print() {
System.out.println(super._protected_member);
}
}
如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/584b4f4fa555c262490027132b52b759.png)
图 2 不同包的派生类访问,无报错
当此时该类为非派生类时,即使在这个类中利用同样在 test2
包中的派生类 TestProtectedDerivedA
也不可以访问:
package test2;
import test1.TestProtectedBase;
public class DiffPackageProtectedTest {
public static void main(String args[]) {
// test2
// 报错,不同包中的非派生类内部不可以访问
TestProtectedBase base = new TestProtectedBase();
System.out.println(base._protected_member);
System.out.println(base.getProtectedMember());
// test3
// 报错,不同包中的非派生类内部利用同个包中的派生类也不可以访问
TestProtectedDerivedA derivedA = new TestProtectedDerivedA();
System.out.println(derivedA._protected_member);
System.out.println(derivedA.getProtectedMember());
}
}
如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/a95a197af34f1b32fb4172f370b7aa41.png)
图 3 全部报错
可以看到,不管是在这个类中直接访问 test1.base
中的成员,还是利用 test2.TestProtectedDerivedA
进行访问,结果都不能通过编译,抛出该字段不可见的错误信息。