關于Java父類沒有無參構造方法子類處理方法
關于父類沒有無參構造方法,子類如何處理
1.父類無參構造方法,子類不寫,其實會默認調用父類的無參構造方法也就是用
super
()。 編譯運行后,會打印出"子類會調用Father的第一個構造方法"
class Father{ Father(){ System.out.println("子類會調用Father的第一個構造方法"); } } class Son extends Father{ //我沒在這寫子類的構造方法,但是編譯器默認補上子類構造方法,這里相當于有個Son(){super(); }方法,當然這個super()不寫也一樣 } class Demo{ public static void main(String[] args) { Son s = new Son(); } }
2.但是注意了,下面代碼無法通過編譯。 因為父類重寫了構造方法,編譯器是不會補上無參構造方法的。子類不重寫構造方法,系統(tǒng)會為子類默認補上無參構造方法Son(){super(); } ,注意這個
super()調用的是父類的無參構造方法。 這正好和第一句矛盾了,父類沒有無參數(shù)構造方法子類無法調用到的。怎么解決,看第三條。
class Father{ //父類的有參數(shù)構造方法 Father(String name){ System.out.println("子類會調用Father的有參數(shù)構造方法"); } } class Son extends Father{ } class Demo{ public static void main(String[] args) { Son s = new Son(); } }
3.在第二條基礎上,子類重寫構造方法傳入的string字串,并且顯式的用
super
(name);調用父類的構造方法,既然你都顯式用
super
(name);了編譯器就不會多事給子類補上
super(); 這回就編譯運行正常了。
class Father{ Father(String name){ System.out.println("子類會調用Father的第二個構造方法"); } } class Son extends Father{ Son(String name){ super(name); } } class Demo{ public static void main(String[] args) { Son s = new Son("接第二條"); } }
4.總之:
a.涉及構造方法,你不寫構造方法,編譯器會默認寫上無參構造方法,你寫編譯器就完全不管事了。
b.執(zhí)行子類的構造方法前一定是執(zhí)行父類構造方法的(構造方法用來初始化的,沒爸爸怎么來兒子),所以子類的構造方法中一定是先執(zhí)行父類的構造方法用super()。
c.這個super
和a說的一樣,你不顯式寫出來,編譯器默認用
super(),也就是調用父類的無參構造方法,那你父類肯定得有無參構造方法吧。所以我們寫上一個父類帶參構造方法的時候,另外手動補上個無參構造方法要好些。
補充:
Java有參構造方法與無參構造方法
前言
遇到了就簡單寫一下吧,如果能夠對你有幫助,點個贊吧。首先清晰明了的了解到有參構造方法與無參構造方法、以及應用,然后實戰(zhàn)項目一般會使用的Lombok,不會手動再生成get、set。
定義:
在編寫一個類時沒有添加無參構造方法,那么編譯器會自動添加無參構造方法;(如果自己手動添加構造函數(shù),無論有參數(shù)或是沒參數(shù),默認構造函數(shù)都將無效)
編寫時添加有參構造方法而未添加無參構造方法,那么編譯器只認有參構造方法而不會默認添加無參構造方法。
如果需要使用無參構造方法,一定要在類里面添加。
有參構造方法
在之前我們要為一個對象賦值,先要創(chuàng)建好對象之后然后“對象名.屬性名”或者調用屬性的setter為屬性賦值。但是在很多時候覺得這樣做很麻煩,最好的做法是在創(chuàng)建對象的時候完成屬性的初始化操作,此時需要使用到有參數(shù)構造方法方能完成該功能(有人把構造方法叫做構造器)。
例子:(idea快捷鍵Alt+insert生成構造方法和get、set等)
1、定義一個Student類
package com.hn.yuan.common; /** * 有參構造方法 */ public class Student { private String name; private String age; public Student(String name, String age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public void setAge(String age) { this.age = age; } public String getName() { return name; } public String getAge() { return age; } public void start(){ System.out.println("我叫"+name+"今年"+age+"歲了"); } }
2、定義一個Test類,來進行查看運行效果
package com.hn.yuan.common; public class Test { public static void main(String[] args) { //使用有參數(shù)的構造方法實例化對象 Student st=new Student("張三","18"); st.start(); } }
運行效果
此時發(fā)現(xiàn)了我們不需要像之前一樣,要為對象的屬性賦值就必須先創(chuàng)建對象再使用“對象名.屬性名”或者使用setter 方法去實現(xiàn)了,而是直接使用有參數(shù)的構造方法去實現(xiàn)。
3、定義原理呈現(xiàn)
在編寫一個類時沒有添加無參構造方法,那么編譯器會自動添加無參構造方法;(如果自己手動添加構造函數(shù),無論有參數(shù)或是沒參數(shù),默認構造函數(shù)都將無效)
編寫時添加有參構造方法而未添加無參構造方法,那么編譯器只認有參構造方法而不會默認添加無參構造方法。
如果需要使用無參構造方法,一定要在類里面添加。
無參構造方法
作用:無參構造方法一般是用來初始化:如為變量賦初值、初始化對象等。
在之前我們使用過方法,在調用的方法的是時候需要在方法名稱之后加.上小括號,括號里面可以傳遞實參,那么我們在創(chuàng)建一個對象的時候使用的是“new類名()”的方式去實現(xiàn),其實上這也是一種方法,但是這個方法我們沒有明確的去定義,那為什么可以調用呢?觀察代碼。
例子:
1、首先,我們定義一個Student類
package com.hn.yuan.common; /** * 無參構造方法 */ public class Student { private String name; private String age; //含有 無參構造方法 public Student() { System.out.println("調用了無參構造方法"); } public void setName(String name) { this.name = name; } public void setAge(String age) { this.age = age; } public String getName() { return name; } public String getAge() { return age; } public void start(){ System.out.println("我叫"+name+"今年"+age+"歲了"); } }
2、定義一個Test類,來進行查看運行效果
package com.hn.yuan.common; public class Test { public static void main(String[] args) { //使用有參數(shù)的構造方法實例化對象 Student st=new Student(); System.out.println(st); } }
運行效果
定義四個類說明情況(如果還不清晰請看)
類Person1 自己不手動添加任何無參或有參數(shù)構造方法 (實例化對象時:編譯通過)
類Person2 自己添加無參的構造方法 (實例化對象時:編譯通過)
類Person3 有參數(shù)的構造方法 (實例化對象時:不通過)
類Person4 自己添加無參的構造方法,和有參數(shù)的構造方法 (實例化對象時:編譯通過)
//定義類Person1 自己不手動添加任何無參或有參數(shù)構造方法 class Person1{ private int age; private String name; private String sex; } //定義類Person2 自己添加無參的構造方法 class Person2{ private int age; private String name; private String sex; public Person2(){ System.out.println("無參構造方法被調用"); } } //定義類Person3 有參數(shù)的構造方法 class Person3{ private int age; private String name; private String sex; public Person3(String name, String sex, int age ){ this.name = name; this.sex = sex; this.age = age; } } //定義類Person4 自己添加無參的構造方法,和有參數(shù)的構造方法 class Person4{ private int age; private String name; private String sex; //不帶參數(shù)的構造函數(shù),可以被重載 public Person4(){ System.out.println("無參構造方法被調用"); } //帶參數(shù)對的構造函數(shù) public Person4(String name, String sex, int age ){ this.name = name; this.sex = sex; this.age = age; } } public class ObjectInit_2 { public static void main(String[] args) { Person1 person1 = new Person1();//編譯通過;①實例化Person對象 ②自動調用構造方法Person( ) Person2 person2 = new Person2();//編譯通過;打印: 無參構造方法被調用 // 這樣寫,編譯器會報錯,原因是系統(tǒng)默認的無參構造方法被有參構造方法覆蓋,編譯器不能再提供無參構造方法 Person3 person3 = new Person3(); //Person4 person4 = new Person4();//編譯通過;打印: 無參構造方法被調用 Person4 person4 = new Person4("qzz", "man", 18);//編譯通過; } }
使用構造器時
1、構造器必須與類同名(如果一個源文件中有多個類,那么構造器必須與公共類同名)
2、每個類可以有一個以上的構造器
3、構造器可以有0個、1個或1個以上的參數(shù)
4、構造器沒有返回值
5、構造器總是伴隨著new操作一起調用
父類有有參構造方法有兩種情況,一只有有參構造,那么子類的構造方法中的第一句必須調用父類的有參構造方法,也就是“super(…);”,…為你傳入的參數(shù)如:
class Father { public Father(String lastname) { } } class Son extends Father { public Son() { super("aaaa");// 這句必須有 // 可以寫其他代碼 } }
二有有參也有無參構造方法,這時子類不顯示調用super,這會默認自動調用父類無參的構造方法,
class Father { public Father() { } public Father(String lastname) { } } class Son extends Father { public Son() { super();// 這句可以有也可以沒有,沒有寫的話會自動調用 // 可以寫其他代碼 } }
Lombok的基本使用
首先我們要了解的信息:
IntelliJ IDEA 2020.3及以上版本已經內置Lombok plugin了,所以不需要安裝插件,只需要在項目添加Lombok依賴就能用了。(如果按照其它人給的辦法通過非官方渠道安裝Lombok plugin,反而可能出現(xiàn)版本兼容問題,所以IDEA 2020.3及以上版本的不要瞎搞去安裝Lombok plugin了)
同時:lombok在2020.2就開始斷更了,所以idea2021及之后的marketplace就不開始支持lombok了
信息來源1(IDEA 2020.3的更新說明):https://www.jetbrains.com/idea/whatsnew/2020-3/#page__content-other
開始應用:
注意:下載的版本要與idea版本對應,要不然可能會報錯
1、官方下載之前對應idea版本的lombok
第一種:直接lombok官方:lombok各個版本下載地址
第二種:打開IDEA的File——setting——Plugins,搜索lombok,應用即可。
(一般內網(wǎng)狀態(tài)下,會給你個Lombok壓縮包,引入-應用-即可)
2、使用Lombok
第一種引入方式:直接在maven中添加依賴
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <!--這里由于采用springboot管理version,所以沒有version標簽--> </dependency>
第二種引入方式:在需要的類上面加注解@Data,會爆紅
爆紅之后,鼠標移到爆紅位置,選擇添加add ‘lombok’ to classpath即可,maven會自動幫我們添加依賴。
例子:
package com.hn.yuan.common; import lombok.AllArgsConstructor; import lombok.Data; /** * lombok的使用 */ @Data @AllArgsConstructor public class Student { private String name; private String age; }
常用注解作用:
@Data
等價于@Setter、@Getter、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode
@NoArgsConstructor
@NoArgsConstructor在類上使用,這個注解可以生成無參構造方法,如下所示:
/** * 編譯前代碼 */ @RequiredArgsConstructor public class Student() { private String name; private String age; } /** * 編譯后代碼 */ public class Student() { private String name; private String age; public Student() { } }
@AllArgsConstructor
@AllArgsConstructor在類上使用,這個注解可以生成全參構造函數(shù),且默認不生成無參構造函數(shù)。
不過需要注意的是,這里所說的全參并不包括已經被初始化的被final關鍵字修飾的字段,因為字段一旦被final關鍵字修飾被賦值后就不能再被修改,如下所示:
/** * 編譯前代碼 */ @RequiredArgsConstructor public class Student() { private final String gender; private final Integer ages = 18; private String name; private String age; } /** * 編譯后代碼 */ public class Student() { private final String gender; private final Integer ages = 18; private String name; private String age; public Student(String gender, String name, String age) { this.gender = gender; this.name = name; this.age = age; } }
@AllArgsConstructor :注在類上,提供類的全參構造
@NoArgsConstructor :注在類上,提供類的無參構造
@Setter :注在屬性上,提供 set 方法
@Getter :注在屬性上,提供 get 方法
@EqualsAndHashCode :注在類上,提供對應的 equals 和 hashCode 方法
@Log4j/@Slf4j :注在類上,提供對應的 Logger 對象,變量名為 log
到此這篇關于Java有參構造方法與無參構造方法(完全理解)的文章就介紹到這了,更多相關Java有參構造方法與無參構造方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot2解決idea console 控制臺輸出亂碼的問題
這篇文章主要介紹了Spring Boot2解決idea console 控制臺輸出亂碼的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot如何啟動自動加載自定義模塊yml文件(PropertySourceFactory)
這篇文章主要介紹了SpringBoot如何啟動自動加載自定義模塊yml文件(PropertySourceFactory),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07IDEA通過git回滾到某個提交節(jié)點或某個版本的操作方法
這篇文章主要介紹了IDEA通過git回滾到某個提交節(jié)點或某個版本的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07interrupt()和線程終止方式_動力節(jié)點Java學院整理
線程的thread.interrupt()方法是中斷線程,將會設置該線程的中斷狀態(tài)位,即設置為true,中斷的結果線程是死亡、還是等待新的任務或是繼續(xù)運行至下一步,就取決于這個程序本身2017-05-05MyBatis XML去除多余AND|OR前綴或逗號等后綴的操作
這篇文章主要介紹了MyBatis XML去除多余AND|OR前綴或逗號等后綴的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Java日期工具類操作字符串Date和LocalDate互轉
這篇文章主要介紹了Java日期工具類操作字符串Date和LocalDate互轉,文章首先通過需要先引入坐標展開主題的相關內容介紹,需要的朋友可以參一下2022-06-06