1、構造器為什么不能用void修飾?
簡單地說,這是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 is constructor!
this is method!
520
2、構造器有返回值嗎?
實際上,類的構造器有返回值,返回的是該類的實例,因此類的構造器返回值類型是當前類,因此無需定義返回值類型。但注意:不能在構造器里顯示使用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; // 不會報錯
} }
3、構造器是創建java對象的途徑,是不是說構造器完全負責創建java對象?
答:不是!構造器是創建java對象的重要途徑,通過new關鍵字調用構造器時,構造器也確實返回了該類的對象,但這個對象並不是完全由構造器負責創建的。實際上,當程序員調用構造器時,系統會先為該對象分配內存空間,並為這個對象執行默認初始化,這個對象已經產生了——這些操作都在構造器執行之前就完成了。也就是說,當系統開始執行構造器的執行體之前,系統已經創建了一個對象,只是這個對象還不能被外部程序訪問,只能在該構造器中通過this來引用它。當構造器的執行體結束后,這對象作為構造器的返回值返回,通常還會賦給另一個引用類型的變量,從而讓外部程序可以訪問該對象。
自己總結:之所以會存在系統提供的空構造器,是因為在執行構造器之前對象已經存在,但是不能直接返給程序,需要借助中間體拿到這個對象的地址,而這個中間體剛好就是構造器,所以空構造器只是完成最重要的事,就是拿到這個對象的地址。而非空構造器剛好可以給該對象初始化。
4、static、final、synchronized、native可否修飾構造器?
static不能修飾構造器:static方法只能訪問static變量,類中全部變量設為static?
final不能修飾構造器:final方法可以繼承但不能重寫,構造器不能被繼承。
synchronized不能修飾構造器:沒有實際的需要把構造器定義成同步的,因為它將會在構造的時候鎖住該對象,直到所有的構造器完成它們的工作,這個構造的過程對其它線程來說,通常是不可訪問的。
native不能修飾構造器:沒有本地的構造器是任意一種語言的設計選擇,這樣會使得在創建對象的過程中JVM實現很容易去校驗父類的構造器是否總是被正確地調用了。
(本地化的方法情況特別復雜,所以JVM調用起來非常麻煩,需要考慮很多種情況,沒有native關鍵字的情況下,JVM實現起來比較容易。)
