2010-03-06 54 views
23

我有一個有多種方法的類,這些方法中沒有構造函數。我可以在沒有實例化這個類的情況下使用類的方法嗎?

所以,我想知道是否有可能在沒有創建類的實例的情況下調用類的方法。

例如,我可以做這樣的事情:

NameOfClass.doMethod(x1,x2,...,xn) 

總的來說,我不明白爲什麼它應該是不可能的。我只是調用一個函數來做一些事情(或者返回一些值)。如果可能的話,如果該方法爲該類的私有變量設置一個值,會發生什麼。我怎樣才能達到這個價值?以同樣的方式?

NameOfClass.nameOfVariable 

回答

12

如果方法是靜態的,是的。

但是你將無法訪問非靜態成員。

1

這將是靜態方法。

26

它被稱爲靜態變量和靜態methods。試試看看它是否編譯完成。

2

在大多數語言中,只有方法是靜態的時候纔可以這樣做。而靜態方法只能改變靜態變量。

0

由於qre是一個靜態方法,並且無法訪問封閉類的實例,因此您需要先創建一個實例並訪問它。例如:

public class Foo { 
    private int bar; 

    public static void qre() { 
     Foo foo = new Foo(); 
     foo.bar = 5; 
     System.out.println("next bar: " + (++5)); 
    } 
} 
2

我有幾個方法的類並沒有在這些方法中沒有構造函數。

如果您沒有明確定義構造函數,那麼您將得到由編譯器提供的默認構造函數。因此,如果這些方法都不是一成不變的,試試這個:

NameOfClass x = new NameOfClass(); 
x.doMethod(x1,x2,...,xn); 
5

正如許多人所指出的:這僅僅是可能的,如果該方法是靜態的。也許一些OOP背景是有序的:一種方法應該總是屬於一個類。那麼調用一個沒有類的實例的方法有什麼用?在一個完美的面向對象的世界裏,不應該有任何理由這樣做。很多與靜態方法有關的用例都是關於爲您的類指定某種類型的身份。雖然在編程世界中這是完全合理的,但在涉及面向對象的設計時,這並不令人信服。當我們在一個不完美的世界中編程時,通常會有一個用於「自由函數」的用例(例如Java或C++實現sort()的方式)。由於Java沒有直接支持免費函數類,只有靜態「方法」用於表達這些語義,並且提供了「名稱空間」的類包裝器的附加優勢。你認爲這個解決方法,如果你認爲它是語言設計的一個缺陷,那麼國際海事組織就是一個意見問題。

0

在適當的封裝中,你不應該「看到」實例中發生了什麼。依靠一個類的缺乏構造函數正在打破這種形式。這個類的設計我想要在以後的構造函數中添加正式的狀態初始化。您與該課程的「合同」僅限於您可以使用目前設計的方法。

如果您希望在沒有類別開銷的情況下使用該方法的功能,那麼最好將您的方法包含在現有的「客戶端」類中(當然這只是「複製和粘貼」編碼,並且被考慮。軟件設計的反模式

1

我有一個類有幾種方法 並有中 這些方法沒有構造

你的意思是你有這樣的:

public class X 
{ 
    public void foo() 
    { 
    } 
} 

或你的意思是你有這樣的:

public class X 
{ 
    private X() 
    { 
    } 

    public void foo() 
    { 
    } 
} 

如果是拳頭的方式的話,是的,有一個構造函數,它看起來就像這樣:

public X() 
{ 
    super(); 
} 

如果這是第二種方式然後可能有這樣的方法:

public static X createInstance() 
{ 
    return (new X()); 
} 

如果你真的意思是可以類有沒有創建實例就做事情的方法,那麼你可以,只是讓所有的方法和變量都是靜態的(通常這不是一個好主意,但對於某些事情來說它是完美的)。

2

類上的方法在上下文中運行一個實例;它有權訪問實例的成員變量。你明白這一點,因爲你問如果方法訪問其中一個變量會發生什麼。

你可以通過問自己以下問題來理解爲什麼它不起作用:「數據在哪裏?」如果您沒有實例,那麼實例變量在哪裏?數據在哪裏?答案是它沒有地方,因此不起作用。

與靜態函數和靜態成員變量的區別在於您可以回答關於數據位置的問題。無論是否存在特定實例,都可以使用靜態變量。特定於實例的特定於類的決定是您必須考慮您實際想要做什麼的決定。

3

1)YES,可以通過使用關鍵字「靜態」使用類而不創建該類的一個實例或對象的方法。

2)如果聲明方法「靜態」然後可以調用通過這種方法:

   *ClassName.MethodName()* 

3)例如

class Hello { 

    public static void print() 
    { 

    System.out.println("HelloStatic"); 
    } 

} 


class MainMethod { 
    public static void main(String args[]) 
    { 
     // calling static method 
     Hello.print(); 
    } 
} 

4)上述程序的輸出將是:HelloStatic

相關問題