訪問權限
包(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聲明的類
另外:當一個源文件中聲明多個類時,編譯之後會產生多個對應類名的字節碼文件