構造器與方法過載
在編寫的每個類中都會定義一個initialize(),會提醒你使用物件前呼叫initialalize(),建立一個構造器。構造器採用與類相同的名字。如果我們沒有給資料成員賦予初始化值,資料成員會更急其型別採用預設初始值(無參構造器)。
顯式初始化要求我們在寫程式時就確定初始值,這有時很不方便。我們可以使用構造器(constructor)來初始化物件。構造器可以初始化資料成員,還可以規定特定的操作。這些操作會在建立物件時自動執行。
定義構造器
一、構造器是幹什麼用的?(what)
構造器是用來生成一個類的例項是用來初始化這個例項用的
二、構造器如何工作?(how)
Java在構造例項時的順序是這樣的:
1、分配物件空間,並將物件中成員初始化為0或者空,java不允許使用者操縱一個不定值的物件。
2、執行屬性值的顯式初始化
3、執行構造器
4 、將變數關聯到堆中的物件上
基本特徵如下:
1.構造器的名字與類名相同
2.構造器沒有返回值
public class Test2 { public static void main (String[]args){ Bird bird = new Bird(3); System.out.println(bird.getAge()); } } class Bird{ private int age;//成員變數 Bird(int age){ this.age = age;//區域性變數 System.out.println("my age is"); } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } /*out my age is 3 */
此時構造器整體就放入了main方法中,其中做了2件事
- 把區域性變數的值賦予給成員變數 this.age = age ;
- 輸出語句 System.out.println("my age is");
構造器是怎麼使用的呢?通過建立new Bird(new Bird())的形式,呼叫Bird構造器。其實Java都會預設提供一個無參構造器,當你定義了構造器,Java會呼叫定義的構造器,把age初始化為3。
初始化方法的優先順序
通過debug測試可以看到其順序,如果成員變數有值的話,會採用成員變數的值。但是最終經過構造器中,通過構造器獲取的區域性變數最終對成員變數進行賦值。
public Test{ public static void main (String[]args){ Bird bird = new Bird(3); System.out.println(bird.getAge()); } } class Bird{ private int age = 4; Bird(int age){ // 先獲得3 this.age = age;//經過成員變數獲得4,但最終經過構造器獲得3 } public int getAge() { return age; } } /* * out * 3 */
最終結果是3。
順序是 構造方法 > 成員變數
通過Thinking in Java中的一段關於初始化順序,可以自己debug看看順序
class Window {
Window(int marker) { System.out.println("Window(" + marker + ")"); }
}
class House {
Window w1 = new Window(1); // Before constructor
House() {
// Show that we're in the constructor:
System.out.println("House()");
w3 = new Window(33); // Reinitialize w3
}
Window w2 = new Window(2); // After constructor
void f() { System.out.println("f()"); }
Window w3 = new Window(3); // At end
}
public class OrderOfInitialization {
public static void main(String[] args) {
House h = new House();
h.f(); // Shows that construction is done
}
}
/*
* Window(1)
* Window(2)
* Window(3)
* House()
* Window(33)
* f()
*/
構造器方法過載
一個類中可以定義不止一個構造器,通過方法過載可以構造多個構造器
public Test3{
public static void main(String[]args){
Bird bird = new Bird(3,"bugu");
System.out.println(bird.getAge());
}
}
clas Bird{
private int age;
private String s;
Bird(int age){ //不適用
this.age = age;
}
Bird(int age, String s){
this.age = age;
this.s = s;
System.out.println("Im say "+s);
}
int getHeight()
{
return this.height;
}
public String getS() {
return s;
}
}
/*
* out
* Im say bugu
* 3
*/
上面定義了2個構造器,名字都是Bird。但在new一個新物件時,Java會根據提供的引數選擇對應的構造器。
chong
在面試中也會被經常問一道題構造器可以被重寫(Override)嗎?
答:不能,首先構造器不能被繼承,(因為每個類名不同,構造器又和類名相同,所以沒法繼承)。所以沒法重寫,
只能過載。