5、this调用语句必须是构造函数中的第一个可执行语句_Java 构造函数
1、構造函數是用來干什么的
構造函數是用來初始化對象的成員屬性的。
舉個例子:
public class MyClass {private String name;private int id;public MyClass(String name, int id){this.name = name;this.id = id;} }在main方法里new一個MyClass對象的過程如下:
public class Main {public static void main(String[] args) {String name = "Jerry";int id = 1;MyClass myClass = new MyClass(name, id);} }注意一個對象建立的過程中,構造函數僅執行一次,后面想對對象的成員做改變等操作可以調用getter/setter方法。
2、構造函數特點
構造函數也是類里的一個函數,跟普通函數不同,構造函數主要有以下幾個特點:
- 構造函數的名稱必須與類名相同,區分大小寫;
- 構造函數沒有返回值,也不能用void修飾;
- 構造函數可以用任何訪問修飾符(public、protected和private)修飾;
- 構造函數不能用static、final、abstract和synchronized等關鍵字修飾;
- 構造函數不能被覆寫(override);
- 構造函數可以被重載(overload),以參數的個數、類型及順序區分;
- 重載意味著一個類里可以有多個構造函數,構造函數1可以調用構造函數2完成對象初始化,通過this關鍵字:this(參數1,參數2...)實現;
- 接口里沒有構造函數,抽象類里可以有構造函數,也可以沒有,抽象類的構造函數在創建繼承自抽象類的子類的對象時會被調用;
3、構造函數分類
構造函數分為有參構造函數、無參構造函數和默認構造函數。
3.1 有參構造函數
帶入參的構造函數叫有參構造函數,上面例子里就是有參構造函數。
3.2 無參構造函數
不帶入參的構造函數叫無參構造函數。無參構造函數對類的成員初始化有下面兩種方法:
(1)在類成員變量聲明時進行初始化
public class MyClass {private String name = "Jerry";private int id = 1;public MyClass(){} }(2)在無參構造函數的方法體里對類成員變量初始化
public class MyClass {private String name;private int id;public MyClass(){this.name = "Jerry";this.id = 1;} }3.3 默認構造函數
當類里沒有顯式地定義代碼來實現任何構造函數時,Java編譯器將會在編譯的字節碼(.class文件)里面為這個類插入默認構造函數。由于是在編譯階段插入,因此在源文件(.java)里是不會找到默認構造函數的代碼的。
默認構造函數形式上類似無參構造函數(都沒有入參),但是二者并不能劃等號,區別如下:
- 默認構造函數方法體為空,無參構造函數方法體可以為空也可以不為空;
- 只要類里顯式的創建了一個構造函數,比如一個無參構造函數,編譯器都不會再為這個類創建默認構造函數了。
4、子類中調用父類的構造函數
在Java中,子類的構造函數必須調用父類的構造函數,這個調用可以是隱式地調用,即代碼里沒有直接調用父類構造函數,但是編譯器會默認調用父類的無參構造函數或者默認構造函數;也可以顯示地通過super關鍵字調用父類的構造函數,總之一句話:子類的構造函數必須調用父類的構造函數。
子類中調用父類的構造函數分為以下兩個場景:
- 當父類定義了無參構造函數,或者父類源碼里沒有顯式定義構造函數而是編譯器插入了一個默認構造函數,則子類構造函數里可以不顯式地調用父類構造函數,此時編譯器會在子類的構造函數里默認調用父類的無參構造函數或者默認構造函數;
- 當父類沒有定義無參構造函數,且定義了有參構造函數,則在子類的構造函數里必須通過super語句顯式地調用父類的有參構造函數。
(1)對于第一個場景,且父類里包含無參構造函數,舉例如下:
父類:
public class Dog {private String name;public Dog(){System.out.println("調用Dog類的無參構造函數");} }子類:
public class YellowDog extends Dog {private String name;public YellowDog(){System.out.println("調用YellowDog類的無參構造函數");} }main函數:
public class Main {public static void main(String[] args) {Dog dog = new YellowDog();} }結果如下:
調用Dog類的無參構造函數 調用YellowDog類的無參構造函數此時創建子類對象時,會先調用父類的無參構造函數,再調用子類的無參構造函數。
如果把父類的無參構造函數去掉,即父類里不定義任何構造函數,此時運行結果如下:
調用YellowDog類的無參構造函數此時創建子類對象時,會先調用父類的默認構造函數,再調用子類的無參構造函數。
(2)對于第二個場景,舉例如下:
父類:
public class Dog {private String name;public Dog(String name){this.name= name;System.out.println("調用Dog類的有參構造函數");} }父類里不包含無參構造函數,僅有有參構造函數,此時子類如果不顯式地調用父類的有參構造函數會報錯,如圖:
提示父類里沒有默認構造函數,那是因為子類里沒有顯式地調用父類構造函數,編譯器會去父類里尋找無參構造函數,無參構造函數也沒有就看能否找到默認構造函數,默認構造函數也找不到就會報上面的錯誤。
正確的做法是在子類里通過super語句顯式地調用父類的構造函數,如下:
子類:
public class YellowDog extends Dog {private String name;public YellowDog(String name){super(name);System.out.println("調用YellowDog類的有參構造函數");} }Main函數:
public class Main {public static void main(String[] args) {String name = "Jerry";Dog dog = new YellowDog(name);} }執行main函數結果如下:
調用Dog類的有參構造函數 調用YellowDog類的有參構造函數此時創建子類對象時,會先調用父類的有參構造函數,再調用子類的有參構造函數。
參考
lea:Java中的構造函數——通過示例學習Java編程(14)?zhuanlan.zhihu.comhttps://blog.csdn.net/yuyan1988nb/article/details/78133738?blog.csdn.netJava里的構造函數(構造方法) - LivterJA - 博客園?www.cnblogs.com總結
以上是生活随笔為你收集整理的5、this调用语句必须是构造函数中的第一个可执行语句_Java 构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交换机和pc机用什么线连接_为什么要用顶
- 下一篇: java美元兑换,(Java实现) 美元