首頁技術文章正文

Java 基礎——構造器和方法的區(qū)別

更新時間:2018-07-11 來源:黑馬程序員JavaEE培訓學院 瀏覽量:

構造函數(shù)(構造器)是一種特殊的函數(shù)。其主要功能是用來在創(chuàng)建對象時初始化對象, 即為對象成員變量賦初始值,總與new運算符一起使用在創(chuàng)建對象的語句中。構造函數(shù)與類名相同,可重載多個不同的構造函數(shù)。在JAVA語言中,構造函數(shù)與C++語言中的構造函數(shù)相同,JAVA語言中普遍稱之為構造方法。
構造方法的聲明:
修飾符 class_name(類名)  (參數(shù)列表){
邏輯代碼
}
構造器特性:
1.如果我們的類當中沒有定義任何構造器,系統(tǒng)會給我們默認提供一個無參的構造器。
2.如果我們的類當中定義了構造器,那么系統(tǒng)就不會再給我們提供默認的無參構造器。
作用:構建創(chuàng)造一個對象。同時可以給我們的屬性做一個初始化操作。
下面主要學習構造器和方法的區(qū)別:
我們說構造器是一種方法,就象講澳大利亞的鴨嘴獸是一種哺育動物。(按:老外喜歡打比喻,我也就照著翻譯)。要理解鴨嘴獸,那么先必須理解它和其他哺育動物的區(qū)別。同樣地,要理解構造器,那么就要了解構造器和方法的區(qū)別。所有學習java的人,尤其是對那些要認證考試的,理解構造器是非常重要的。下面將簡單介紹一下 ,最后用一個表作了些簡單的總結(jié)。
1、功能和作用的不同
構造器是為了創(chuàng)建一個類的實例。用來創(chuàng)建一個對象,同時可以給屬性做初始化。這個過程也可以在創(chuàng)建一個對象的時候用到:Platypus p1 = new Platypus();
相反,方法的作用是僅僅是功能函數(shù),為了執(zhí)行java代碼。
2、修飾符,返回值和命名的不同
構造器和方法在下面三個方便的區(qū)別:修飾符,返回值,命名。
和方法一樣,構造器可以有任何訪問的修飾: public, protected, private或者沒有修飾(通常被package 和 friendly調(diào)用). 不同于方法的是,構造器不能有以下非訪問性質(zhì)的修飾: abstract, final, native, static, 或者 synchronized。
3、返回類型
方法必須要有返回值,能返回任何類型的值或者無返回值(void),構造器沒有返回值,也不需要void。
4、命名
構造器使用和類相同的名字,而方法則不同。按照習慣,方法通常用小寫字母開始,而構造器通常用大寫字母開始。
構造器通常是一個名詞,因為它和類名相同;而方法通常更接近動詞,因為它說明一個操作。
5、調(diào)用:
構造方法:只有在對象創(chuàng)建的時候才會去調(diào)用,而且只會調(diào)用一次。
 一般方法:在對象創(chuàng)建之后才可以調(diào)用,并且可以調(diào)用多次。
6、"this"的用法
構造器和方法使用關鍵字this有很大的區(qū)別。方法引用this指向正在執(zhí)行方法的類的實例。靜態(tài)方法不能使用this關鍵字,因為靜態(tài)方法不屬于類的實例,所以this也就沒有什么東西去指向。構造器的this指向同一個類中,不同參數(shù)列表的另外一個構造器,我們看看下面的代碼:
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個不同參數(shù)列表的構造器。第一個構造器,給類的成員name賦值,第二個構造器,調(diào)用第一個構造器,給成員變量name一個初始值 "John/Mary Doe".
在構造器中,如果要使用關鍵字this,那么,必須放在第一行,如果不這樣,將導致一個編譯錯誤。
7、"super"的用法
構造器和方法,都用關鍵字super指向超類,但是用的方法不一樣。方法用這個關鍵字去執(zhí)行被重載的超類中的方法??聪旅娴睦樱?br/>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中被重載的方法。
構造器使用super去調(diào)用超類中的構造器。而且這行代碼必須放在第一行,否則編譯將出錯??聪旅娴睦樱?br/>public class SuperClassDemo { 
SuperClassDemo() {} 

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


在上面這個沒有什么實際意義的例子中,構造器 Child()包含了 super,它的作用就是將超類中的構造器SuperClassDemo實例化,并加到 Child類中。
編譯器自動加入代碼
編譯器自動加入代碼到構造器,對于這個,java程序員新手可能比較混淆。當我們寫一個沒有構造器的類,編譯的時候,編譯器會自動加上一個不帶參數(shù)的構造器,例如:public class Example {}
編譯后將如下代碼:
public class Example { 
Example() {} 

在構造器的第一行,沒有使用super,那么編譯器也會自動加上,例如: 
public class TestConstructors { 
TestConstructors() {} 

編譯器會加上代碼,如下:
public class TestConstructors { 
TestConstructors() { 
super; 


仔細想一下,就知道下面的代碼
public class Example {} 
經(jīng)過會被編譯器加代碼形如:
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()卻不能被繼承。

總結(jié):

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

本文版權歸黑馬程序員JavaEE學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!

作者:黑馬程序員JavaEE培訓學院

首發(fā):http://java.itheima.com/

分享到:
在線咨詢 我要報名
和我們在線交談!