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的類