2012-06-16 77 views
-2

我知道this代表調用該方法的對象和static方法不綁定到任何對象,但我的問題仍然是你可以調用類對象的靜態方法。爲什麼在靜態方法中不允許使用「this」?

爲什麼java已經提供這個東西,而不是爲this

+1

順便說一句。 'this'不是調用方法的對象,方法所屬的對象。 – Ixx

+2

(在靜態*方法中,「this」意味着什麼?類不是「頭等對象」,通過Class來折扣曝光......我真的希望它們是,但這是Java而不是Ruby或Python。 ) – 2012-06-16 23:14:50

回答

9

this指向類的當前實例。

靜態方法與類關聯,而不是實例,因此this沒有指向任何內容。

下面是一個例子:

public class Foo { 
    private String name; 

    public static void someClassMethod() { System.out.println("associated with a class"); } 

    public Foo(String n) { this.name = n; } 

    public String getName() { return this.name; } 
    public void setName(String n) { this.name = n; } 
    public void doAnotherThing() { 
     Foo.someClassMethod(); // This is what is really happening when you call a static method in an non-static method. 
    } 
} 
+1

那麼爲什麼java允許你在類對象上調用靜態方法? – amicngh

+0

爲什麼?因爲它是爲類對象定義的。 – duffymo

+1

看起來很簡單的答案就是這樣定義Java: – amicngh

1

從各個角度來看this總是意味着這個對象,所以給人的意思該類可能導致多個錯誤

+0

仍然可以在類對象上調用靜態方法/爲什麼? – amicngh

+0

@amicngh:因爲這就是Java的定義。 –

+0

因爲它被允許,但正如@Amadan所說 - 不應該讓事情變得更清楚。 – dantuch

4

答案很簡單可能性:this沒有在非靜態方法之外定義。

在一個實例上調用靜態方法是一個語法速記,我不同意應該存在。

+0

+1 - 我同意。我喜歡將靜態方法明確地與他們的類聯繫起來,以使其清晰。沒有這種猜測。 – duffymo

1

這裏的區別在於類別對象。在對象上調用非靜態方法,而在類上調用靜態方法。

您可以看到一個Class作爲一個藍圖,使用該藍圖構建對象。 類House有一個靜態方法hasDoor()(將返回true),而類型House的對象可以有一個方法openDoor()。你不能打開藍圖的大門。

可以撥打House.hasDoor(),但不能撥打House.openDoor()。一個可以調用

House h = new House(); 
h.openDoor(); 

雖然你可以調用h.hasDoor(),這是一個有點討厭的,應在大多數情況下,要避免

相關問題