郁闷,太久没碰 java 忘的一干二净。看到 package 和 import 之后的权限访问控制 有那么一点迷惑。
特意记录下来,免的后期在使用的时候又发傻
JAVA 中一共有四种权限
权限 | 类内部 | 同一个包 | 子类 | 任何地方 |
private | yes |
|
|
|
default | yes | yes |
|
|
protected | yes | yes | yes |
|
public | yes | yes | yes | yes |
因为设计到包,所以在使用方面有点迷惑
首先看 default 权限的问题
package com.net;
// 缺省权限就是 default
class Test1 {
int i = 1;
public int getI() {
return i;
}
}
编译后将 .class 文件放到 com/net 包下 接着在编写一个java文件
// 编译出错,无法使用 Test1 类 因为该类的权限是 default
import com.net.Test1
public class Test2 {
public static void main(String[] args) {
Test1 t1 = new Test1();
}
}
当修改 Test1 类的权限为 public 后编译仍然通过。
在看一段代码
import com.net.Test1;
public class Test2 {
public static void main(String[] args) {
Test1 t1 = new Test1();
System.out.println(t1.i);
}
}
此时编译再一次出错,因为 Test1 类中的 i 成员的权限是 default 所以无法访问。
也就是说 如果 一个类是的权限是 default 的话 那么该类只能在同一个包中能访问,该类的属性也是一样
第二个测试
com/net 包中有2 个 class 文件
第一个是上列的 Test1.class
第二个是新的 Test3.class
Test3.java 代码
package com.net;
pubic Test3 extends Test1 {
public int getI() {
return this.i;
}
}
该类的权限是 public (任何地方都能访问) 同时继承了 同一个包下的 Test1 类 (在经过测试后发现 在同一个包中继承 不需要 import 要继承的类)
现在修改 Test2.java 代码
import com.net.Tes3
public Test2 {
public static void main(String[] args) {
Test3 t3 = new Test3();
System.out.println(t3.getI());
}
}
编译通过,能够获取 Test3 继承所得到的 i 的值。