2015-05-13 126 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來訪問的實例。

另一方面,靜態方法必須提供對象。這裏有一個例子:標#1上面打電話one()沒有指定什麼對象,你在呼喚它

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 
    } 
} 

就行了。但是,標記爲#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不能調用非靜態方法。但是,您所引用的文檔表明,您可以通過創建一個用作調用對象的對象來調用非靜態方法。這意味着創建的簡單實例,然後在該實例調用doMoreStuff

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

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

這是一個虛構的例子,但我與main方法(必須聲明爲static)工作時,經常會發現它方便等等你並沒有將其餘的方法聲明爲靜態的。

相關問題