Java基礎進階-1-變量與對象(回收+內存佔用)

目錄

1、定義

1.1、原始數據類型

1.2、引用變量

2、對象的聲明、創建與賦值

3、對象的回收

4、一個對象的內存

5、數組對象

6、方法參數

7、封裝

8、實例變量與局部變量


1、定義

變量就是用一個數據類型和一個名字聲明的。比如: String  name; name就是一個變量。

變量有兩種:原始數據類型 和引用。

1.1、原始數據類型

原始數據類型指的是 8種數據類型:byte、char、short、int、long、float、double、boolean。

注意:float f=32.5f。 其中“f”。除非加上f,否則所有帶小數點的值,都會被Java當成double來處理。

1.2、引用變量

  1. 事實上沒有對象變量這種東西;
  2. 只有引用(reference)到對象的變量;
  3. 對象引用變量保存的是存取對象的方法;
  4. 它並不是對象的容器,而是類似指向對象的指針,或者可以說是地址。但在Java中我們不會也不該知道引用變量中實際裝載的是什麼,它只是用來代表單一的對象。只有Java虛擬機纔會知道如何使用引用來取的該對象。
  5. 對象只存在於可回收的垃圾堆上。
  6. 原始數據類型變量是以字節來代表實際的變量值。但對象引用用字節來表示取的對象的方法,也就是保存着對象的地址。

2、對象的聲明、創建與賦值

  • 聲明一個引用變量: Dog myDog;

該過程會要求虛擬機分配空間給引用變量,並將此變量命名爲myDog。次引用變量將永遠被固定爲Dog類型。

注意:對對象的引用,其實就是一個機器地址,一個機器地址所需內存一般是8字節(64位架構的計算機,32爲架構的是4字節),而且所有的對象引用大小都一樣。

  • 創建對象:   new Dog();

該過程會要求Java虛擬機分配堆空間給新建立的Dog對象。

  • 賦值: Dog myDog=new Dog();

將新創建的Dog賦值給myDog這個引用變量。

3、對象的回收

public class Student {
    String name;
    int age;

    public static void main(String[] args) {

        Student s1=new Student();   //創建對象1
        Student s2=new Student();   //創建對象2
        
        s1=null; //s1置空,這樣 對象1沒有被引用,可以被GC回收,但是s1可以引用其他相同類型的變量
        
        s1=s2;   //s1引用的對象變爲 對象2 ,對象1 也沒有被引用,可以被GC回收
        
        s2=null; //s2對對象2沒有引用,但是s1對對象2有引用,所以不會被GC回收
    }
}

4、一個對象的內存

一個對象的內存=所有實例變量使用的內存+對象本身的開銷(一般是16字節)

對象本身的開銷=一個指向對象類的引用+垃圾回收信息+同步信息

另外一般內存的使用都會被填充爲8字節(64位計算機中的機器字)的倍數。不夠8的倍數,填充爲8的倍數。

      Integer對象內存(24字節)= 對象開銷(16字節)+int(4字節)+填充字節(4字節)

      Date對象內存(32字節)=對象開銷(16字節)+3*int(12字節)+填充字節(4字節)

     Counter對象內存(32字節)=對象開銷(16)+String(8)+int(4)+填充字節(4)、

     Node內存(40)=對象開銷(16)+額外開銷(8)+Item的引用(8)+Node的引用(8) 

因爲Node是一個非靜態的內部類,所以它持有對外部類的引用,額外開銷就是來之於對外部類的引用。

對對象的引用,其實就是一個機器地址,一個機器地址所需內存一般是8字節(64位架構的計算機,32爲架構的是4字節)

5、數組對象

數組也是對象,而且數組中的每個元素都是變量,要麼是原始數據類型的變量,要麼就是對對象的引用。

        int[] ages=new int[20];
        Student[] s=new Student[20];

6、方法參數

當我們創建有參數的方法時,我們方法裏邊的參數是形參,調用方法的一方會傳入實參。

在Java中對於原始數據類型,調用方法進行傳參時,它是通過拷貝來進行傳遞的,在方法中該邊原始數據類型的值,不會改變傳入方的值;但是對象的引用在傳遞的時候,會將形參和實參指向同一個對象,這時候在方法中改變對象中的值,是會影響到傳入方對象的值的。

7、封裝

封裝的基本原則就是:將對象的實例變量標記爲私有的,然後提供公有的setter和getter方法空控制存取動作。

8、實例變量與局部變量

實例變量永遠都會有默認值,如果你沒有明確的賦值給實例變量,或者沒有調用setter,實例變量還是會有值。

int----0; float ----0.0; boolean---false ; 對象引用-----null;

局部變量沒有默認值,如果在變量沒有被初始化前就使用的話,編譯器會顯示錯誤。如下如的count;

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章