智漁課堂官方免費教程十一:Java基礎之訪問權限

訪問權限

包(package)

是Java提供的一種區別類的名字空間的機制,是類的組織方式,它提供了訪問權限和命名的管理機制;對應到硬盤上就是文件夾。
Java中提供的包主要有以下3種用途:
1) 方便類的管理;將功能相近的類放在同一個包中,可以方便查找與使用。
2) 避免類的命名衝突;同一包下的類不可同名,不同包中的類可以同名。
3) 控制類中成員的訪問權限。

聲明包:package 包名; 

實例:
//聲明包
package p1.p2.pn;
public class PackageDemo {}
注意:包的聲明語句,必須寫在.java文件的第一行;
上例中,如果使用的是記事本創建的PackageDemo.java文件,這個文件可以在任何位置被編譯。
編譯使用javac –d . Package.java 
–d .  表示編譯後在當前目錄下自動根據聲明的包創建目錄
編譯後會在當前目錄下生成p1/p2/pn/Package.class這樣的文件目錄(當然也可以用javac Package.java編譯後,手動創建p1/p2/pn這樣的文件夾目錄,將編譯後的Package.class文件放到pn文件夾下)。
運行使用java p1.p2.pn.Package程序
一旦類文件中聲明瞭包,那麼編譯後的文件必須放在聲明的包下才能被運行,切使用命令運行時必須使用類的全名(即:包名.類名)

導入包:

方式一、import 包名.類名; (導入指定包下的指定類)
方式二、import 包名.*;  (導入指定包下的所有類,不包含指定包的子包下的類)

注意:包的導入語句要寫在類聲明語句之前,包聲明語句之後。
使用同一包下的類或java.lang包下的類時,可以省略包的導入;因爲系統默認會在當前包和java.lang包下查找用到的類;

例如:類A在包a下,類B在包b下;如果在類A中使用了類B,那麼就必須在類A中導入類B(import  b.B;或import  b.*);這樣類A用到類B的時候才知道去哪裏找這個類B;
//聲明包
package  a;
//導入(引入)包
import  b.B;
//聲明類
public  class  A{
	B  b = new  B();
}

//聲明包
package  b;
//聲明類
public  class  B{ }

訪問修飾符

訪問修飾符是用於控制被修飾者的使用權限的關鍵字,被修飾者可以是類、屬性、方法等
java中提供了4種訪問權限,3個關鍵字;被修飾者的使用權限如下表

關鍵字 同一類中 同一包下不同類中 不同包下存在繼承關係的類中 任何位置
private(私有的) 可以 不可以 不可以 不可以
無(默認不寫) 可以 可以 不可以 不可以
protected(保護的) 可以 可以 可以 不可以
public(公共的) 可以 可以 可以 可以

實例:
//聲明包
package access_modifier.family;
/**
 * 用於演示訪問修飾符
 * 聲明Me時使用了public,這樣在其他包下纔可以訪問
 * 在類文件中直接聲明的類只有兩種情況,一種默認不寫,一種使用public
 * 不能使用private和protected
 * @author 學霸聯盟 - 趙燦
 */
public class Me {
	/*
	 * phone使用private修飾,表示只能在當前類(Me)中使用
	 * computer未寫訪問修飾符, 默認表示當前類和同一包下的其他類中都可以使用
	 * money使用protected修飾,表示其他包下有繼承關係的都可以使用
	 * book使用public修飾,表示任何地方都可以使用
	 */
	private String phone = "手機";
	String computer = "電腦";
	protected String money = "錢";
	public String book = "圖書";
}

//聲明包
package access_modifier.family;
/**
 * 用於演示默認訪問修飾符的訪問權限
 * @author 學霸聯盟 - 趙燦
 */
public class Wife {
	public static void main(String[] agrs){
		//創建Me類的對象
		Me lover = new Me();
		/*
		 * Brothers和Me在同一包下
		 * 可以省略導入語句(import access_modifier.family.Me)
		 * 可以使用除private修飾以外的成員
		 */
		System.out.println("Me類中的computer屬性值:" + lover.computer);
		System.out.println("Me類中的money屬性值:" + lover.money);
		System.out.println("Me類中的book屬性值:" + lover.book);
	}
}

//聲明包
package access_modifier.friends;
//導入包:不同包下的類相互之間調用必須導入包
import access_modifier.family.Me;

/**
 * 用於演示public的訪問權限
 * @author 學霸聯盟 - 趙燦
 */
public class Friend {
	public static void main(String[] agrs){
		//創建Me類的對象
		Me friend = new Me();
		/*
		 * Friend和Me在同一包下,並且沒有繼承關係
		 * 所以該類中只能使用Me類中public修飾的成員
		 * 而且類Me聲明時必須使用public,如果沒有使用這裏將無法使用類Me
		 */
		System.out.println("Me類中的book屬性值:" + friend.book);
	}
}

//聲明包
package access_modifier.son_family;
//導入包
import access_modifier.family.Me;

/**
 * 用於演示protected的訪問權限
 * 需要先學習完繼承
 * @author 學霸聯盟 - 趙燦
 */
public class Son extends Me{
	//可以使用關鍵字super訪問父類中的protected修飾的成員
	String fatherMoney = super.money;
	public static void main(String[] args) {
		//創建父類的對象
		Me father = new Me();
		//用父類對象只能訪問public修飾的成員
		System.out.println("Me類中的book屬性值:" + father.book);
		//創建本類對象
		Son son = new Son();
		//也可以通過本類對象使用父類中protected修飾的成員
		System.out.println("間接使用Me類中的money屬性:" + son.money);
	}
}

public class 和 class的區別

1、創建個數:一個源文件(.java文件)中,可以聲明多個類,但只能有一個使用public  class聲明的類,並且類名必須和文件名相同
2、使用範圍:其他包下的類中可以使用public  class聲明的類;但不能使用class聲明的類
另外:當一個源文件中聲明多個類時,編譯之後會產生多個對應類名的字節碼文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章