包及許可權配置&java儲存機理繪製
阿新 • • 發佈:2021-01-04
包及許可權配置
包的宣告和匯入
//宣告
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();請畫出相關資料在棧、堆、方法區中的記憶體示意圖