如果是静态方法,可以使用myClass.myMethod()调用方法。如果它不是静态的,你可以使用myObject.myMethod()或myMethod()调用。有没有其他方式来称呼它?并且在不同情况下你可以使用一个对象来调用它并在没有对象的情况下调用它。
答案 0 :(得分:4)
JVM有4个字节码用于调用方法:
invokestatic
用于调用静态方法(显然)invokeinterface
用于调用接口上的方法(我不知道为什么他们需要一个特殊的字节码,但是他们有一个)invokespecial
用于调用构造函数和超类方法invokevirtual
用于调用所有其他方法答案 1 :(得分: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());
答案 2 :(得分:1)
没有它们的方法属于一个类是不可能的。您列出了两种:
答案 3 :(得分: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));
}
}
当然你可以使用反射,但如果要调用实例方法,即使使用反射,也必须提供适当类型的对象。
答案 4 :(得分:0)
如果使用java ... Foo
启动Java应用程序,Foo.main
方法将从“外部”启动(至少您没有明确地调用它)。然后是间接的方式,例如反射或初始化触发方法调用时:
class Foo {
static int answer = deepThought();
static int deepThought() { return 42; }
}
如果您是第一次使用课程Foo
,answer
的值为42,即使没有人明确调用deepThought()
。
有些方法被称为“神奇地”,例如finalize()
,readObject()
,writeObject()
或Thread.UncaughtExceptionHandler.uncaughtException()
,其中呼叫真正来自的地方并不透明。
答案 5 :(得分:0)
没有其他情况,实际上它们都是相同的情况。你必须用一个对象调用。如果方法是静态的,则对象可以是类。