用構造器確保初始化
類里的數據成員,有三個途徑初始化:
- 默認初始化,一般都為0。即使沒有默認構造器,也會初始化
- 直接初始化,就是直接賦值
- 構造器(構造函數)初始化
重載
涉及基本類型的重載需要注意一下
- 常數被當做int
- 如果傳入的數據類型小于方法中聲明的形式參數,自動提升
- char略有不同,如果無法找到恰好接受char參數的方法,就會把char提升為int
注意不要通過返回值區分重載方法
默認構造器
默認構造器就是無參數構造函數,可以更改默認構造器。
如果定義了構造器,編譯器就不會自動創建默認構造器
class Bird{
Bird(int i){}
Bird(double i) {}
}
new Bird();//這樣就會找不到構造器
this關鍵字
- this關鍵字只能在方法內部使用,表示對“調用方法的那個對象”的引用。但要注意在方法內部調用同一個類的另一個方法,就不比使用this,直接調用即可。
當需要返回對當前對象的引用時,常常用return this
public class leaf{
int i=0;
leaf incres(){
i++;
return this;
}}
leaf x=new leaf();
x.incres().incres().i;//i=2
- 將自身傳遞給外部方法時,必須使用this關鍵字。
- 在構造器中調用構造器可以用this,必須放在構造器的開頭,一個構造器內只能有一個this。除了構造器可以調用構造器,其他任何地方都不可以調用
static的含義
- static是沒有this的方法。(還不理解)
- static方法不能調用非靜態方法。可以直接通過類調用(主要用途)
- 在類中置入static方法就可以訪問其他static方法和static域
清理:終結處理和垃圾回收
finalize()函數后面再深入學習
成員初始化
默認初始化是類的數據成員。而方法的數據成員需要手動。
自動初始化在構造器被調用前執行。
初始化順序
變量定義的先后順序決定了初始化的順序。即使變量定義散布于方法定義之間,他們仍舊會在任何地方(包括構造器)被調用之前得到初始化。
靜態數據的初始化
靜態初始化只有在必要時刻才會進行。只有第一次訪問靜態數據是被初始化,此后,靜態對象不會再次被出書畫。
總結對象的創建過程:
- 即使沒有顯示使用static關鍵字,構造器實際上也是靜態方法。當首次創建類型為Dog的對象時,或者Dog類的靜態方法/靜態域首次被訪問時,Java解釋器必須查找類途徑,以定位Dog.class.
- 然后載入Dog.class, 有關所有靜態初始化的動作都會執行。因此,靜態初始化只在class對象首次加載的時候進行一次
- 當用new Dog()創建對象的時候, 首先將在堆上為Dog對象分配足夠的存儲空間、
- 這塊存儲空間被清零。設置為默認值0 or null
- 執行所有出現于字段定義處的初始化動作
- 執行構造器
數組的初始化
- 數組特殊的初始化是由一對花括號完成的,等價于new
int[] a1={1,2,3,4,5};
int[] a2=a1;//兩者指向同一片內存空間
a1.length;//length是數組的固有成員
- 直接用new在數組里創建元素
int[] a=new int[num];
int[] b;
b=new int[num];
- 可以用花括號括起來的列表初始化對象數組
Integer[] a= {new Integer(1), new Integer(2), 3,};
Integer[] b=new Integer[]{new Integer(1), new Integer(2), 3,};
System.out.println(Arrays.toString(a));