java中<init>方法是怎樣生成的?
阿新 • • 發佈:2018-11-19
文章目錄
一個類可以有多個方法,但只能有一個方法。需要注意的是方法值初始化本類中的例項變數。
1 物件的三種初始化方法
- 建構函式
- 例項變數初始化(Instance variable initializers)
class CoffeeCup { private int innerCoffee =
- 例項初始化塊(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");
}
}
問?輸出結果是什麼?
- 呼叫其他建構函式。An invocation of another constructor
- 例項初始化,應該還包括例項初始化塊。Instance variable initializers
- 當前建構函式的程式碼。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