方法总是必须由对象或类调用吗? (JAVA)

时间:2011-07-17 20:16:50

标签: java methods

如果是静态方法,可以使用myClass.myMethod()调用方法。如果它不是静态的,你可以使用myObject.myMethod()或myMethod()调用。有没有其他方式来称呼它?并且在不同情况下你可以使用一个对象来调用它并在没有对象的情况下调用它。

6 个答案:

答案 0 :(得分:4)

JVM有4个字节码用于调用方法:

  1. invokestatic用于调用静态方法(显然)
  2. invokeinterface用于调用接口上的方法(我不知道为什么他们需要一个特殊的字节码,但是他们有一个)
  3. invokespecial用于调用构造函数和超类方法
  4. 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; }
}

如果您是第一次使用课程Fooanswer的值为42,即使没有人明确调用deepThought()

有些方法被称为“神奇地”,例如finalize()readObject()writeObject()Thread.UncaughtExceptionHandler.uncaughtException(),其中呼叫真正来自的地方并不透明。

答案 5 :(得分:0)

没有其他情况,实际上它们都是相同的情况。你必须用一个对象调用。如果方法是静态的,则对象可以是类。