2011-07-17 26 views
0

如果使用靜態方法,則可以使用myClass.myMethod()調用方法。如果它不是靜態的,你可以使用myObject.myMethod()或myMethod()來調用。有沒有其他的方式來稱呼它?並且在不同的情況下你可以使用一個對象來調用它並在沒有對象的情況下調用它。方法總是需要被對象或類調用嗎? (Java)

+0

請注意,當您在課程「內部」時,您還可以調用類似'myMethod()'的靜態方法。 –

回答

4

JVM有4個字節代碼調用方法:

  1. invokestatic調用靜態方法(顯然)
  2. invokeinterface用於調用接口的方法(我不知道爲什麼他們需要一個特殊的字節碼,但他們有一個)
  3. invokespecial調用構造函數和超類方法
  4. invokevirtual調用所有其他方法
+0

現在在Java 7中,調用不屬於類的方法的invokedynamic:) –

1

沒有它們的方法屬於一個類是不可能的。您列出兩種:

  • 靜態屬於類實例(只有一個)
  • 和非靜態屬於單個對象(一個PR新)。
+0

_「屬於類實例的靜態」_?也許你的意思是正確的,但我不會在那裏使用「實例」一詞。一個實例是你使用'new ...'之後得到的。 –

+1

@Bart,一個類也是一個對象。 –

+0

對不起,我錯過了你的觀點。也許你也錯過了我的?官方的[Java教程](http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html)表示'int id;'是一個**實例變量**,它們調用'static int numberOfBicycles = 0;'a **類變量**。這就是爲什麼當你解釋非靜態方法(或變量)時,我不會使用「實例」一詞。 –

3

你可以叫間接using reflection的方法:

aClass = lineInput("Class: "); 
aMethod = lineInput("Method: "); 

// get the Class 
Class thisClass = Class.forName(aClass); 

// get an instance 
Object iClass = thisClass.newInstance(); 

// get the method 
Method thisMethod = thisClass.getDeclaredMethod(aMethod, params); 

// call the method 
System.out.println(thisMethod.invoke(iClass, paramsObj).toString()); 
+0

是不是反射從對象或類調用方法的方法? – woliveirajr

+1

你的確在通過一個對象調用它,但它總是一個「Method」類型的對象,而不是「MyClass」。 –

0

如果用java ... Foo啓動Java應用程序時,Foo.main方法開始從「外部」(至少你沒有顯式調用) 。然後有間接的方式,例如反射或在方法調用初始化被觸發:如果使用類Foo首次

class Foo { 
    static int answer = deepThought(); 
    static int deepThought() { return 42; } 
} 

answer將有數值42,即使沒有人明確提出deepThought()

有些方法稱爲「神奇」,例如, finalize(),readObject(),writeObject()Thread.UncaughtExceptionHandler.uncaughtException(),其中呼叫確實來自真實透明。

0

沒有其他的情況,事實上它們都是相同的情況。你必須打電話給一個物體。如果方法是靜態的,對象可以是類。

1

這裏是所有(標準)的情況下,你怎麼可以調用一個方法:

public class MyClass { 
    static public void myClassMethod(){}; 
    public void myInstanceMethod(){}; 

    void foo(){ 
     //inside the same class definition, you can call its methods by name alone 
     myClassMethod(); 
     myInstanceMethod(); 
    } 
    static void bar(){ 
     myClassMethod(); 
     //myInstatnceMethod(); //wrong - you can't call instance method without instance 
    } 
} 

在其他類,你必須更明確

class OtherClass { 
    public void baz(){ 
     MyClass.myClassMethod(); 
     (new MyClass()).myInstanceMethod(); 
    } 
} 

但是從Java5.0的有調用靜態方法的另一種方法(和參考靜態屬性) - 用靜態導入:

import static org.example.MyClass.myClassMethod; 
import static java.lang.Math.*;  

class OtherClass { 
    public void baz(){ 
     myClassMethod(); 
     System.out.println(floor(PI)); 
    } 
} 

當然你可以用ref但是即使有反射,如果你想調用實例方法,你也必須提供適當類型的對象。

相關問題