2013-08-07 58 views
10

我知道在OOP中,instance = object。因此,如果我們有課是這樣的:實例和對象之間的功能區別是什麼?

public class something 
{ 
    public static void main(String args[]) 
    { 
    } 
} 

請問此行的主要方法創建新的對象instance

something instance=new something(); 

我的第二個問題是相似的:如果我們創建Thread對象 - Thread t1=new Thread();它實際上意味着我們已經創建Thread類的一個實例,從中我們可以靜態調用的方法? (例如sleep())。

+5

+1以簡單清晰的方式提出簡單問題。你很驚訝這裏有多少人以複雜的方式提出簡單的問題。 – christopher

+0

我總是非常注意這一點(我家的一半人不是英國人,你有沒有試過告訴一大堆阿拉伯人他們錯了?這是可怕的東西)。然而,這裏有些人是**英語原住民,仍然試圖讓自己聽起來更聰明,或者使問題複雜化,像「XY問題」這樣的問題。我想,雖然我看到一個簡單問題的好例子,但不妨稱讚OP! – christopher

回答

12

如果我們創建了Thread對象 - Thread t1 = new Thread();這是否意味着我們已經創建了Thread類的實例,從中我們可以靜態調用方法? (例如sleep())。

當您調用靜態方法時,不會從對象調用它。這就是爲什麼它是靜態的。實例不需要執行靜態方法。

Thread t1 = new Thread(); 
t1.checkAccess(); // <--- This is an instance method. 

Thread.activeCount(); // <-- This is a static method. 

當看到new關鍵字,這意味着正在創建一個新對象。在這種情況下,正如你所說的那樣,它是Thread類的一個實例。

你如何區分他們?

嗯,很簡單。如果是實例方法,則將從對象的上下文中調用它。

String str = new String("hello"); 
str = str.replaceAll("o", ""); 

正如你所看到的,你必須創建一個實例使用一個實例方法

靜態方法,它更容易。他們將被稱爲除了班級的名字。

String.copyValueOf(new char[] {'a', 'b', 'c'}); 

有沒有必要創建一個新的String實例。只需使用班級的名字。

:正如在評論中指出,一個靜態方法可以從一個實例對象調用,但這不是普遍的做法。如果你不確定,文檔是你最好的朋友。或者您可以簡單地通過嘗試從靜態上下文中調用相同的方法來進行測試。

何時使用靜態方法而不是實例方法?

嗯,這是回答,非常好,在這裏:Java: when to use static methods,我看沒有任何意義的重複吧:)

+1

可能值得注意的是,雖然您不需要實例來執行靜態方法,但您可以執行此操作。這不是一個語法錯誤,寫t1.activeCount() – Mike

+1

不是,但我敢肯定,大多數IDE會抱怨你從一個實例對象調用靜態方法,所以大多數時候靜態方法會應該(或至少應該)從班級的背景中調用。 – christopher

+0

你是對的,IDE通常會發出警告。我只是認爲這會給你的答案帶來很好的補充,因爲它是新程序員的混亂語言特性。 – Mike

2

的對象是在這兩種情況下創造了你舉:

something instance=new something(); 
Thread t1=new Thread(); 

然而,第二種情況,雖然創建了一個Thread對象,但是一個線程在啓動之前不會啓動。

這實際上是否意味着我們已經創建了類Thread的實例,從中我們可以靜態調用方法? (例如sleep())。

你不需要一個對象來調用靜態方法。靜態方法適用於整個類,而不是特定的實例。你可以調用Thread.sleep()方法是這樣的:

Thread.sleep(500); 
1

你的第一個問題,是的,這將在變量instance創建something一個實例(不是一個偉大的變量名,順便說一句)。

對於第二個問題,是的,該代碼將創建一個Thread實例。但是,您不會使用靜態方法(如t1.sleep())。用類名調用靜態方法,例如Thread.sleep。您不必爲這些創建實例。

0

實例不過是一個動態內存分配。在java'new'操作符中的某處用於創建一個實例,但object是類的成員的動態內存分配,或者您可以說object是該類的實例。例如malloc(),calloc()是動態內存分配函數,所以我們可以說他們正在創建實例,但我們不能說他們正在創建對象。

相關問題