理解構造器
??要學習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();
???}
}
六、繼承
????構造器是不能被繼承的。子類可以繼承超類的任何方法??纯聪旅娴拇a:
public class Example {
??public void sayHi {
????system.out.println("Hi");
??}
??Example() {}
}
public class SubClass extends Example {
}
類 SubClass 自動繼承了父類中的sayHi方法,但是,父類中的構造器 Example()卻不能被繼承。
總結
主題 | 構造器 | 方法 |
功能 | 建立一個類的實例 | java功能語句 |
修飾 | 不能用bstract, final, native, static, or synchronized | 能 |
返回類型 | 沒有返回值,沒有void | 有返回值,或者void |
命名 | 和類名相同;通常為名詞,大寫開頭 | 通常代表一個動詞的意思,小寫開頭 |
this |
指向同一個類中另外一個構造器,在第一行 |
指向當前類的一個實例,不能用于靜態方法 |
super | 調用父類的構造器,在第一行 |
調用父類中一個重載的方法 |
繼承 | 構造器不能被繼承 | 方法可以被繼承 |
編譯器自動加入一個缺省的構造器 |
自動加入(如果沒有) | 不支持 |
編譯器自動加入一個缺省的調用到超類的構造器 | 自動加入(指super(),如果沒有) | 不支持 |
posted on 2006-04-26 16:29 都市淘沙者 閱讀(214) 評論(0) 編輯 收藏 所屬分類: Java Basic/Lucene/開源資料