今天我們來探討一下訪問權限控制符。
使用場景一:攻城獅A編寫了ClassA,但是他不想所有的攻城獅都可以使用該類,應該怎么辦?
使用場景二:攻城獅A編寫了ClassA,里面有func1方法和func2方法,但是他只想提供func1給別的攻城獅使用,應該怎么辦?
?
此時,應該使用Java當中的訪問權限控制符:1、默認訪問權限 2、public 3、private 4、protected
注意,上述四種訪問權限,只有默認訪問權限和public能夠用來修飾類。修飾類的變量和方法四種權限都可以。(本處所說的類針對的是外部類,不包括內部類)
?
1、修飾類
默認訪問權限:表示在同一包中其他類都可以訪問該類。
public:表示任何一個類都可以訪問該類。
例子1:
People.java
package test1;class People { //默認訪問控制符 String name;public People(String name) {this.name = name;}public String getName(){return this.name;} }
Main.java
package test1;public class Main {public static void main(String[] args) {People p = new People("攻城獅");System.out.println(p.getName());}}
實驗結果:
?
可以正常輸出結果[攻城獅]。因為People類使用的是默認訪問修飾符,在同一個包里面可以訪問,而Main.java與People.java在同一包,所以能訪問。
?
?
?例子2:
修改Main.java:把Main類放置在別的包中,會有什么情況出現呢?
line2提示:People類不可見,即找不到的意思。People.java使用默認訪問修飾符,只能提供給同包的類來訪問,而現在Main.java放在了test2包中,而People.java是test1包的,所以在不同包是不能放到默認訪問修飾符類的。
?
2、修飾類的方法和變量
默認訪問權限(包訪問權限):如果類的變量和方法使用默認訪問權限,就意味著只能在同包的類中可以訪問到類的方法和變量,而不同包的類則不能訪問類的方法和變量。
private:如果一個類的方法和變量使用privagte來修飾,則只能提供給本類訪問,其他類不能訪問。
protected:如果一個類的方法和變量使用protected來修飾,既能提供本類訪問,又能提供給不同包繼承于此類的類訪問方法和變量。
public:如果一個類的方法和變量使用public來修飾,則任意類能訪問方法和變量。
?
下面通過一下例子來說明問題:
例子3:
People.java與Main.java位于同類
People.java
package test1;class People { //默認訪問控制符 String name;public People(String name) {this.name = name;}String getName(){//默認訪問控制符return this.name;} }
Main.java
package test1;public class Main {public static void main(String[] args) {People p = new People("攻城獅");System.out.println(p.getName());}}
此例子能正常運行,主要想測試一下默認修飾符修飾getName(),在同包的類中能正常訪問。
?
如果此時,把Main.java放于不同的包中,查看能否正常運行?
People.java
package test1;class People { //默認訪問控制符 String name;public People(String name) {this.name = name;}String getName(){//默認訪問控制符return this.name;} }
Main.java
提示,在不同包中,是查看不了使用默認訪問控制符修飾的方法。
?
例子4:
People.java
package test1;public class People {String name;public People(String name) {this.name = name;}protected String getName(){//protected控制符return this.name;} }
Main.java
提示,在不同包中,是查看不了使protected控制符修飾的方法。
?
編寫一個Man類繼承于People類
Man.java
package test2;import test1.People;public class Man extends People {public Man(String name) {super(name);}public void printName(){System.out.println(this.getName());}}
Main.java
package test2; import test1.People;public class Main {public static void main(String[] args) {//People p = new People("攻城獅");//System.out.println(p.getName()); Man m = new Man("工程濕");m.printName();}}
Man類繼承于People類,則Man類中可以訪問到People類中protected修飾的方法。
?