qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          Java構(gòu)造器和方法的區(qū)別

          摘要
          要學(xué)習(xí)Java,你必須理解構(gòu)造器。因?yàn)闃?gòu)造器可以提供許多特殊的方法,這個(gè)對于初學(xué)者經(jīng)常混淆。但是,構(gòu)造器和方法又有很多重要的區(qū)別。
          原作者:Robert Nielsen 原站:www.javaworld.com 

          我們說構(gòu)造器是一種方法,就象講澳大利亞的鴨嘴獸是一種哺育動(dòng)物。(按:老外喜歡打比喻,我也就照著翻譯)。要理解鴨嘴獸,那么先必須理解它和其他哺育動(dòng)物的區(qū)別。同樣地,要理解構(gòu)造器,那么就要了解構(gòu)造器和方法的區(qū)別。所有學(xué)習(xí)java的人,尤其是對那些要認(rèn)證考試的,理解構(gòu)造器是非常重要的。下面將簡單介紹一下 ,最后用一個(gè)表作了些簡單的總結(jié)。 

          功能和作用的不同
          構(gòu)造器是為了創(chuàng)建一個(gè)類的實(shí)例。這個(gè)過程也可以在創(chuàng)建一個(gè)對象的時(shí)候用到:Platypus p1 = new Platypus(); 

          相反,方法的作用是為了執(zhí)行java代碼。 

          修飾符,返回值和命名的不同
          構(gòu)造器和方法在下面三個(gè)方便的區(qū)別:修飾符,返回值,命名。和方法一樣,構(gòu)造器可以有任何訪問的修飾: public, protected, private或者沒有修飾(通常被package 和 friendly調(diào)用). 不同于方法的是,構(gòu)造器不能有以下非訪問性質(zhì)的修飾: abstract, final, native, static, 或者 synchronized。 

          返回類型也是非常重要的。方法能返回任何類型的值或者無返回值(void),構(gòu)造器沒有返回值,也不需要void。 

          最后,談?wù)剝烧叩拿?gòu)造器使用和類相同的名字,而方法則不同。按照習(xí)慣,方法通常用小寫字母開始,而構(gòu)造器通常用大寫字母開始。構(gòu)造器通常是一個(gè)名詞,因?yàn)樗皖惷嗤欢椒ㄍǔ8咏鼊?dòng)詞,因?yàn)樗f明一個(gè)操作。 

          "this"的用法
          構(gòu)造器和方法使用關(guān)鍵字this有很大的區(qū)別。方法引用this指向正在執(zhí)行方法的類的實(shí)例。靜態(tài)方法不能使用this關(guān)鍵字,因?yàn)殪o態(tài)方法不屬于類的實(shí)例,所以this也就沒有什么東西去指向。構(gòu)造器的this指向同一個(gè)類中,不同參數(shù)列表的另外一個(gè)構(gòu)造器,我們看看下面的代碼: 

          public class Platypus { 

          String name; 

          Platypus(String input) { 
          name = input; 


          Platypus() { 
          this("John/Mary Doe"); 


          public static void main(String args[]) { 
          Platypus p1 = new Platypus("digger"); 
          Platypus p2 = new Platypus(); 



          在上面的代碼中,有2個(gè)不同參數(shù)列表的構(gòu)造器。第一個(gè)構(gòu)造器,給類的成員name賦值,第二個(gè)構(gòu)造器,調(diào)用第一個(gè)構(gòu)造器,給成員變量name一個(gè)初始值 "John/Mary Doe". 

          在構(gòu)造器中,如果要使用關(guān)鍵字this,那么,必須放在第一行,如果不這樣,將導(dǎo)致一個(gè)編譯錯(cuò)誤。 

          "super"的用法 
          構(gòu)造器和方法,都用關(guān)鍵字super指向超類,但是用的方法不一樣。方法用這個(gè)關(guān)鍵字去執(zhí)行被重載的超類中的方法。看下面的例子: 

          class Mammal { 
          void getBirthInfo() { 
          System.out.println("born alive."); 



          class Platypus extends Mammal { 
          void getBirthInfo() { 
          System.out.println("hatch from eggs"); 
          System.out.print("a mammal normally is "); 
          super.getBirthInfo(); 



          在上面的例子中,使用super.getBirthInfo()去調(diào)用超類Mammal中被重載的方法。 

          構(gòu)造器使用super去調(diào)用超類中的構(gòu)造器。而且這行代碼必須放在第一行,否則編譯將出錯(cuò)。看下面的例子: 

          public class SuperClassDemo { 
          SuperClassDemo() {} 


          class Child extends SuperClassDemo { 
          Child() { 
          super(); 



          在上面這個(gè)沒有什么實(shí)際意義的例子中,構(gòu)造器 Child()包含了 super,它的作用就是將超類中的構(gòu)造器SuperClassDemo實(shí)例化,并加到 Child類中。 

          編譯器自動(dòng)加入代碼
          編譯器自動(dòng)加入代碼到構(gòu)造器,對于這個(gè),java程序員新手可能比較混淆。當(dāng)我們寫一個(gè)沒有構(gòu)造器的類,編譯的時(shí)候,編譯器會(huì)自動(dòng)加上一個(gè)不帶參數(shù)的構(gòu)造器,例如:public class Example {} 
          編譯后將如下代碼: 

          public class Example { 
          Example() {} 



          在構(gòu)造器的第一行,沒有使用super,那么編譯器也會(huì)自動(dòng)加上,例如: 

          public class TestConstructors { 
          TestConstructors() {} 


          編譯器會(huì)加上代碼,如下: 

          public class TestConstructors { 
          TestConstructors() { 
          super; 



          仔細(xì)想一下,就知道下面的代碼 

          public class Example {} 

          經(jīng)過會(huì)被編譯器加代碼形如: 

          public class Example { 
          Example() { 
          super; 



          繼承

          構(gòu)造器是不能被繼承的。子類可以繼承超類的任何方法。看看下面的代碼: 

          public class Example { 
          public void sayHi { 
          system.out.println("Hi"); 


          Example() {} 


          public class SubClass extends Example { 


          類 SubClass 自動(dòng)繼承了父類中的sayHi方法,但是,父類中的構(gòu)造器 Example()卻不能被繼承。

          總結(jié) 

          主題構(gòu)造器方法
          功能建立一個(gè)類的實(shí)例java功能語句
          修飾不能用bstractfinalnative,static, or synchronized
          返回類型沒有返回值,沒有void有返回值,或者void
          命名和類名相同;通常為名詞,大寫開頭通常代表一個(gè)動(dòng)詞的意思,小寫開頭
          this指向同一個(gè)類中另外一個(gè)構(gòu)造器,在第一行指向當(dāng)前類的一個(gè)實(shí)例,不能用于靜態(tài)方法
          super調(diào)用父類的構(gòu)造器,在第一行調(diào)用父類中一個(gè)重載的方法
          繼承構(gòu)造器不能被繼承方法可以被繼承
          編譯器自動(dòng)加入一個(gè)缺省的構(gòu)造器自動(dòng)加入(如果沒有)不支持
          編譯器自動(dòng)加入一個(gè)缺省的調(diào)用到超類的構(gòu)造器自動(dòng)加入(如果沒有)不支持

          posted on 2014-07-30 10:49 順其自然EVO 閱讀(142) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 吴旗县| 嘉荫县| 文登市| 平原县| 远安县| 克东县| 吉林市| 江安县| 娄底市| 丰镇市| 华宁县| 中西区| 井研县| 周至县| 阿克苏市| 富锦市| 瑞金市| 舟山市| 上犹县| 绥棱县| 凌海市| 绍兴市| 光山县| 政和县| 福清市| 原平市| 左云县| 合川市| 遂昌县| 兴安盟| 云安县| 石门县| 山西省| 蓝山县| 苍南县| 岑巩县| 探索| 姜堰市| 汝南县| 察哈| 永年县|