前言-
本文是為個人學習做的整理性質的筆記,肯定帶有許多不妥的地方,僅供參考,
(第五章·初始化與清理 《Thinking in Java》)
用構造器確保初始化
正文-
構造器:
什么是構造器?:C++中引入了構造器的概念,這是一個在創建物件時被自動呼叫的特殊方法,在Java中也是如此,通過提供構造器,來確保每一個物件的初始化,
為什么要構造器?:使用構造器有助于減少錯誤,并使代碼更容易閱讀,
構造器長什么樣子?:構造器采用與類名相同的名稱,兩者必須完全相同,所以“每個方法首字母小寫”的編碼風格并不適合構造器,
不接受任何引數的構造器叫做“默認構造器”,Java中通常使用的術語稱之為“無參構造器”
p.s:
1·從概念上講,“初始化”/“創建”是彼此獨立的,然而在Java代碼中你卻找不到對initialize()的明確呼叫,在Java中,“初始化”/“創建”的捆綁在一起的,兩者不能分離,
2·構造器是一種特殊的方法,因為它沒有回傳值(這與void很像),但是回傳值為空(void)盡管方法本身不會自動回傳什么,但是你仍可以讓他回傳一些東西,構造器則不會有任何回傳值,
3·new 運算式確實回傳了新建物件的參考,但是構造器本身并沒有回傳值(假如有回傳值,并且可以讓人自由選擇回傳型別,那么勢必deranged編譯器知道該如何處理此型別),
4·雖然沒有顯式的使用static關鍵字,但是構造器實際上也是靜態方法(這在初始化順序里會提到)
public class Lianxi1_2 { public static void main(String[] args) { System.out.println("Noteone:"+new Noteone().note); Notetwo nt=new Notetwo(); System.out.println("Notetwo:"+nt.note1+"||"+nt.note2); } } class Noteone{ String note; } class Notetwo{ String note1="hello"; String note2; public Notetwo() { // TODO 自動生成的建構式存根 note2="hello in constructor"; } }練習1和2
方法多載:
大多數程式設計語言里(尤其是C中),要求為每一個方法(也被稱為函式)都提供一個獨一無二的識別符號,
在Java(和C++)里,因為構造器的名字已經由類名所確定,方法的多載就顯得格外的重要,為了方法名相同而其中的形式引數不同的方法同時存在,就必須用到方法的多載,
※形式引數:在定義函式時函式名后面括號中的變數名稱稱為形式引數(簡稱形參),即形參出現在函式定義中,
怎樣區分多載:
1·方法名字相同,引數不同(甚至引數的順序也可以區分,但最好不要這樣做),
2·由于基本型別可以從一個“較小”的型別自動的轉變成一個“較大”的型別,此程序一旦涉及到多載,就會出現一些混淆,
※如果傳入的資料型別(實參/實際引數型別)小于方法中宣告的形式引數型別,實際資料型別就會被提升,“char”型略有不同,她會直接上升至“int”型,
※如果傳入的資料型別較大,就得通過型別轉化來進行窄化轉換(強制轉換或其他轉換方法),
3·切記!!!不能通過回傳值的型別區分多載的方法,
例如:
void f(){ };
int f(){return 1};
在"int i=f();"中的確可以區分,但是有時候你并不關心方法的回傳值,像這樣呼叫方法:" f(); "這時候就不能區分該呼叫哪個方法了,
系統會幫你創建默認構造器
默認構造器(又名無參構造器),她的作用的創建一個默認物件,如果你寫的類中沒有構造器,編譯器將會自動幫你創建一個無參的默認構造器,
※如果你已經寫了一個構造器,編譯器就不會幫你創建了(如果你只寫了一個帶有引數的構造器,由于編譯器不會幫你創建默認構造器了,所以你在創建物件的時候也必須提供引數,除非你又單獨寫了一個無參的構造器),
public class Lianxi3_4 { public static void main(String[] args) { // TODO 自動生成的方法存根 System.out.println(new Nothing().s); new Nothingbut(); new Nothingbut("you"); } } class Nothing{ String s="Nothing"; //驗證系統創建默認構造器 } class Nothingbut{ public Nothingbut() { // TODO 自動生成的建構式存根 System.out.println("nothingbut constructor"); } public Nothingbut(String s) { System.out.println("nothingbut constructor with "+s); } }練習3和4
public class Lainxi5_6 { public static void main(String[] args) { // TODO 自動生成的方法存根 Dog dd=new Dog(); dd.barking(" "); dd.howling(12345); dd.barkAndHowl(123," "); dd.barkAndHowl(" ", 122); } } class Dog{ void barking(String s) { System.out.println("dog is barking!"); } void howling(int i) { System.out.println("dog is howling!"); } void barkAndHowl(String s,int i) { System.out.println("dog is barking and howling!"); } void barkAndHowl(int i,String s) { System.out.println("dog is howling and barking!"); } }練習5·6和7
額外內容:多載,重構與重寫(三重)
重構:通過調整程式代碼改善軟體的質量、性能,使其程式的設計模式和架構更趨合理,提高軟體的擴展性和維護性,通俗點說,重構就是當你發現代碼的不足之處時,去改動它的結構,去優化它,
- 重構的具體做法:可以通過重寫或者多載等,但不限于此,更改注釋、更改函式名類名等,都可以稱之為重構;
- 重構的目的 :是為了讓軟體容易維護, 修改其Bug等,
重寫:子類通過@override來實作方法重寫,在父類里宣告了一個模糊的方法,并不給出詳細的行為,在子類里,通過重寫父類(同方法名,參數,回傳值等)中的這種方法,讓這種方法實體化,去適合子類,
- override(Overwrite):是子類覆寫基類的方法,
- 重寫的特點:
1、必須是在繼承里,
2、方法名、回傳值型別、引數個數和引數型別 都必須相同
3、派生類重寫的方法的訪問權限不能低于基類的權限
4、派生類拋出的例外應該和基類相等或比基類更小
多載:是通過方法的引數識別不同的函式 ,比如你有一個AMethod()不帶引數,然后你用了一個另外相同名稱的方法,帶一個引數AMethod(String para), 這個程序就叫做多載,
重寫與多載的區別:
1.重寫必須繼承,多載不用,
2.重寫的方法名,引數數目相同,引數型別兼容,多載的方法名相同,引數串列不同,
3.重寫的方法修飾符大于等于父類的方法,多載和修飾符無關,
4.重寫不可以拋出父類沒有拋出的一般例外,可以拋出運行時例外,
總結:
重寫:是對方法本身重新撰寫,
多載:函式名相同 引數個數不同,
重構:重寫算是重構的一部分,但重構還包括對程式結構的優化,
※重構居然會出現在軟體工程的卷紙上,給我整蒙了,今天看到多載,聯想到她,特此記錄,
參考鏈接:1.重寫、重構、多載區別
2.java中,重構、多載、重寫
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/41077.html
標籤:其他
