一、構造器爲何不能用void修飾?java
簡單地說,這是java的語法規定。構造器不能定義返回值類型聲明,也不能使用void定義構造器沒有返回值。若是爲構造器定義了返回值類型,或使用void定義構造器沒有返回值,編譯時不會報錯,但java會把這個所謂的構造器當成方法來處理。程序員
// JDK 8
public class Constructor { public static void main(String[] args) { Constructor c = new Constructor(); System.out.println(c.Constructor()); } public Constructor() { System.out.println("this is constructor!"); } // This method has a constructor name
public int Constructor() { System.out.println("this is method!"); return 520; } // This method has a constructor name
public void Constructor() { System.out.println("this is method!"); return ; } }
輸出:this
this is constructor!
this is method!
520
二、構造器有返回值嗎?spa
實際上,類的構造器有返回值,返回的是該類的實例,所以類的構造器返回值類型是當前類,所以無需定義返回值類型。但注意:不能在構造器裏顯示使用return來返回當前類的對象,由於構造器的返回值是隱式的。只寫return;不會報錯。線程
// JDK 8
public class Constructor { public static void main(String[] args) { Constructor c = new Constructor(); } public Constructor() { System.out.println("this is constructor!"); return this; // Void methods cannot return a value // return; // 不會報錯
} }
三、構造器是建立java對象的途徑,是否是說構造器徹底負責建立java對象?設計
答:不是!構造器是建立java對象的重要途徑,經過new關鍵字調用構造器時,構造器也確實返回了該類的對象,但這個對象並非徹底由構造器負責建立的。實際上,當程序員調用構造器時,系統會先爲該對象分配內存空間,併爲這個對象執行默認初始化,這個對象已經產生了——這些操做都在構造器執行以前就完成了。也就是說,當系統開始執行構造器的執行體以前,系統已經建立了一個對象,只是這個對象還不能被外部程序訪問,只能在該構造器中經過this來引用它。當構造器的執行體結束後,這對象做爲構造器的返回值返回,一般還會賦給另外一個引用類型的變量,從而讓外部程序能夠訪問該對象。code
本身總結:之因此會存在系統提供的空構造器,是由於在執行構造器以前對象已經存在,可是不能直接返給程序,須要藉助中間體拿到這個對象的地址,而這個中間體恰好就是構造器,因此空構造器只是完成最重要的事,就是拿到這個對象的地址。而非空構造器恰好能夠給該對象初始化。對象
四、static、final、synchronized、native能否修飾構造器?blog
static不能修飾構造器:static方法只能訪問static變量,類中所有變量設爲static?繼承
final不能修飾構造器:final方法能夠繼承但不能重寫,構造器不能被繼承。
synchronized不能修飾構造器:沒有實際的須要把構造器定義成同步的,由於它將會在構造的時候鎖住該對象,直到全部的構造器完成它們的工做,這個構造的過程對其它線程來講,一般是不可訪問的。
native不能修飾構造器:沒有本地的構造器是任意一種語言的設計選擇,這樣會使得在建立對象的過程當中JVM實現很容易去校驗父類的構造器是否老是被正確地調用了。
(本地化的方法狀況特別複雜,因此JVM調用起來很是麻煩,須要考慮不少種狀況,沒有native關鍵字的狀況下,JVM實現起來比較容易。)