2012-12-23 72 views
1

任何人都可以請解釋爲什麼靜態方法調用非靜態方法是非法的嗎?從靜態方法調用非靜態方法

+0

這不是非法的。從非靜態方法中,可以隱式地調用另一個實例爲「this」的實例。對於靜態方法,你必須顯式提供一個實例,因爲它沒有'this'實例。 –

回答

13

一種非靜態方法是一種對特定的實例(對象)起作用並可訪問該對象的成員的方法實例。靜態方法不與特定實例關聯。

是合法的調用非靜態方法,如果你提供了一個實例:

class Foo 
{ 
    public static void f() 
    { 
     instanceMethod(); // Not OK - no instance provided. 
     this.instanceMethod(); // Not OK - no "this" in static methods. 
     new Foo().instanceMethod(); // OK because you provide an instance 
    } 

    public void instanceMethod() {} 
} 
4

因爲打電話給你不需要類,在這裏給你打電話需要非靜態方法的對象靜態方法,

的靜態方法與非哪裏靜態方法與狀態(對象)相關類相關

1

非靜態的方法是,在一個實例的上下文中執行的方法。沒有實例,調用它是沒有意義的,所以編譯器會阻止你這樣做 - 也就是說它是非法的。

如果一個方法不訪問任何實例字段(又名實例變量),那麼它可能應該改爲靜態方法。

0

非靜態方法有隱含參數this其靜態方法都沒有(因爲沒有this) 孤獨,因爲這實際上是不可能的調用非靜態方法形成靜態的。

0

靜態方法屬於該類。非靜態方法屬於一個實例。

非靜態方法需要在其上執行的實例(this)。靜態方法不需要任何實例,因爲類本身就是它所屬的實例。

如果我有100個對象實例,則每個nonStatic()方法調用都會影響不同對象的狀態。因此,每個非靜態方法都是「不同的」,因爲它對不同的實體起作用。 同時,即使我有一個對象的實例,調用staticMethod()也不會影響任何這些實例,因爲它只能影響類的靜態成員。

每個靜態方法或靜態成員變量有1個類和1個實例。

對於非靜態成員,我們有與該類實例關聯的每一種方法。

所以,如果你能夠調用非靜態方法,從靜態方法,100個實例中的哪一個會受到影響?你看:它沒有意義。

0

靜態方法與類連接。 常規方法連接到對象。

在靜態方法中,沒有可以運行非靜態方法的對象。

0

從靜態方法調用非靜態方法並非非法。無論何時調用靜態方法,都不需要類的實例,而在非靜態的情況下,則可以。