Java對象構造和初始化

構造方法

  1. 對象都有構造方法,
  2. 如果沒有,編譯器回自動加上一個default構造方法
  3. 不可以使用new創建對象的抽象類也有構造方法

調用構造方法

  1. this調用本類的其他構造方法,
  2. super調用直接父類的構造方法,
  3. this和super要放在第一條語句,且只能有一條,
  4. 如果沒有this及super,則編譯器自動加上super(),即調用直接父類不帶參數的構造方法
package study;

import jdk.jshell.PersistentSnippet;

public class ConstructCallThisAndSuper {
    public static void main(String[] args){
        Person p = new Graduate();
    }
}

class Person{
    String name;
    int age;
    Person(){};
    Person(String name, int age){
        this.name=name; this.age=age;
        System.out.println("In Person(String,int)");
    }
}

class Student extends Person
{
    String school;
    Student(){
        this(null, 0, null);
        System.out.println("In Student()");
    }
    Student(String name, int age, String school){
        super(name, age);
        this.school = school;
        System.out.println("In Student(String,int,String)");
    }
}

class Graduate extends Student
{
    String teacher = "";
    Graduate(){
        // super();
        System.out.println("In Graduate");
    }
}

/*
In Person(String,int)
In Student(String,int,String)
In Student()
In Graduate
*/

對象初始化特殊寫法

p = new Person(){{ age=18; name="李明"}}    # 雙花括號,針對沒有對應構造方法,但又要賦值的情況下,創建對象時對屬性賦值

實例初始化:先於構造方法{}中的語句執行

靜態初始化:在第一次使用這個類時要執行,但其執行的具體時機是不確定的,但是總是先於實例的初始化

package study;

public class InitObject {
    public static void main(String[] args){
        test t = new test();
    }
}

class test
{
    test()
    {
        System.out.println("普通初始化");
    }
    {
        System.out.println("實例初始化");
    }
    static{
        System.out.println("靜態初始化");
    }
}

/*
靜態初始化
實例初始化
普通初始化
*/

構造方法的執行過程

  1. 調用本類或父類的構造方法,直到最高一層(object)
  2. 按照聲明順序執行字段的初始化賦值
  3. 執行構造方法中的其他各語句
package study;

public class InitExecutionStep {
    public static void main(String[] args){
        Fruit f = new Apple();
    }
}

class Fruit{
    Fruit(){
        System.out.println("Fruit構造方法執行");
        keepfresh();
    }
    void keepfresh(){
        System.out.println("Fruit類keepfresh方法執行");
    }
}

class Apple extends Fruit{
    String name = "蘋果";     // 第二部
    int fresh = 100;
    Apple(){
        super();    // 第一步
        System.out.println("Apple構造方法執行");  // 第三部
    }
    void keepfresh(){
        System.out.println("保存時間爲:" + fresh);
    }
}


/*
Fruit構造方法執行
保存時間爲:0
Apple構造方法執行
*/

子類構造方法執行時,當父方法的構造方法調用了虛方法,而這個虛方法又被子類覆蓋,則會從父類虛方法跳到子類虛方法,所以上面例子中子類fresh字段還沒來得及賦值,所以打印了一個默認值(0值)

構造方法中儘量不做虛方法調用,唯一能夠安全調用的是具有final屬性的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章