Java中的構造方法(建構函式)與普通方法區別

2020-10-18 12:00:29

**

Java中的構造方法(建構函式)與普通方法區別

**
一、明白什麼是構造方法,什麼是普通方法?

所謂的構造方法,是一種特殊的方法,其作用是用來建立物件時初始化物件,即為物件成員變數賦初始值,總是與new運運算元一起使用在建立物件的語句中。特別的,一個類是可以有多個建構函式,可以根據引數個數的不同或者引數型別的不同來區分它們,即為建構函式的過載。
構造方法是類的一個特殊的成員,在類範例化時會自動呼叫,其構造方法定義格式如下:

修飾符 方法名(){}

其中需要注意的是:

  1. 方法名與類名相同;
  2. 沒有返回值型別;
  3. 沒有具體的返回值。

例如接下來這個例子,在建立物件的時候,物件成員可以由建構函式方法進行初始化。

new物件時,都是用構造方法進行範例化的;
例如;Test test = new Test"a");
 //Test("a");其中這個就是建構函式,「a」為構造方法的形參;

而普通方法是簡單來說就是完成特定功能的程式碼塊。其定義的格式如下:

修飾符 返回值型別 方法名 (引數型別 引數名1,引數型別 引數名2,…)
{
函數體;
return 返回值;
}
其中:返回值型別用於限定返回值的資料型別。

二、 明白構造方法和普通方法的特點和作用是什麼?

1. 構造方法的特點:

建構函式的主要作用是完成物件的初始化工作,(如果寫的類裡面沒有建構函式,那麼編譯器會預設加上一個無引數且方法體為空的建構函式).它能夠把定義物件時的引數傳給物件的域。意即當建立一個物件時,這個物件就被初始化.如果這時建構函式不為空,則會在建立物件時就執行建構函式裡面的程式碼:
在這裡插入圖片描述
建構函式的名稱必須與類名相同,包括大小寫。
建構函式沒有返回值的,也不能用void來進行修飾。如果不小心給建構函式新增了返回型別,那麼這將使這個建構函式變成一個普通方法了,則在執行時將產生找不到構造方法的錯誤。
④一個類可以定義多個構造方法,如果在定義類時定義構造方法,則編譯系統會自動插入一個無引數的預設構造器,這個構造器不執行任何程式碼。
構造方法可以過載,以引數的個數,型別,順序來過載。例如:

public static void main(String[] args) {
        Phone p1 = new Phone();
        p1.show();
        
        System.out.println("----------------");
        
        Phone p2 = new Phone("vivoxplay5",2999);
        p2.show();
    }        
}

class Phone{
    private String brand;  //品牌
    private int price;       //價格
    
    //無參構造方法
    public Phone(){
        System.out.println("無參構造");
    }

    //有參構造器
    public Phone(String brand, int price) {
        this.brand = brand;
        this.price = price;
        System.out.println("有參構造");
    }
    
    public void show(){
        System.out.println(brand+"..."+price);
    }

    
}

構造方法給成員變數賦值的兩種方式的區別:

/**
     * 無參構造方法:給屬性進行初始化
     * set/get方法:修改屬性值
     * @param args
     */
public static void main(String[] args) {
        //無參構造建立物件
        Phone p1 = new Phone();    
        p1.setBrand("vivoxplay5");
        p1.setPrice(2999);
        
        p1.setBrand("vivo");
        p1.show();
        
        System.out.println("----------------");
        //有參構造建立物件
        Phone p2 = new Phone("vivoxplay5",2999);
        //這種方式並不是改名,而是將原物件變成垃圾
        //p2 = new Phone("vivo",2000);
        p2.show();
    }        
}

class Phone{
    private String brand;  //品牌
    private int price;       //價格
    
    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    //無參構造方法
    public Phone(){
        System.out.println("無參構造");
    }

    //有參構造器
    public Phone(String brand, int price) {
        this.brand = brand;
        this.price = price;
        System.out.println("有參構造");
    }
    
    public void show(){
        System.out.println(brand+"..."+price);
    }

    
}

2. 構造方法的作用:

【1】 首先,建構函式用來生成並初始化物件;
【2】其次,建構函式可以通過函數的重寫給物件賦初始值,簡化程式碼,例如:
在這裡插入圖片描述
在這段程式碼中,本文建立了兩個Person物件,分別賦給了初始值,但是如果建立的物件比較多的話,程式碼就顯得很重複,這時可以過載Person類裡面的構造方法,以在建立物件的時候就賦給它們初始值,這樣就可以省去重複的程式碼了:
在這裡插入圖片描述
在這裡有一個問題需要特別的注意:在預設的情況下,一個類會有一個預設的建構函式,這個建構函式沒有內容也沒有返回值,一般會省略。在這種情況下,編譯器在編譯的時候會預設加上一個無參且方法體為空的函數。但是,如果類別建構函式被重寫了,如上述的例子,Person類已經有了一個有引數有方法體的建構函式,這是編譯器就不會再給它預設加上一個無參且方法體為空的建構函式,可以理解為無參的建構函式被覆蓋了,這種情況稱為沒有預設建構函式。
而在函數的繼承裡,子類必須呼叫父類別的建構函式。但是子類只能繼承父類別的預設的建構函式,如果父類別沒有預設的建構函式,那麼子類不能從父類別繼承預設建構函式,這是子類必須使用super來實現對父類別的非預設建構函式的呼叫。因此,在建立物件的時候,需要先利用super來呼叫父類別的預設的建構函式來對物件進行初始化,然後呼叫子類自己定義的建構函式。

3.普通方法的特點與作用

【1】普通方法的特點:
方法是解決一類問題的步驟的有序組合;
②一個方法必須屬於某一個類的,獨立於類的方法不存在的;
③Java的普通方法可以操作呼叫它從屬的物件和參數列中的引數;
普通方法的呼叫方式為:物件.方法名(引數),如接下來的程式碼為例:

public void driverCar (int a,double b) {
    speed= 50;
    direction= "南方";
}

⑤Java方法只能有一個返回值,但是「值」的形式具有多樣性
【2】作用:
完成特定功能的程式碼塊,即根據自己專案的需要,進行自己編碼完成專案所需要的功能。

三、明白構造方法和普通方法的呼叫方式是怎樣呼叫的?

1)構造方法的呼叫方式

構造方法分為:無參構造方法有參構造方法

A. 無參構造方法:

public class Student{
public  Student(){                    //無參構造方法

System.out.println("無參方法被呼叫")}

}

public class Test {
public  static void main (String[]  args){
Student   stu = new Student();  //範例化Student物件

}

}//該方法是無參的構造方法,即構造方法不接收引數,執行後輸出即可,無參的構造方法被呼叫。

B. 有參構造方法

為一個屬性賦值有兩種方法: ①直接存取物件屬性②通過setXxx()方法。
如果想在範例化物件的同時就為了物件的屬性進行賦值,可以通過帶引數的構造方法來實現

public class Student{
private String name;
private int  age;
public  Student(String name,int age){             //有參構造方法
    this.name = name;
    this.age  = age ;
}
public  void show (){
System.out.println("姓名:"+name+"年齡:"+age)}
}
public  class  Test02(){
public static void main (String[]   args)
{
Student  stu = new Student("王小五"25)//範例化物件的同時賦值
stu.show();
}
}

2)普通方法的呼叫方式

普通方法分為 有明確返回值的方法沒有明確返回值的方法

A. 有明確返回值的方法的呼叫

可以單獨呼叫(無意義),輸出呼叫,賦值呼叫(推薦)。

public static int sum (int a , int b)
{
    int c = a+b;
    return c ;
}
public static void main(String[] args)
{
           //sum(10,20); //單獨呼叫
           //System.out.println(sum(10,20));  //輸出呼叫
           int sum01 =sum(10,20); //賦值呼叫
}

B. 沒有明確返回值的方法呼叫(void型別方法的呼叫)

只能單獨使用。(如果一個方法沒有明確的返回值型別,方法定義中「返回值型別」就可以用void代替,表示該方法無返回值型別。)

四、注意事項

① Java中的每一類至少有一個構造方法,如果我們沒有去建立,系統自動會為我們建立一個預設的無參構造方法;

②但是如果我們定義了構造方法,系統就不會再為我們提供預設的無參構造方法了。這個時候想使用無參構造方法必須自己定義。因為範例化物件時,不一定會輸入引數,那麼沒有無參的構造方法,又不輸入引數,就會出錯;

③構造方法需要用public來修飾,若使用private,在其他類中無法將其範例化;

④構造方法是可以過載的。所謂過載,是指一個類中可以定義多個方法名相同,但是引數不同的方法。呼叫時,會根據不同的引數自動匹配對應的方法。