包及權限配置
包的宣告和匯入
//宣告
package aa.bb.cc;
public class A{;}
class B{;}
//即在java輸出目錄aa.bb.cc中放入編譯后的A.class和B.class檔案
//使用其他包中的類的兩種方式
//第一種:匯入,import 包名.類名|介面名|*;
import aa.bb.cc.A;
//第二種:使用類的全名,即"包名.類名"
aa.bb.cc.A a =new aa.bb.cc.A();
注:
- 必須用宣告(package)包的形式將類放入指定包中,必須用匯入(import)包/類的形式使用包中的類
- 一個Java源檔案只能宣告一個包,且宣告陳述句必須作為源檔案的第一條指令
- 通常,功能相關密切的類、介面才能被放在同一包中
- 一個.java檔案可包含多個import陳述句,但只能匯入public權限的類或介面,一個.java檔案只有一個public類,且該類名與檔案名要相同
- 匯入時不會匯入子包,如要匯入java.util包中的Scanner,用import java.*無法實作
從不同包中匯入相同的類
從不同包中可以匯入相同的類,但使用時必須用全名
//源檔案一:A.java
package X;
public class A{
public int x;
}
//源檔案二:A.java
package Y;
public class A{
public String s;
}
//源檔案三:A.java
package Z;
//import X.A; import Y.A; //這種匯入方式將產生編譯錯
import X.*; import Y.*; //正確
public class A{
int x;
public static void main(String[] args){
A a = new A(); a.x = 10; //正確,此A為Z包中的A
Z.A a1 = new Z.A(); a1.x = 10; //正確,此A為Z包中的A
X.A b = new Z.A(); b.x = 5; //正確,此A為X包中的A
Y.A c = new Z.A(); c.s = "abc"; //正確,此A為Y包中的A
}
}
靜態匯入
JDK1.5版新增靜態匯入,可匯入類/介面中的所有或特定靜態成員,格式如下:
- import static <包名>.類名.*;
- import static <包名>.類名.<成員名>;
匯入成員后,可以不加類名,直接使用成員
//源檔案:A.java
package X;
public class A{
public static int a;
public static void f(int x){ System.out.print(" x=" + x); }
public static void f(int x,int y){ System.out.print(" x=" + x + " y=" + y); }
}
//源檔案:B.java
import static java.lang.Math.PI;
import static X.A.*;//在匯入靜態成員方法時,不能加引數,如import static X.A.f;
class B{
public static void main(String[] args){
f(1); f(2,3); a = 10;
System.out.print(" a=" + a + " PI=" + PI);
}
}
訪問權限
-
類的訪問權限有兩種:public和預設
- 預設:只能被該類所屬包中的類訪問,不能被其他包中的類訪問
- public:訪問不受包限制
-
類中成員的訪問權限有四種:private、預設、protected和public
- private:僅能被該類自己訪問,其他任何類都不能訪問該成員
- 預設:只有包內的類才可訪問
- protected:允許包中的類和包外的子類訪問
- public:對訪問無限制
修飾符 同一類 同一包 不同包的子類 所有類 public √ √ √ √ protected √ √ √ 預設 √ √ private √ -
無關系的兩個類跨包訪問只能訪問其包中的public類的public成員
栗子:
假設某藥企需要開發一個資訊管理系統,其中藥品價格涉及四種:成本價、出廠價、代理價、銷售價,均由藥廠的市場部決定,藥品銷售涉及直營店、代理商、普通藥店三類客戶,為安全起見,指定如下策略:
- 市場部可以控制上述四種價格;
- 廠家直營店只能看到出廠價、代理價和銷售價;
- 代理商只能看到代理價和銷售價;
- 普通藥店只能看到銷售價,
請設計一組包和市場部、直營店、代理商、普通藥店等四個類,并完成類及其成員的權限配置,
package com.yq;
public class 市場部{
private double 成本價;
double 出廠價;
protected double 代理價;
public double 銷售價;
}
package com.yq;
public class 直營店{;}//同包
package com.yq.dl;
public class 代理商 extends com.yq.市場部{;}//不同包的子類
//注:子類不一定要求在父包的子包中,只要包名不同即可
package com.yq.yd;
public class 普通藥店{;}//不同包
java存盤機理繪制規則
- 堆疊:存放函式中定義的所有變數
- 堆:存放所有創建出來的物件
- 方法區:存放類的定義
- 三者的聯系:在函式中new出物件,物件的參考名在堆疊中,指向堆中創建出的物件,每個物件都附加一個指向其所屬型別(即方法區)的指標
注:
- 堆疊從main函式開始創建
- 物件存于堆中,物件的參考存于堆疊中,即參考指向堆中創建的物件
- 堆疊空間的資料被系統自動管理,在函式呼叫時自動創建資料空間,在函式運行結束時自動釋放資料空間
- 物件中的實體變數存于堆中,函式中的變數存于堆疊中
- 方法區中的靜態變數直接賦值,實體變數只是宣告,在創建物件后在堆中賦值
- 物件未賦值為null,int型為0,String型為""
- 如果是基本型直接填值,如果是參考型則通過指標指向一個物件
- 畫圖用實線虛線不講究,書中用的是虛線
int[] a = new int[5];//顯式呼叫new操作,其中a存于堆疊空間,a參考的物件存于堆空間
int[] b = {1,2,3,4};//隱式呼叫new操作,其中b存于堆疊空間,b參考的物件存于堆空間
String s = "abc";//隱式呼叫new操作,其中s存于堆疊空間,"abc"存于堆空間
栗子:
class T{
static int x;
String[][] s;
T(int a){x = a;}
T(){s = new String[][]{new String[3],{"aaa","bbb"}};}
}
依次執行下列兩條陳述句:T a=new T(5); T b=new T();請畫出相關資料在堆疊、堆、方法區中的記憶體示意圖
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UnbO0xXF-1609676242641)(C:\Users\huawei\AppData\Roaming\Typora\typora-user-images\image-20201229171938400.png)]](https://img.uj5u.com/2021/01/04/211882041056471.png)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/244276.html
標籤:java
