1. 程式人生 > >java中<init>方法是怎樣生成的?

java中<init>方法是怎樣生成的?

文章目錄


一個類可以有多個方法,但只能有一個方法。需要注意的是方法值初始化本類中的例項變數

1 物件的三種初始化方法

  • 建構函式
  • 例項變數初始化(Instance variable initializers)
    class CoffeeCup {
     private int innerCoffee =
    355; // "= 355" 就是初始化器 initializer // no constructor here // ... }
  • 例項初始化塊(instance initialization block or instance initializer)
    class CoffeeCup {
    private int innerCoffee;
    // 例項初始化塊
    {
        innerCoffee = 355;
    }
    // no constructor here
    // ...
    }
    

2 <init>的結構:

在看結果之前,先看個例子:


public class Test
{ public static void main(String[] args) { new X();//XYYX } } class X extends Y{ { System.out.print("Y"); } X(){ System.out.print("X"); } } class Y{ { System.out.print("X"); } Y(){ System.out.print("Y"); } }

問?輸出結果是什麼?

  1. 呼叫其他建構函式。An invocation of another constructor
  2. 例項初始化,應該還包括例項初始化塊。Instance variable initializers
  3. 當前建構函式的程式碼。The constructor body

回到這個例子,結果是:XYYX

3 this()和super()上不能try……catch

在this()和super()上try……catch是會炸的。如果你都catch了的話,你就可能忽略這個exception,進而返回不正確的物件。

4 遇到new時

繼承和初始化順序,遇到new時:
先分配空間(子類中的例項變數和父類中的例項變數)
初始化預設值
呼叫當前類的<init>(注意<init的結構)

5 不能這樣提前引用。會拒絕編譯

class VirtualCafe {
    private int chairsCount = 4 * tablesCount;
    private int tablesCount = 20;
    //...
}

6 提前引用的兩種方式

但是有兩種方式來進行提前引用。但是得到的值為預設值。
(1) 初始化例項變數時用一個函式,且這個函式用到了在這個例項變數之後定義的變數。

class VirtualCafe {
    private int chairsCount = initChairsCount();//這樣chairsCount的值為0
    private int tablesCount = 20;
    private int initChairsCount() {
        return tablesCount * 4;
    }
    //...
}

(2)在父類中的建構函式中呼叫父類中被重寫的方法(前提是這個父類的建構函式是由子類的建構函式呼叫的),就可以提前引用。如:


public class Test {
	public static void main(String[] args)  {
		new Coffee(1, 2.5f, true, true);
	}
}

//In source packet in file init/ex16/Liquid.java
class Liquid {
	private int mlVolume;
	private float temperature; // in Celsius
	public Liquid(int mlVolume, float temperature) {
		this.mlVolume = mlVolume;
		this.temperature = temperature;
		method();//如果是從子類呼叫這個方法,這裡的method使用的是子類的方法
	}
	public void method() {
		System.out.println("我在父類");
	}
}

class Coffee extends Liquid {
	private boolean swirling;
	private boolean clockwise;
	public Coffee(int mlVolume, float temperature, boolean swirling, boolean clockwise)  {
		super(mlVolume, temperature);
		this.swirling = swirling;
		if (swirling) {
			this.clockwise = clockwise;
		} 
		System.out.println("success");
	}
	//父類的method被重寫了
	public void method() {
		System.out.println(swirling);
	}
}

輸入結果:
在這裡插入圖片描述
而不是:
我在父類
success

7 參考文獻

https://www.javaworld.com/article/2076614/core-java/object-initialization-in-java.html?page=2