Java入門:深度理解JAVA本身的構造器(轉)
Java入門:深度理解JAVA本身的構造器(轉)[@more@]理解構造器--構造器和方法的區別
摘要
要學習Java,你必須理解構造器。因為構造器可以提供許多特殊的方法,這個對於初學者經常混淆。但是,構造器和方法又有很多重要的區別。
我們說構造器是一種方法,就象講澳大利亞的鴨嘴獸是一種哺育動物。(按:老外喜歡打比喻,我也就照著翻譯)。要理解鴨嘴獸,那麼先必須理解它和其他哺育動物的區別。同樣地,要理解構造器,那麼就要了解構造器和方法的區別。所有學習java的人,尤其是對那些要認證考試的,理解構造器是非常重要的。下面將簡單介紹一下 ,最後用一個表作了些簡單的總結。
功能和作用的不同
構造器是為了建立一個類的例項。這個過程也可以在建立一個物件的時候用到:Platypus p1 = new Platypus();
相反,方法的作用是為了執行java程式碼。
修飾符,返回值和命名的不同
構造器和方法在下面三個方便的區別:修飾符,返回值,命名。和方法一樣,構造器可以有任何訪問的修飾: public, protected, private或者沒有修飾(通常被package 和 friendly呼叫). 不同於方法的是,構造器不能有以下非訪問性質的修飾: abstract, final, native, static, 或者 synchronized。
返回型別也是非常重要的。方法能返回任何型別的值或者無返回值(void),構造器沒有返回值,也不需要void。
最後,談談兩者的命名。構造器使用和類相同的名字,而方法則不同。按照習慣,方法通常用小寫字母開始,而構造器通常用大寫字母開始。構造器通常是一個名詞,因為它和類名相同;而方法通常更接近動詞,因為它說明一個操作。
"this"的用法
構造器和方法使用關鍵字this有很大的區別。方法引用this指向正在執行方法的類的例項。靜態方法不能使用this關鍵字,因為靜態方法不屬於類的例項,所以this也就沒有什麼東西去指向。構造器的this指向同一個類中,不同引數列表的另外一個構造器,我們看看下面的程式碼:
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個不同引數列表的構造器。第一個構造器,給類的成員name賦值,第二個構造器,呼叫第一個構造器,給成員變數name一個初始值 "John/Mary Doe".
在構造器中,如果要使用關鍵字this,那麼,必須放在第一行,如果不這樣,將導致一個編譯錯誤。
"super"的用法
構造器和方法,都用關鍵字super指向超類,但是用的方法不一樣。方法用這個關鍵字去執行被過載的超類中的方法。看下面的例子:
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()去呼叫超類Mammal中被過載的方法。
構造器使用super去呼叫超類中的構造器。而且這行程式碼必須放在第一行,否則編譯將出錯。看下面的例子:
public class SuperClassDemo { SuperClassDemo() {} } class Child extends SuperClassDemo { Child() { super(); } }
在上面這個沒有什麼實際意義的例子中,構造器 Child()包含了 super,它的作用就是將超類中的構造器SuperClassDemo例項化,並加到 Child類中。
編譯器自動加入程式碼
編譯器自動加入程式碼到構造器,對於這個,java程式設計師新手可能比較混淆。當我們寫一個沒有構造器的類,編譯的時候,編譯器會自動加上一個不帶引數的構造器,例如:public class Example {}
編譯後將如下程式碼:
public class Example { Example() {} }
在構造器的第一行,沒有使用super,那麼編譯器也會自動加上,例如:
public class TestConstructors { TestConstructors() {} }
編譯器會加上程式碼,如下:
public class TestConstructors { TestConstructors() { super; } }
仔細想一下,就知道下面的程式碼
public class Example {}
經過會被編譯器加程式碼形如:
public class Example { Example() { super; } }
繼承
構造器是不能被繼承的。子類可以繼承超類的任何方法。看看下面的程式碼:
public class Example { public void sayHi { system.out.println("Hi"); } Example() {} } public class SubClass extends Example { }
類 SubClass 自動繼承了父類中的sayHi方法,但是,父類中的構造器 Example()卻不能被繼承。
摘要
要學習Java,你必須理解構造器。因為構造器可以提供許多特殊的方法,這個對於初學者經常混淆。但是,構造器和方法又有很多重要的區別。
我們說構造器是一種方法,就象講澳大利亞的鴨嘴獸是一種哺育動物。(按:老外喜歡打比喻,我也就照著翻譯)。要理解鴨嘴獸,那麼先必須理解它和其他哺育動物的區別。同樣地,要理解構造器,那麼就要了解構造器和方法的區別。所有學習java的人,尤其是對那些要認證考試的,理解構造器是非常重要的。下面將簡單介紹一下 ,最後用一個表作了些簡單的總結。
功能和作用的不同
構造器是為了建立一個類的例項。這個過程也可以在建立一個物件的時候用到:Platypus p1 = new Platypus();
相反,方法的作用是為了執行java程式碼。
修飾符,返回值和命名的不同
構造器和方法在下面三個方便的區別:修飾符,返回值,命名。和方法一樣,構造器可以有任何訪問的修飾: public, protected, private或者沒有修飾(通常被package 和 friendly呼叫). 不同於方法的是,構造器不能有以下非訪問性質的修飾: abstract, final, native, static, 或者 synchronized。
返回型別也是非常重要的。方法能返回任何型別的值或者無返回值(void),構造器沒有返回值,也不需要void。
最後,談談兩者的命名。構造器使用和類相同的名字,而方法則不同。按照習慣,方法通常用小寫字母開始,而構造器通常用大寫字母開始。構造器通常是一個名詞,因為它和類名相同;而方法通常更接近動詞,因為它說明一個操作。
"this"的用法
構造器和方法使用關鍵字this有很大的區別。方法引用this指向正在執行方法的類的例項。靜態方法不能使用this關鍵字,因為靜態方法不屬於類的例項,所以this也就沒有什麼東西去指向。構造器的this指向同一個類中,不同引數列表的另外一個構造器,我們看看下面的程式碼:
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個不同引數列表的構造器。第一個構造器,給類的成員name賦值,第二個構造器,呼叫第一個構造器,給成員變數name一個初始值 "John/Mary Doe".
在構造器中,如果要使用關鍵字this,那麼,必須放在第一行,如果不這樣,將導致一個編譯錯誤。
"super"的用法
構造器和方法,都用關鍵字super指向超類,但是用的方法不一樣。方法用這個關鍵字去執行被過載的超類中的方法。看下面的例子:
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()去呼叫超類Mammal中被過載的方法。
構造器使用super去呼叫超類中的構造器。而且這行程式碼必須放在第一行,否則編譯將出錯。看下面的例子:
public class SuperClassDemo { SuperClassDemo() {} } class Child extends SuperClassDemo { Child() { super(); } }
在上面這個沒有什麼實際意義的例子中,構造器 Child()包含了 super,它的作用就是將超類中的構造器SuperClassDemo例項化,並加到 Child類中。
編譯器自動加入程式碼
編譯器自動加入程式碼到構造器,對於這個,java程式設計師新手可能比較混淆。當我們寫一個沒有構造器的類,編譯的時候,編譯器會自動加上一個不帶引數的構造器,例如:public class Example {}
編譯後將如下程式碼:
public class Example { Example() {} }
在構造器的第一行,沒有使用super,那麼編譯器也會自動加上,例如:
public class TestConstructors { TestConstructors() {} }
編譯器會加上程式碼,如下:
public class TestConstructors { TestConstructors() { super; } }
仔細想一下,就知道下面的程式碼
public class Example {}
經過會被編譯器加程式碼形如:
public class Example { Example() { super; } }
繼承
構造器是不能被繼承的。子類可以繼承超類的任何方法。看看下面的程式碼:
public class Example { public void sayHi { system.out.println("Hi"); } Example() {} } public class SubClass extends Example { }
類 SubClass 自動繼承了父類中的sayHi方法,但是,父類中的構造器 Example()卻不能被繼承。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-962940/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java構造器Java
- Java--構造器和構造方法Java構造方法
- 構造java函式(轉)Java函式
- Java構造器 小白版Java
- Java集合的深度理解Java
- 什麼是 Java 構造器?Java
- java學習之深入構造器Java
- 一文了解 Java 中的構造器Java
- Java入門學習-理解I/OJava
- Effective Java - 靜態方法與構造器Java
- 深入理解Java SPI之入門篇Java
- Java入門學習-深入理解集合Java
- Java入門學習-自我理解IO流Java
- Java入門學習-理解super,this,@override的用法JavaIDE
- Java類載入器深入理解Java
- 理解java的多形性(轉)Java
- Java入門:Hashtable和HashMap的區別(轉)JavaHashMap
- Java基礎03 構造器與方法過載Java
- Effective Java - 構造器私有、列舉和單例Java單例
- 原始碼級深度理解 Java SPI原始碼Java
- java分散式(java入門)Java分散式
- Java 中 String 的構造方法Java構造方法
- Java安全——語言本身的設計Java
- 理解 sole() 查詢構造器方法
- effective java 第2條:遇到多個構造器引數時要考慮用構造器Java
- 深入理解Java類載入器(ClassLoader)Java
- 真正的Java學習從入門到精通(轉)Java
- Java難入門嗎?長沙Java培訓機構哪家好?Java
- java如何入門Java
- JAVA入門程式Java
- java——繼承遇到構造方法Java繼承構造方法
- java構造方法-this關鍵字的用法Java構造方法
- java之繼承中的構造方法Java繼承構造方法
- Docker入門-構建第一個Java程式DockerJava
- Java入門系列-09-迴圈結構Java
- Java入門系列-08-選擇結構Java
- 遇到多個構造器引數時考慮使用構建器(Effective Java )Java
- java架構師筆記:Java中的轉換器設計模式Java架構筆記設計模式