1. 程式人生 > >構造器與方法過載

構造器與方法過載

在編寫的每個類中都會定義一個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)嗎?

答:不能,首先構造器不能被繼承,(因為每個類名不同,構造器又和類名相同,所以沒法繼承)。所以沒法重寫,

只能過載。