如果使用靜態方法,則可以使用myClass.myMethod()調用方法。如果它不是靜態的,你可以使用myObject.myMethod()或myMethod()來調用。有沒有其他的方式來稱呼它?並且在不同的情況下你可以使用一個對象來調用它並在沒有對象的情況下調用它。方法總是需要被對象或類調用嗎? (Java)
回答
JVM有4個字節代碼調用方法:
invokestatic
調用靜態方法(顯然)invokeinterface
用於調用接口的方法(我不知道爲什麼他們需要一個特殊的字節碼,但他們有一個)invokespecial
調用構造函數和超類方法invokevirtual
調用所有其他方法
現在在Java 7中,調用不屬於類的方法的invokedynamic:) –
沒有它們的方法屬於一個類是不可能的。您列出兩種:
- 靜態屬於類實例(只有一個)
- 和非靜態屬於單個對象(一個PR新)。
_「屬於類實例的靜態」_?也許你的意思是正確的,但我不會在那裏使用「實例」一詞。一個實例是你使用'new ...'之後得到的。 –
@Bart,一個類也是一個對象。 –
對不起,我錯過了你的觀點。也許你也錯過了我的?官方的[Java教程](http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html)表示'int id;'是一個**實例變量**,它們調用'static int numberOfBicycles = 0;'a **類變量**。這就是爲什麼當你解釋非靜態方法(或變量)時,我不會使用「實例」一詞。 –
你可以叫間接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());
是不是反射從對象或類調用方法的方法? – woliveirajr
你的確在通過一個對象調用它,但它總是一個「Method」類型的對象,而不是「MyClass」。 –
如果用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()
,其中呼叫確實來自真實透明。
沒有其他的情況,事實上它們都是相同的情況。你必須打電話給一個物體。如果方法是靜態的,對象可以是類。
這裏是所有(標準)的情況下,你怎麼可以調用一個方法:
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但是即使有反射,如果你想調用實例方法,你也必須提供適當類型的對象。
- 1. 在C++中模擬對象總是需要虛擬方法或模板嗎?
- 2. didRegisterForRemoteNotificationsWithDeviceToken總是被調用嗎?
- 3. C++中總是需要調用基類構造函數嗎?
- 4. 類圖總是需要屬性嗎?
- 5. 「類方法」對象不是可調用
- 6. JSF方法總是被調用兩次
- 7. 允許Java方法調用參數對象的子類的方法嗎?
- 8. JNI:從C++中調用一個需要對象的方法
- 9. 區分類或對象是否調用C++靜態方法
- 10. ICommand總是需要一個對象作爲參數嗎?
- 11. 方法需要對象並從擴展類中查找對象
- 12. 爲什麼Java的invokevirtual需要解析被調用方法的編譯時類?
- 13. 需要調用特定類的方法
- 14. 在Java中,不使用靜態或類變量的方法需要同步嗎?
- 15. 非靜態字段,方法或屬性'Microsoft.Xna.Framework.Input.MouseState.X.get'需要對象引用嗎?
- 16. 魔術方法__construct()和__destruct()的用法是什麼。他們總是需要嗎?
- 17. AS3:我需要使方法中的對象引用無效嗎?
- 18. 類或方法定義也是Ruby中的一個對象嗎?
- 19. 在類中調用本地方法時需要'this'嗎?
- 20. 需要調用不同類的方法嗎?
- 21. 總是調用當前類的方法
- 22. 對象是相互需要對方
- 23. Java,靜態方法可以實例化一個被調用的對象嗎?
- 24. 調用類型對象的方法類
- 25. 類,對象和方法。 Java
- 26. 非靜態字段,方法或屬性需要對象引用
- 27. 非靜態字段,方法或屬性需要對象引用
- 28. 對象引用需要非靜態字段,方法或屬性
- 29. 非靜態字段,方法或屬性需要對象引用
- 30. 對象引用需要非靜態字段,方法或屬性
請注意,當您在課程「內部」時,您還可以調用類似'myMethod()'的靜態方法。 –