Java構造函數的深入理解


我們人出生的時候,有些人一出生之后再起名字的,但是有些人一旦出生就已經起好名字的。那么我們在 java 里面怎么在對象一旦創建就賦值呢?

public class Person {
    
    String name; //    姓名
    int age; //    年齡
    
    public static void main(String[] args) {
        Person p = new Person(); //    創建了Person類型的p對象
        System.out.println("姓名: " + p.name + " 年齡: " + p.age); //    name = null, age = 0;
        //這個小孩剛出生的時候沒有姓名和年齡
    }

 

public class Person {
    
    String name; //    姓名
    int age; //    年齡
    //    構造方法
    Person(String name,int age){
        this.name = name; //     給對象賦予name值
        this.age = age; //    給對象賦予age值
    }
    public static void main(String[] args) {
        Person p = new Person("張三",1); //    創建了Person類型的p對象,並且調用構造方法賦予該對象屬性值
        System.out.println("姓名: " + p.name + " 年齡: " + p.age); //    name = 張三, age = 1;
        //這個小孩剛出生的時候已經有了姓名和年齡
    }

 

1. 構造方法的作用:

構造方法作用:

1).創建對象,凡是必須和new一起使用.

2).對對象進行初始化.

public class Person {
    
    String name; //    姓名
    int age; //    年齡
    //    全參構造方法
    Person(String name,int age){
        this.name = name; //     給對象賦予name值
        this.age = age; //    給對象賦予age值
    }
    //    無參構造方法
    Person(){
        
    }
    
    public static void main(String[] args) {
        Person p = new Person("張三",1); 
        /*
             根據創建對象的實參個數,jvm回去尋找合適的構造方法,
             兩個實參所有會調用含有兩個參數的構造方法.Person(String name,int age)
         */
        System.out.println("姓名: " + p.name + " 年齡: " + p.age); //    name = 張三, age = 1;
        //這個對象創建出來的時候已經有了自己的姓名和年齡
    }

 

2. 構造函數與普通函數的區別:

 

(1). 一般函數是用於定義對象應該具備的功能。而構造函數定義的是,對象在調用功能之前,在建立時,應該具備的一些內容。也就是對象的初始化內容。

(2). 構造函數是在對象建立時由 jvm 調用, 給對象初始化。一般函數是對象建立后,當對象調用該功能時才會執行。

(3). 普通函數可以使用對象多次調用,構造函數就在創建對象時調用。

(4). 構造函數的函數名要與類名一樣,而普通的函數只要符合標識符的命名規則即可。

(5). 構造函數沒有返回值類型。

 

3. 構造函數要注意的細節:

(1). 當類中沒有定義構造函數時,系統會指定給該類加上一個空參數的構造函數。這個是類中默認的構造函數。當類中如果自定義了構造函數,這時默認的構造函數就沒有了。

備注:可以通過 javap 命令驗證。

(2). 在一個類中可以定義多個構造函數,以進行不同的初始化。多個構造函數存在於類中,是以重載的形式體現的。因為構造函數的名稱都相同。

class Perosn{
    private int id;
    
    private String name;
    
    private int age;
    
    public Perosn(){
        cry();
    }
    public Perosn(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    
    public void cry(){
        System.out.println("哇哇哇....");
    }
    
}

問題:要求每個小孩出生都會哭,這份代碼有兩個構造函數,如果需要每個小孩出生都要哭的話,那么就需要在不同的構造函數中都調用 cry() 函數,但是這樣子的話造成了代碼重復問題,那么怎么解決呢?構造代碼塊。

4. 構造代碼塊:

構造代碼塊作用:給所有的對象進行統一的初始化。

class Perosn{
    private int id;
    
    private String name;
    
    private int age;
    
    {
        cry();// 每個Person對象創建出來都會執行這里的代碼
    }
    
    public Perosn(){
        cry();
    }
    public Perosn(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    
    public void cry(){
        System.out.println("哇哇哇....");
    }
    
}

具體作用:

  1:給對象進行初始化。對象一建立就運行並且優先於構造函數。

  2:與構造函數區別

    1:構造代碼塊和構造函數的區別,構造代碼塊是給所有對象進行統一初始化, 構造函數給對應的對象初始化。

    2:構造代碼塊的作用:它的作用就是將所有構造方法中公共的信息進行抽取。

例如孩子一出生統一哭

代碼如下:

class Boy {

    String name;
    int age;
    String gender;
     // 構造代碼塊,給所有對象進行初始化。
    {
        System.out.println("哭。。。");
    }
     
    Boy() {
        System.out.println("無參構造");
    }

    Boy(String n, int a, String g) {
        name = n;
        age = a;
        gender = g;
        System.out.println("有參構造");
    }

    void run() {
        System.out.println("跑...");
    }

}

class Demo9 {

    public static void main(String[] args) {

        System.out.println();
        Boy b = new Boy();

        Boy b2 = new Boy("jack", 1, "男");

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM