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