2010-01-20 82 views
2

正如我的名字所暗示的,我是一名.NET開發人員,但我對Java越來越感興趣,並且我有興趣瞭解更多關於其他語言的內容,因爲這有助於我更全面地瞭解編程。無參數方法/靜態

無論如何,我的問題是這樣的:建議將不帶參數/工作狀態的方法(只是方法中的參數,糾正我,如果我錯了)建議靜態。靜態和無參數方法之間的關係/鏈接是什麼?不使用狀態意味着如果你將一個Person對象傳遞給方法,並且你不編輯該對象的狀態(例如它的屬性) - 這是我的理解。

我不介意任何Java特定的答案。

感謝

+0

哇,329問題........ – 2010-01-20 23:52:29

回答

2

靜態和無參數方法之間沒有關係。

靜態方法是不在接收類中訪問實例狀態(因此不需要與特定實例關聯)的方法。它可以輕鬆拍攝參數:

public class Calculator 
{ 
    public static int Add(int a, int b) { return a + b; } // does not need any Calculator state 
} 

靜態方法可以訪問其參數(因此,可以修改自己的狀態,如果他們允許的話):

public class Officialdom 
{ 
    public static void Rename(Person person) { person.Name = "Bob"; } // does not need any Officialdom state 
} 

相反,一個參數的方法很可能需要訪問接收器的狀態,並且因此是一個實例(非靜態)方法:

在C#貝科
public class Spline 
{ 
    private bool _isReticulated; 
    public void Reticulate() 
    { 
    _isReticulated = true; // does need Spline state 
    } 
} 

(I已經張貼代碼樣本使用這是語言無關的;在Java中也適用相同的概念和區別,可能只需要更改一些關鍵字。)

+0

接收者狀態的正式定義是什麼?所以在最後一個代碼示例中,您基本上訪問了同一個類的字段 - 這是接收者狀態的概念嗎?在這種情況下,使用實例方法。 – dotnetdev 2010-01-20 23:12:33

+0

接收器是通過其調用方法的東西。例如。在person.GetName()中,person是接收者。狀態大致指的是對象的字段。所以接收者狀態意味着方法被調用的東西的字段。所以如果你訪問對象(實例)字段,它必須是一個實例方法。 (在靜態方法中,*類本身*是接收者:沒有實例接收調用,所以沒有實例接收者狀態。如果存在類狀態(靜態字段),那麼可以按照S洛特的答案訪問它)。 – itowlson 2010-01-20 23:45:20

3

「什麼是靜態的參數的方法之間的關係/鏈接?」

無。

「不帶參數/與國家工作方法......被推薦進行靜態」

真的嗎?通過誰?你能提供一個鏈接或報價嗎?

靜態意味着該方法屬於該類 - 作爲一個整體 - 不是該類的任何特定對象。因此,靜態方法只能處理靜態變量,而不是實例變量。

無參數並不意味着什麼。這可能是該方法僅處理實例變量或只處理靜態變量。或者它返回一個常量。或者它有一些對這種方法是私有的計算。例如,它可以創建套接字,使用HTTP進行讀取並銷燬套接字。沒有參數;沒有實例變量。

+0

感謝您的解釋。一些談論編碼的鏈接說「這個方法沒有采用狀態,所以我們會把它變成靜態的」,我會嘗試挖掘鏈接。 – dotnetdev 2010-01-20 23:13:55

2

static方法之間沒有連接,並且它們對傳遞給它們的參數做了什麼。 static方法是CLASS級別的方法,而不是Java中的INSTANCE級別。 static方法與它們聲明的類相關聯,而不是這些類的實例。

2

有一個通用原則,方法不應該有權訪問比他們需要更多的數據。這是成員變量通常是私有的原因之一,OO使用封裝來隱藏系統其他部分的數據和代碼。

當你有一個函數不需要訪問該類中的變量時,一些人建議使該方法成爲靜態的。

函數是否有參數不影響它是否有權訪問實例方法。