Java 基礎——構造器和方法的區別
建構函式(構造器)是一種特殊的函式。其主要功能是用來在建立物件時初始化物件, 即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。建構函式與類名相同,可過載多個不同的建構函式。在JAVA語言中,建構函式與C++語言中的建構函式相同,JAVA語言中普遍稱之為構造方法。
構造方法的宣告:
修飾符 class_name(類名) (引數列表){
邏輯程式碼
}
構造器特性:
1.如果我們的類當中沒有定義任何構造器,系統會給我們預設提供一個無參的構造器。
2.如果我們的類當中定義了構造器,那麼系統就不會再給我們提供預設的無參構造器。
作用:構建創造一個物件。同時可以給我們的屬性做一個初始化操作
下面主要學習構造器和方法的區別:
我們說構造器是一種方法,就象講澳大利亞的鴨嘴獸是一種哺育動物。(按:老外喜歡打比喻,我也就照著翻譯)。要理解鴨嘴獸,那麼先必須理解它和其他哺育動物的區別。同樣地,要理解構造器,那麼就要了解構造器和方法的區別。所有學習java的人,尤其是對那些要認證考試的,理解構造器是非常重要的。下面將簡單介紹一下 ,最後用一個表作了些簡單的總結。
1、功能和作用的不同
構造器是為了建立一個類的例項。用來建立一個物件,同時可以給屬性做初始化。這個過程也可以在建立一個物件的時候用到:Platypus p1 = new Platypus();
相反,方法的作用是僅僅是功能函式,為了執行java程式碼
2、修飾符,返回值和命名的不同
構造器和方法在下面三個方便的區別:修飾符,返回值,命名。
和方法一樣,構造器可以有任何訪問的修飾: public, protected, private或者沒有修飾(通常被package 和 friendly呼叫). 不同於方法的是,構造器不能有以下非訪問性質的修飾: abstract, final, native, static, 或者 synchronized。
3、返回型別
方法必須要有返回值,能返回任何型別的值或者無返回值(void),構造器沒有返回值,也不需要void。
4、命名
構造器使用和類相同的名字,而方法則不同。按照習慣,方法通常用小寫字母開始,而構造器通常用大寫字母開始。
構造器通常是一個名詞,因為它和類名相同;而方法通常更接近動詞,因為它說明一個操作。
5、呼叫:
構造方法:只有在物件建立的時候才會去呼叫,而且只會呼叫一次。
一般方法:在物件建立之後才可以呼叫,並且可以呼叫多次。
6、"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,那麼,必須放在第一行,如果不這樣,將導致一個編譯錯誤。
7、"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;
}
}
8、繼承
構造器是不能被繼承的。子類可以繼承超類的任何方法。看看下面的程式碼:
public class Example {
public void sayHi {
system.out.println("Hi");
}
Example() {}
}
public class SubClass extends Example {
}
類 SubClass 自動繼承了父類中的sayHi方法,但是,父類中的構造器 Example()卻不能被繼承。
總結:
bstract
,
final
, native
, static
, or synchronized
能
返回型別
沒有返回值,沒有void
有返回值,或者void
命名
和類名相同;通常為名詞,大寫開頭
通常代表一個動詞的意思,小寫開頭
this
指向同一個類中另外一個構造器,在第一行
指向當前類的一個例項,不能用於靜態方法
super
呼叫父類的構造器,在第一行
呼叫父類中一個過載的方法
繼承
構造器不能被繼承
方法可以被繼承
編譯器自動加入一個預設的構造器
自動加入(如果沒有)
不支援
編譯器自動加入一個預設的呼叫到超類的構造器
自動加入(如果沒有)
不支援