public的class 可以被任何包访问,而default的 class 只能被本包下面的类访问
实际的例子
用到的两个文件,而且他们隶属于不同的package
Func.java Main.java
Func.java
package a;
class Func {
public static void print_info() {
System.out.println("class Func!");
}
}
Main.java
import a.*;
public class Main {
public static void main(String agrs[]) {
System.out.println("hello!");
a.Func.print_info();
}
}
执行结果
lydia@lydia:~/sgy/java_learn/access_permission$ javac -d . Main.java
Main.java:6: 错误: Func在a中不是公共的; 无法从外部程序包中对其进行访问
a.Func.print_info();
^
1 个错误
说明 public Main类访问不了 default 的Func类
将Func 改成public Func或者 将Main 放在同一个包(package a;)即可访问
lydia@lydia:~/sgy/java_learn/access_permission$ java a.Main
hello!
class Func!
关于访问权限的总结
default的变量的访问权限也是只有同一个包才能访问!
Func.java
package a;
public class Func {
int x = 9;
public static void print_info() {
System.out.println("class Func!");
}
}
Main.java
//package a;
import a.Func;
public class Main {
public static void main(String agrs[]) {
Func f = new Func();
f.x = 8;
}
}
编译的时候通过不了
Main.java:8: 错误: x在Func中不是公共的; 无法从外部程序包中对其进行访问
f.x = 8;
^
1 个错误
说明即便Func是public的,但是default的变量不允许不同的包访问!
将Main更改成 package a即可成功编译通过,并且访问这个变量!
protected的类成员变量只能被其子类所访问,且只能在子类的内部被访问!
实际的例子:
用到的两个文件,而且他们隶属于不同的package
Func.java Main.java
Func.java
package a;
public class Func {
protected int x = 9;
//int x = 9;
public static void print_info() {
System.out.println("class Func!");
}
}
Main.java
package b;
import a.Func;
class Sub_Func extends Func {
void print() {
System.out.println("Func->x:"+x);
}
}
public class Main {
public static void main(String agrs[]) {
Sub_Func f = new Sub_Func();
f.print();
f.x = 8;
}
}
执行结果
lydia@lydia:~/sgy/java_learn/access_permission$ javac -d . Main.java
Main.java:15: 错误: x 在 Func 中是 protected 访问控制
f.x = 8;
^
1 个错误
说明在不同的package,类外即便是通过子类也是访问不了protected的成员的!
去掉下面这一行语句是能够执行通过的。
f.x = 8
PS:
- 一个java文件里不能同时写两个public的类