物件與引用,static關鍵字,程式碼塊,包,訪問許可權修飾符

kunpo—發表於2020-10-23

物件與引用

Car car= new Car();
通常把這條語句的動作稱之為建立一個物件,其實,它包含了三個動作。

  1. 右邊的“new Car()”,是以Car類為模板,呼叫Car類的建構函式,在堆空間裡建立一個Car類物件。
  2. 左邊的“Car car”建立了一個Car類引用變數。所謂Car類的引用,就是以後可以用來指向Car物件的物件引用。
  3. ”=”操作符使物件引用指向剛建立的那個Car物件。

我們可以把這條語句拆成兩部分:
Car car;
car= new Car();
這樣寫,就比較清楚了,有兩個實體:一是物件引用變數,二是物件本身。
new Car(); 這個語句在堆空間裡建立了實體,儘管它們也是確確實實存在的實體,但是,我們看不見,也摸不著。
物件沒有名字,也就沒法直接訪問它。我們需要通過物件引用來間接訪問物件。
物件好比是一隻很大的氣球,但是我們抓不住它。引用變數是一根繩,可以用來系汽球。
Car car1; (1)建立一根繩子,一根還沒有繫上任何一個汽球的繩;
Car car2;(2)就又做了一根繩,還沒繫上汽球,
car1 = new Car();(3)給car1 繫上氣球;
car2 = car1 ;(4)這裡,發生了複製行為。要說明的是,物件本身並沒有被複制,被複制的只是物件引用。
結果是,car2也指向了car1所指向的物件。兩根繩系的是同一只汽球。

基本型別和引用型別的區別
在這裡插入圖片描述

值傳遞與引用傳遞
Java中進行方法呼叫中傳遞引數時,引數傳遞有兩種:

  • 值傳遞:(形式引數型別是基本資料型別):方法呼叫時,實際引數把它的值傳遞給對應的形式引數,形式引數只是用實際引數的值初始化自己的儲存單元內容,是兩個不同的儲存單元,所以方法執行中形式引數值的改變不影響實際引數的值。

  • 引用傳遞:(形式引數型別是引用資料型別引數):也稱為傳地址。方法呼叫時,實際引數是物件,這時實際引數與形式引數指向同一個地址,在方法執行中,對形式引數的操作實際上就是對實際引數的操作,這個結果在方法結束後被保留了下來,所以方法執行中形式引數的改變將會影響實際引數。

    基本型別傳遞的是該資料值本身。引用型別傳遞的是對物件的引用,而不是物件本身 。

static關鍵字

static被稱為靜態,可以用來修飾類的屬性,方法,程式碼塊,內部類。
隨著類的載入而載入
優先於物件存在
修飾的成員,被所有物件所共享
可不建立物件,直接被類呼叫

static屬性
靜態屬性是類的所有物件共享的,即不管建立了多少個物件,靜態屬性在記憶體中只有一個。
static方法可以使用物件呼叫,也可以直接用類名呼叫,建議用類名直接呼叫
在static方法內部只能訪問類的static屬性,不能訪問類的非static屬性。
程式碼塊在類中宣告,類似一個沒有名稱的方法體(程式碼塊),程式碼分例項塊和靜態塊
例項塊:每次建立物件時自動呼叫
{
//任何符合語法的Java程式碼
}
靜態塊:類載入時自動呼叫,僅一次,與是否建立物件無關。
static {
//任何符合語法的Java程式碼
}

包的概念:
物理上是資料夾
管理類

包的作用:
避免類重名
按照不同功能管理類
控制訪問許可權

包(package)的命名規範:
在包名中,可以使用.號來區分包的級別;包名一般情況下是小寫
第一級 指該專案的型別,如com,org,gov等,
第二級 指專案所開發或者執行的公司名稱,如:oracle,sun,huawei等
第三級 指專案的名稱,如:bcms,oa,erp,cms等
第四級 指專案模組的名稱,如:bean,action,exception等

Java語言有四個許可權訪問修飾符,許可權從大到小依次為:
1)public :公共許可權 修飾類、屬性、方法。可以被任意類訪問
2)protected:受保護的許可權 修飾屬性、方法。
可以被同包類訪問,如果不是同包類,必須是該類的子類才可以訪問。
3)default:同包許可權 修飾類、屬性、方法。只能被同包的類訪問
4)private:私有許可權 修飾屬性、方法。 只能在本類中訪問

示例:

package day1;
public class Demo4 {

    public int num1=1;//公共許可權  可以被任意類訪問
    protected int num2=2;//受保護的許可權  可以被同包類訪問,如果不是同包類,必須是該類的子類才可以訪問。
    private int num3=3;//私有許可權 只能在本類中訪問

    int num4=4;//同包許可權 只能被同包的類訪問
    public void num(){
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
        System.out.println(num4);
    }
    public static void main(String[] args) {
        new Demo4().num();
    }
}







package day1;//與Demo4在同一個包
public class Demo5 {
    public void d5(){
        Demo4 demo5=new Demo4();
        System.out.println(demo5.num1);//公共許可權  可以被任意類訪問
        System.out.println(demo5.num2);//受保護的許可權  可以被同包類訪問,如果不是同包類,必須是該類的子類才可以訪問。
                                        //num3  被私有許可權修飾 只能在本類中訪問
        System.out.println(demo5.num4);//同包許可權 只能被同包的類訪問

    }
    public static void main(String[] args) {
        new Demo5().d5();
    }
}






package day2;//與Demo4在不同的包中
import  day1.Demo4;
public class Demo6 extends Demo4{//類Demo6繼承了Demo4,是Demo4的子類
    public void d3(){
        Demo6 d6=new Demo6();
        System.out.println(d6.num1);//公共許可權  可以被任意類訪問
        System.out.println(d6.num2);//受保護的許可權  可以被同包類訪問,如果不是同包類,必須是該類的子類才可以訪問。
    }

    public static void main(String[] args) {
        Demo6 d6=new Demo6();
        d6.d3();
    }
}
``



相關文章