1. 程式人生 > >java面向物件——方法詳解

java面向物件——方法詳解

1. 方法的所屬

方法是類或物件的行為特徵的抽象,方法是類或物件最重要的組成部分。在邏輯上要麼屬於類,要麼屬於物件。從功能上看,方法完全類似於傳統結構化程式設計裡的函式。實際上,方法確實是傳統的函式發展而來。

方法和函式的區別:

1. 在結構化程式語言中:函式是一等公民,整個軟體是由一個個的函式組成。
2. 在面向物件程式語言中:類才是一等公民,整個系統由一個個類組成,因此在java中方法不能獨立存在。
				     方法必須屬於類或物件。

因此,如果需要定義方法,則只能在類體中定義,不能獨立定義一個方法。java裡的方法不能獨立存在,它必須屬於一個類過著一個物件,因此方法不能像函式那樣被獨立執行,必須使用類或者物件來作為呼叫者。

同一個類裡不同方法之間相互呼叫時,是直接呼叫的嗎?

同一個類的一個方法呼叫另外一個方法時,如果被呼叫的方法是普通方法,會預設使用this作為呼叫者;如果被呼叫的方法是static靜態方法,則預設使用類作為呼叫者。也就是說,表面上看起來某些方法可以被獨立執行,但實際上還是使用this或者類來作為呼叫者。

2. 成員方法

成員方法就是指在類體中定義的方法,用於描述該類事物的行為資訊,換句話說,成員方法就是對語句塊的打包,從而實現程式碼的複用,提高程式碼的可維護性。

[修飾符] 方法返回值型別 方法名(形參列表){	
	方法體;
}
	
修飾符:public、protected、private、static、final、abstract
	   abstract和final最多隻能出現其一;可以和static組合起來修飾屬性。
	   
方法返回值型別:如果聲明瞭方法返回值型別,則方法體中必須有一個有效的return語句;否則用void。

【static】修飾的成員表明它屬於這個類本身,而不熟該類的單個例項。通常把static修飾的成員變數和方法也成為類變數,類方法。靜態成員不能直接訪問非靜態成員。

3. 構造方法(構造器)

構造方法是一種特殊的方法,使用new關鍵字構造物件時,會自動呼叫構造方法來進行成員變數的初始化工作。

預設的構造方法:

構造方法是一個類建立物件的根本途徑,如果一個類沒有構造器,這個類通常無法建立例項。

因此,任何一個編譯後的類都必須含有構造方法。如果源程式中沒有定義,編譯器在編譯時將為其自動新增一個無參的空構造方法(稱之為“預設/預設構造方法”)。例如,Point() {}

當定義了構造方法後,JAVA編譯器將不再新增預設的構造方法

[修飾符] 類名 (形參列表){				//修飾符 	public、protected、private
	super();
	//構造器執行體;
}	

Point(int m,int n){				//構造方法的名稱必須與類名相同
  this.x = m;
  this.y = n;
}
Point p = new Point(100, 200);	 //事實上,new關鍵字後面是呼叫構造方法來對成員變數進行初始化。

備註:構造器不能定義返回值型別宣告,也不能使用void定義構造器沒有返回值。如果為構造器定義了返回值型別,或者使用void定義構造器沒有返回值,編譯不會出錯,但java會把這個所謂的構造器當成方法來處理。即該方法已不再是構造器。

構造器不是沒有返回值嗎?為什麼不能用void宣告?

簡單的說,這是java的語法規定。實際上,類的構造器是有返回值的,當使用new關鍵字來呼叫構造器時,構造器返回該類的例項,可以吧這個類的例項當做構造器的返回值,因此構造器的返回值型別總是當前類,無需定義返回值型別。但需要注意,不要在構造器裡顯式的使用return來返回當前類的物件,因為構造器的返回值是隱式的。

4. 方法過載

在java語言中,一個檔案允許多個方法的名稱相同,但引數列表不同,稱之為方法的過載(overload)。

編譯器在編譯時會根據其引數列表的不同,繫結到不同的方法。返回值型別可以相同也可以不同,最好還是相同。

5. 遞迴方法

一個方法體內呼叫它自身,被稱為方法遞迴。方法遞迴包含了一種隱式的迴圈,它會重複的執行程式碼,但這種重複執行無須迴圈控制。

public class digui{
    int fa(int n){
	if(n==1) return 1;
	return (n * fa(n-1));
    }
    public static void main(String[] args){
	digui begin = new digui();
	System.out.println(begin.fa(5));
    }
}