你能在静态方法中调用非静态方法吗?

时间:2015-05-13 00:55:56

标签: java eclipse

书评:你不能在静态方法中调用非静态方法(除非你创建一个对象作为非静态方法的调用对象)。我没有得到括号中的部分,我尝试用静态方法创建对象,eclipse说"无法访问的代码"。有人可以解释原因,并举一个例子。谢谢 (语言是java)

public class RoundStuff {
    public static final double PI = 3.141459;
    public static double area(double radius){//Area of circle
        return(PI*radius*radius);
    }
    public static double volume(double radius){//Volume of sphere
        return((4.0/3.0)*PI*radius*radius*radius);
    }

    public void print(){
        System.out.print("I am not parasyte");
    }

}

import java.util.Scanner;


public class RoundStuffDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Enter radius");
        double radius = keyboard.nextDouble();
        RoundStuff round = new RoundStuff();
        System.out.println("A circle of radius " + radius + " inches");
        System.out.println("has an area of " + round.area(5.5) + " square inches.");
        System.out.println("A sphere of radius " + radius + " inches");
        System.out.println("has a volume of " + RoundStuff.volume(radius) + " cubic inches.");
    }

}

3 个答案:

答案 0 :(得分:2)

Java允许非静态方法调用其他非静态方法,而无需显式指定对象引用。可以理解,调用是在调用当前非静态方法的同一实例上执行的,即您可以通过引用this来访问的实例。

另一方面,静态方法必须提供对象。这是一个例子:

class Example {
    public void one() {
        System.out.println("one");
    }
    public void two() {
        one();   // <<== #1
        System.out.println("two");
    }
    public static void three() {
        Example e = new Example();
        e.one(); // <<== #2
    }
}

在上面标有#1的行上,您拨打one(),但未指定您呼叫的对象。但是,标记为#2的行必须指定调用该方法的对象。

答案 1 :(得分:0)

这是创建一个对象以作为非静态方法的调用对象的示例。

public static void call() {
    new Object().doSomething();
}

public class Object {
     public void doSomething() {
          // Your code to do something
     }

}

答案 2 :(得分:0)

假设你有一个有两种方法的类,一种是静态的,一种是非静态的,如下所示:

class Simple {
    public static void doStuff () {
        doMoreStuff();
    }

    public void doMoreStuff() {
        System.out.println("doing more stuff");
    }
}

由于doStuff无法调用非静态方法,因此无法编译。但是,您引用的文档表明您可以通过创建用作调用对象的对象来调用非静态方法。这意味着创建一个Simple实例,然后在该实例上调用doMoreStuff

class Simple {
    public static void doStuff () {
        Simple simple = new Simple();
        simple.doMoreStuff();
    }

    public void doMoreStuff() {
        System.out.println("doing more stuff");
    }
}

这是一个相当人为的例子,但我经常发现在使用main方法(必须声明为静态)时很方便,这样你就不会将其余的方法声明为静态。