Java中構(gòu)造函數(shù),set/get方法和toString方法使用及注意說(shuō)明
一、構(gòu)造函數(shù)
構(gòu)造函數(shù)的最大作用就是創(chuàng)建對(duì)象時(shí)完成初始化,當(dāng)我們?cè)趎ew一個(gè)對(duì)象并傳入?yún)?shù)的時(shí)候,會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)并完成參數(shù)的初始化。
如下:
public class Test01 { private String name; //有參構(gòu)造函數(shù) public Test01(String name) { this.name = name; } public static void main(String[] args) { Test01 t=new Test01("Wade"); System.out.println(t.name); } }
運(yùn)行結(jié)果是“Wade”
插一句,插入構(gòu)造函數(shù)快捷鍵:alt+insert,Constructor(構(gòu)造函數(shù))
這就說(shuō)明在我們創(chuàng)建Test01對(duì)象時(shí),會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)完成初始化,這時(shí)程序中的name屬性就成了Wade。
上面說(shuō)到構(gòu)造函數(shù)是為了在new對(duì)象傳入?yún)?shù)后完成屬性的初始化。
但是 ,為什么我程序中不寫構(gòu)造函數(shù)依然可以完成初始化。
1.如果不寫構(gòu)造函數(shù),程序會(huì)自動(dòng)生成一個(gè)無(wú)參數(shù)無(wú)操作的構(gòu)造函數(shù)(默認(rèn)的,隱藏)。
2.如果寫了構(gòu)造函數(shù),則自定義構(gòu)造函數(shù)會(huì)覆蓋無(wú)參數(shù)構(gòu)造函數(shù)。
3.如果只寫了有參數(shù)的構(gòu)造函數(shù),且不存在無(wú)參數(shù)的構(gòu)造函數(shù),將不能以 new XXX(); 這樣的方式實(shí)例化對(duì)象,在實(shí)例化對(duì)象代碼中,new XXX("***"); 括號(hào)中的參數(shù)必須與構(gòu)造函數(shù)的參數(shù)保持一致,否則報(bào)錯(cuò)。(當(dāng)然你也可以生成對(duì)象后通過他們的set、get方法進(jìn)行賦值。)
所以,比較穩(wěn)妥也是較常用的方式是在java類中同時(shí)定義無(wú)參構(gòu)造函數(shù)和有參構(gòu)造函數(shù),代碼如下:
public class Test01 { private String name; //有參構(gòu)造函數(shù) public Test01(String name) { this.name = name; } //無(wú)參構(gòu)造函數(shù) public Test01() { } public static void main(String[] args) { //既可以調(diào)用有參構(gòu)造函數(shù)實(shí)例化對(duì)象 Test01 t=new Test01("Wade"); //又可以調(diào)用有參構(gòu)造函數(shù)實(shí)例化對(duì)象 Test01 t1=new Test01(); System.out.println(t.name+","+t1.name); } }
運(yùn)行結(jié)果是“Wade,null”
這樣在實(shí)際使用中會(huì)非常方便的。
二、set()/get()方法
我們先來(lái)看看set和get這兩個(gè)詞的表面意思,set是設(shè)置的意思,而get是獲取的意思,顧名思義,這兩個(gè)方法是對(duì)數(shù)據(jù)進(jìn)行設(shè)置和獲取用的。
然后我們來(lái)了解一下JAVA面向?qū)ο缶幊讨械姆忾]性和安全性。封閉性即對(duì)類中的域變量進(jìn)行封閉操作,即用private來(lái)修飾他們,如此一來(lái)其他類則不能對(duì)該變量訪問。
這樣我們就將這些變量封閉在了類內(nèi)部,這樣就提高了數(shù)據(jù)的安全性,當(dāng)我們想要操作這些域變量怎么辦呢?
我們可以通過兩種方法,第一中即通過public方式的構(gòu)造器(或稱構(gòu)造函數(shù)),對(duì)象一實(shí)例化就對(duì)該變量賦值。
第二種就是通過上面提到的set和get方法,這里我舉一個(gè)特定的例子,我定義一個(gè)Person類,該類中有name、age這兩個(gè)私有域變量,然后我定義setname()、getname()、setage()、getage()這四個(gè)方法,通過這四個(gè)方法來(lái)實(shí)現(xiàn)對(duì)name和age的操作。
這樣一來(lái),我不用直接對(duì)Person類中的域變量操作,而是通過set和get方法間接地操作這些變量,這樣就能提高域變量的安全性,同時(shí)又保證了域變量的封裝型。
現(xiàn)在以上述代碼為例,添加set/get方法
同樣使用快捷鍵:alt+insert,Getter and Setter
public class Test01 { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //有參構(gòu)造函數(shù) public Test01(String name) { this.name = name; } //無(wú)參構(gòu)造函數(shù) public Test01() { } public static void main(String[] args) { //既可以調(diào)用有參構(gòu)造函數(shù)實(shí)例化對(duì)象 Test01 t=new Test01("Wade"); //又可以調(diào)用無(wú)參構(gòu)造函數(shù)實(shí)例化對(duì)象 Test01 t1=new Test01(); //使用set()方法給屬性賦值 t.setName("CP3"); //傳統(tǒng)方式賦值 t1.name="Rose"; //使用get()方法獲取屬性值 System.out.println("t:"+t.getName()+","+"t1:"+t1.name); //在同一個(gè)類中,t.getName()和t.name效果是一樣的,但如果不是同一個(gè)類,屬性是私有的,就只能使用t.getName(),set()方法也是一樣的。 } }
運(yùn)行結(jié)果是“t:CP3,t1:Rose”
這就是java編程語(yǔ)言的封裝思想,希望大家好好理解。
三、toString()方法
Object類具有一個(gè)toString()方法,你創(chuàng)建的每個(gè)類都會(huì)繼承該方法。
它返回對(duì)象的一個(gè)String表示,并且對(duì)于調(diào)試非常有幫助。
然而對(duì)于默認(rèn)的toString()方法往往不能滿足需求,需要覆蓋這個(gè)方法。
toString()方法將對(duì)象轉(zhuǎn)換為字符串。
將上述代碼最后加上
System.out.println(t.toString()); System.out.println(t1.toString());
運(yùn)行結(jié)果是
全限定名@地址首地址
Test01@6d6f6e28
Test01@135fbaa4
這是什么呢?是對(duì)象的地址值,但這不是我們需要的信息,我們想要對(duì)象的各種屬性值,所以需要重寫toString()方法。
同樣使用快捷鍵:alt+insert,toString()
public class Test01 { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //有參構(gòu)造函數(shù) public Test01(String name) { this.name = name; } //無(wú)參構(gòu)造函數(shù) public Test01() { } //重寫toString()方法,可以自定義 @Override public String toString() { return "Test01{" + "name='" + name + '\'' + '}'; } public static void main(String[] args) { //既可以調(diào)用有參構(gòu)造函數(shù)實(shí)例化對(duì)象 Test01 t=new Test01("Wade"); //又可以調(diào)用無(wú)參構(gòu)造函數(shù)實(shí)例化對(duì)象 Test01 t1=new Test01(); //使用set()方法給屬性賦值 t.setName("CP3"); //傳統(tǒng)方式賦值 t1.name="Rose"; //使用get()方法獲取屬性值 System.out.println("t:"+t.getName()+","+"t1:"+t1.name); //在同一個(gè)類中,t.getName()和t.name效果是一樣的,但如果不是同一個(gè)類,屬性是私有的,就只能使用t.getName(),set()方法也是一樣的。 System.out.println(t.toString()); System.out.println(t1.toString()); } }
運(yùn)行結(jié)果是
t:CP3,t1:Rose
Test01{name='CP3'}
Test01{name='Rose'}
這樣就得到我們想要的信息了,這就是重寫toString()在java類中的基本用法了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java的Struts2框架中攔截器使用的實(shí)例教程
攔截器是Struts框架的重要特性,Struts中每一個(gè)Action請(qǐng)求都包裝在一系列的攔截器的內(nèi)部,這里我們就來(lái)看一下Java的Struts2框架中攔截器使用的實(shí)例教程2016-07-07crawler4j抓取頁(yè)面使用jsoup解析html時(shí)的解決方法
crawler4j對(duì)response沒有指定編碼的頁(yè)面,解析成亂碼,很讓人煩惱,下面給出解決方法,需要的朋友可以參考下2014-04-04SpringCloud Feign隔離與降級(jí)詳細(xì)分析
Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非常基礎(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似2022-11-11Java實(shí)現(xiàn)把文件壓縮成zip文件的示例代碼
這篇文章主要為大家介紹了如何通過Java語(yǔ)言實(shí)現(xiàn)將文件壓縮成zip文件,本文中示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02SpringBoot使用Thymeleaf模板引擎訪問靜態(tài)html的過程
這篇文章主要介紹了SpringBoot使用Thymeleaf模板引擎訪問靜態(tài)html的過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10JavaScript base64 與 File 之間的互轉(zhuǎn)(操作方法)
在JavaScript 中,可以使用 Blob 對(duì)象將 base64 字符串轉(zhuǎn)換為 File 對(duì)象,這篇文章主要介紹了JavaScript base64 與 File之間的互轉(zhuǎn),需要的朋友可以參考下2024-05-05Intellij Idea插件開發(fā)之創(chuàng)建項(xiàng)目層級(jí)的右鍵菜單
這篇文章主要介紹了Intellij Idea插件開發(fā)之創(chuàng)建項(xiàng)目層級(jí)的右鍵菜單,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-02-02Java設(shè)計(jì)模式之迭代模式(Iterator模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之迭代模式(Iterator模式)介紹,本文用一個(gè)老師點(diǎn)名的現(xiàn)象描述了迭代模式的使用,需要的朋友可以參考下2015-03-03