詳解Java中的有參構(gòu)造方法與無(wú)參構(gòu)造方法
前言
遇到了就簡(jiǎn)單寫一下吧,如果能夠?qū)δ阌袔椭c(diǎn)個(gè)贊吧。首先清晰明了的了解到有參構(gòu)造方法與無(wú)參構(gòu)造方法、以及應(yīng)用,然后實(shí)戰(zhàn)項(xiàng)目一般會(huì)使用的Lombok,不會(huì)手動(dòng)再生成get、set。
定義:
在編寫一個(gè)類時(shí)沒有添加無(wú)參構(gòu)造方法,那么編譯器會(huì)自動(dòng)添加無(wú)參構(gòu)造方法;(如果自己手動(dòng)添加構(gòu)造函數(shù),無(wú)論有參數(shù)或是沒參數(shù),默認(rèn)構(gòu)造函數(shù)都將無(wú)效)
編寫時(shí)添加有參構(gòu)造方法而未添加無(wú)參構(gòu)造方法,那么編譯器只認(rèn)有參構(gòu)造方法而不會(huì)默認(rèn)添加無(wú)參構(gòu)造方法。
如果需要使用無(wú)參構(gòu)造方法,一定要在類里面添加。
有參構(gòu)造方法
在之前我們要為一個(gè)對(duì)象賦值,先要?jiǎng)?chuàng)建好對(duì)象之后然后“對(duì)象名.屬性名”或者調(diào)用屬性的setter為屬性賦值。但是在很多時(shí)候覺得這樣做很麻煩,最好的做法是在創(chuàng)建對(duì)象的時(shí)候完成屬性的初始化操作,此時(shí)需要使用到有參數(shù)構(gòu)造方法方能完成該功能(有人把構(gòu)造方法叫做構(gòu)造器)。
例子:(idea快捷鍵Alt+insert生成構(gòu)造方法和get、set等)
1、定義一個(gè)Student類
package com.hn.yuan.common; /** * 有參構(gòu)造方法 */ 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、定義一個(gè)Test類,來(lái)進(jìn)行查看運(yùn)行效果
package com.hn.yuan.common; public class Test { public static void main(String[] args) { //使用有參數(shù)的構(gòu)造方法實(shí)例化對(duì)象 Student st=new Student("張三","18"); st.start(); } }
運(yùn)行效果
此時(shí)發(fā)現(xiàn)了我們不需要像之前一樣,要為對(duì)象的屬性賦值就必須先創(chuàng)建對(duì)象再使用“對(duì)象名.屬性名”或者使用setter 方法去實(shí)現(xiàn)了,而是直接使用有參數(shù)的構(gòu)造方法去實(shí)現(xiàn)。
3、定義原理呈現(xiàn)
在編寫一個(gè)類時(shí)沒有添加無(wú)參構(gòu)造方法,那么編譯器會(huì)自動(dòng)添加無(wú)參構(gòu)造方法;(如果自己手動(dòng)添加構(gòu)造函數(shù),無(wú)論有參數(shù)或是沒參數(shù),默認(rèn)構(gòu)造函數(shù)都將無(wú)效)
編寫時(shí)添加有參構(gòu)造方法而未添加無(wú)參構(gòu)造方法,那么編譯器只認(rèn)有參構(gòu)造方法而不會(huì)默認(rèn)添加無(wú)參構(gòu)造方法。
如果需要使用無(wú)參構(gòu)造方法,一定要在類里面添加。
無(wú)參構(gòu)造方法
作用:無(wú)參構(gòu)造方法一般是用來(lái)初始化:如為變量賦初值、初始化對(duì)象等。
在之前我們使用過(guò)方法,在調(diào)用的方法的是時(shí)候需要在方法名稱之后加.上小括號(hào),括號(hào)里面可以傳遞實(shí)參,那么我們?cè)趧?chuàng)建一個(gè)對(duì)象的時(shí)候使用的是“new類名()”的方式去實(shí)現(xiàn),其實(shí)上這也是一種方法,但是這個(gè)方法我們沒有明確的去定義,那為什么可以調(diào)用呢?觀察代碼。
例子:
1、首先,我們定義一個(gè)Student類
package com.hn.yuan.common; /** * 無(wú)參構(gòu)造方法 */ public class Student { private String name; private String age; //含有 無(wú)參構(gòu)造方法 public Student() { System.out.println("調(diào)用了無(wú)參構(gòu)造方法"); } 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、定義一個(gè)Test類,來(lái)進(jìn)行查看運(yùn)行效果
package com.hn.yuan.common; public class Test { public static void main(String[] args) { //使用有參數(shù)的構(gòu)造方法實(shí)例化對(duì)象 Student st=new Student(); System.out.println(st); } }
運(yùn)行效果
定義四個(gè)類說(shuō)明情況(如果還不清晰請(qǐng)看)
類Person1 自己不手動(dòng)添加任何無(wú)參或有參數(shù)構(gòu)造方法 (實(shí)例化對(duì)象時(shí):編譯通過(guò))
類Person2 自己添加無(wú)參的構(gòu)造方法 (實(shí)例化對(duì)象時(shí):編譯通過(guò))
類Person3 有參數(shù)的構(gòu)造方法 (實(shí)例化對(duì)象時(shí):不通過(guò))
類Person4 自己添加無(wú)參的構(gòu)造方法,和有參數(shù)的構(gòu)造方法 (實(shí)例化對(duì)象時(shí):編譯通過(guò))
//定義類Person1 自己不手動(dòng)添加任何無(wú)參或有參數(shù)構(gòu)造方法 class Person1{ private int age; private String name; private String sex; } //定義類Person2 自己添加無(wú)參的構(gòu)造方法 class Person2{ private int age; private String name; private String sex; public Person2(){ System.out.println("無(wú)參構(gòu)造方法被調(diào)用"); } } //定義類Person3 有參數(shù)的構(gòu)造方法 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 自己添加無(wú)參的構(gòu)造方法,和有參數(shù)的構(gòu)造方法 class Person4{ private int age; private String name; private String sex; //不帶參數(shù)的構(gòu)造函數(shù),可以被重載 public Person4(){ System.out.println("無(wú)參構(gòu)造方法被調(diào)用"); } //帶參數(shù)對(duì)的構(gòu)造函數(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();//編譯通過(guò);①實(shí)例化Person對(duì)象 ②自動(dòng)調(diào)用構(gòu)造方法Person( ) Person2 person2 = new Person2();//編譯通過(guò);打印: 無(wú)參構(gòu)造方法被調(diào)用 // 這樣寫,編譯器會(huì)報(bào)錯(cuò),原因是系統(tǒng)默認(rèn)的無(wú)參構(gòu)造方法被有參構(gòu)造方法覆蓋,編譯器不能再提供無(wú)參構(gòu)造方法 Person3 person3 = new Person3(); //Person4 person4 = new Person4();//編譯通過(guò);打印: 無(wú)參構(gòu)造方法被調(diào)用 Person4 person4 = new Person4("qzz", "man", 18);//編譯通過(guò); } }
使用構(gòu)造器時(shí)
1、構(gòu)造器必須與類同名(如果一個(gè)源文件中有多個(gè)類,那么構(gòu)造器必須與公共類同名)
2、每個(gè)類可以有一個(gè)以上的構(gòu)造器
3、構(gòu)造器可以有0個(gè)、1個(gè)或1個(gè)以上的參數(shù)
4、構(gòu)造器沒有返回值
5、構(gòu)造器總是伴隨著new操作一起調(diào)用
父類有有參構(gòu)造方法有兩種情況,一只有有參構(gòu)造,那么子類的構(gòu)造方法中的第一句必須調(diào)用父類的有參構(gòu)造方法,也就是“super(…);”,…為你傳入的參數(shù)如:
class Father { public Father(String lastname) { } } class Son extends Father { public Son() { super("aaaa");// 這句必須有 // 可以寫其他代碼 } }
二有有參也有無(wú)參構(gòu)造方法,這時(shí)子類不顯示調(diào)用super,這會(huì)默認(rèn)自動(dòng)調(diào)用父類無(wú)參的構(gòu)造方法,
class Father { public Father() { } public Father(String lastname) { } } class Son extends Father { public Son() { super();// 這句可以有也可以沒有,沒有寫的話會(huì)自動(dòng)調(diào)用 // 可以寫其他代碼 } }
Lombok的基本使用
首先我們要了解的信息:
IntelliJ IDEA 2020.3及以上版本已經(jīng)內(nèi)置Lombok plugin了,所以不需要安裝插件,只需要在項(xiàng)目添加Lombok依賴就能用了。(如果按照其它人給的辦法通過(guò)非官方渠道安裝Lombok plugin,反而可能出現(xiàn)版本兼容問(wèn)題,所以IDEA 2020.3及以上版本的不要瞎搞去安裝Lombok plugin了)
同時(shí):lombok在2020.2就開始斷更了,所以idea2021及之后的marketplace就不開始支持lombok了信息來(lái)源1(IDEA 2020.3的更新說(shuō)明):https://www.jetbrains.com/idea/whatsnew/2020-3/#page__content-other
開始應(yīng)用:
注意:下載的版本要與idea版本對(duì)應(yīng),要不然可能會(huì)報(bào)錯(cuò)
1、官方下載之前對(duì)應(yīng)idea版本的lombok
第一種:直接lombok官方:lombok各個(gè)版本下載地址
第二種:打開IDEA的File——setting——Plugins,搜索lombok,應(yīng)用即可。
(一般內(nèi)網(wǎng)狀態(tài)下,會(huì)給你個(gè)Lombok壓縮包,引入-應(yīng)用-即可)
2、使用Lombok
第一種引入方式:直接在maven中添加依賴
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <!--這里由于采用springboot管理version,所以沒有version標(biāo)簽--> </dependency>
第二種引入方式:在需要的類上面加注解@Data,會(huì)爆紅
爆紅之后,鼠標(biāo)移到爆紅位置,選擇添加add ‘lombok’ to classpath即可,maven會(huì)自動(dòng)幫我們添加依賴。
例子:
package com.hn.yuan.common; import lombok.AllArgsConstructor; import lombok.Data; /** * lombok的使用 */ @Data @AllArgsConstructor public class Student { private String name; private String age; }
常用注解作用:
@Data
等價(jià)于@Setter、@Getter、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode
@NoArgsConstructor
@NoArgsConstructor在類上使用,這個(gè)注解可以生成無(wú)參構(gòu)造方法,如下所示:
/** * 編譯前代碼 */ @RequiredArgsConstructor public class Student() { private String name; private String age; } /** * 編譯后代碼 */ public class Student() { private String name; private String age; public Student() { } }
@AllArgsConstructor
@AllArgsConstructor在類上使用,這個(gè)注解可以生成全參構(gòu)造函數(shù),且默認(rèn)不生成無(wú)參構(gòu)造函數(shù)。
不過(guò)需要注意的是,這里所說(shuō)的全參并不包括已經(jīng)被初始化的被final關(guān)鍵字修飾的字段,因?yàn)樽侄我坏┍籪inal關(guān)鍵字修飾被賦值后就不能再被修改,如下所示:
/** * 編譯前代碼 */ @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 :注在類上,提供類的全參構(gòu)造
@NoArgsConstructor :注在類上,提供類的無(wú)參構(gòu)造
@Setter :注在屬性上,提供 set 方法
@Getter :注在屬性上,提供 get 方法
@EqualsAndHashCode :注在類上,提供對(duì)應(yīng)的 equals 和 hashCode 方法
@Log4j/@Slf4j :注在類上,提供對(duì)應(yīng)的 Logger 對(duì)象,變量名為 log
以上就是詳解Java中的有參構(gòu)造方法與無(wú)參構(gòu)造方法的詳細(xì)內(nèi)容,更多關(guān)于Java有參與無(wú)參構(gòu)造方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹
這篇文章主要介紹了Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹,柵欄類似閉鎖,但是它們是有區(qū)別的,需要的朋友可以參考下2015-04-04Java批量插入數(shù)據(jù)的代碼實(shí)現(xiàn)
日常工作或者學(xué)習(xí)中,可能會(huì)遇到批量插入數(shù)據(jù)的需求,一般情況下數(shù)據(jù)量少的時(shí)候,我們會(huì)直接調(diào)用批量接口插入數(shù)據(jù)即可,當(dāng)數(shù)據(jù)量特別大時(shí),我們就會(huì)用到分批插入數(shù)據(jù),所以本文給大家介紹了Java批量插入數(shù)據(jù)的代碼實(shí)現(xiàn),需要的朋友可以參考下2024-01-01淺談mybatis-plus批量保存異常及效率優(yōu)化
本文主要介紹了mybatis-plus批量保存異常及效率優(yōu)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01springMVC幾種頁(yè)面跳轉(zhuǎn)方式小結(jié)
本篇文章主要介紹了springMVC 幾種頁(yè)面跳轉(zhuǎn)方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02