1. 程式人生 > 其它 >包及許可權配置&java儲存機理繪製

包及許可權配置&java儲存機理繪製

技術標籤:javajava

包及許可權配置

包的宣告和匯入

//宣告
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();

注:

  1. 必須用宣告(package)包的形式將類放入指定包中,必須用匯入(import)包/類的形式使用包中的類
  2. 一個Java原始檔只能宣告一個包,且宣告語句必須作為原始檔的第一條指令
  3. 通常,功能相關密切的類、接口才能被放在同一包中
  4. 一個.java檔案可包含多個import語句,但只能匯入public許可權的類或介面,一個.java檔案只有一個public類,且該類名與檔名要相同
  5. 匯入時不會匯入子包,如要匯入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版新增靜態匯入,可匯入類/介面中的所有或特定靜態成員,格式如下:

  1. import static <包名>.類名.*;
  2. 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);
  }
}

訪問許可權

  1. 類的訪問許可權有兩種:public預設

    • 預設:只能被該類所屬包中的類訪問,不能被其他包中的類訪問
    • public:訪問不受包限制
  2. 類中成員的訪問許可權有四種:private、預設、protected和public

    • private:僅能被該類自己訪問,其他任何類都不能訪問該成員
    • 預設:只有包內的類才可訪問
    • protected:允許包中的類和包外的子類訪問
    • public:對訪問無限制
    修飾符同一類同一包不同包的子類所有類
    public
    protected
    預設
    private
  3. 無關係的兩個類跨包訪問只能訪問其包中的public類的public成員

栗子:

假設某藥企需要開發一個資訊管理系統,其中藥品價格涉及四種:成本價、出廠價、代理價、銷售價,均由藥廠的市場部決定。藥品銷售涉及直營店、代理商、普通藥店三類客戶。為安全起見,指定如下策略:

  1. 市場部可以控制上述四種價格;
  2. 廠家直營店只能看到出廠價、代理價和銷售價;
  3. 代理商只能看到代理價和銷售價;
  4. 普通藥店只能看到銷售價。

請設計一組包和市場部、直營店、代理商、普通藥店等四個類,並完成類及其成員的許可權配置。

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儲存機理繪製規則

  1. 棧:存放函式中定義的所有變數
  2. 堆:存放所有創建出來的物件
  3. 方法區:存放類的定義
  4. 三者的聯絡:在函式中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)]