2015-05-13 2 views
2

Ответ на вопрос: вы не можете вызывать нестатический метод в статическом методе (если вы не создадите объект, который будет служить вызывающим объектом нестатического метода). Я не получил часть в скобке, я попытался создать объект в статическом методе, а 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."); 
    } 

} 
+0

Опубликовать код, который задает проблему, и кто-то может попытаться объяснить –

+0

'round.area (5.5)' является статическим вызовом экземпляра. Какое точное сообщение затмение дает вам, и какую часть вы не понимаете? –

ответ

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, однако, должна указывать объект, на который вызывается метод.

0

Это пример создания объекта, который будет служить вызывающим объектом нестатического метода.

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

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

} 
+0

Я бы обычно делал то, что показывают другие ответы, если мне нужно использовать объект для других вещей в методе, но это то, что подразумевается в книге, и что я буду использовать, если все, что мне нужно от объекта, вызывало метод. –

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 метода (который должен быть объявлен статическим), так что вы не объявляете остальные статические методы.

Смежные вопросы