2011-05-04 191 views
0

如果我們聲明一個方法是靜態的,那麼不需要實例化,我們可以在類體內的任何地方調用該方法。我們可以在Java中的函數中調用函數嗎?

如果我們沒有聲明一個方法是靜態的,那麼可以實例化一個對象並調用該方法。

現在,如果我們沒有聲明一個方法是靜態的,也沒有實例化,我們可以調用函數內的函數嗎?

編輯:

我現在明白,我的預感是正確的。除非存在靜態或對象實例化,否則我們不能在函數內調用另一個函數。

但是在Java小程序中,我記得看到一個函數被另一個函數調用。

import javax.swing.*; 
import java.awt.Container; 

public class MethodCall extends JApplet 
{ 
    public void init() 
    { 
     String output = ""; 
     JTextArea outputarea=new JTextArea(10,20); 
     Container c = getContentPane(); 
     c.add(outputarea); 

     int result; 
     for(int x=1;x<=10;x++) 
     { 
      result = square(x); 
      output += "Square of " + x + " is " + result + "\n"; 
     }//end of for loop 

     outputarea.setText(output); 
    }//end of init() 

    public int square(int y) 
    { 
     return y*y; 
    }//end of square() 

}//end of class MethodCall 

見平方()函數

+9

當你嘗試它時發生了什麼? – 2011-05-04 07:07:59

+0

你看到的可能是可用的超類的方法(如果你擴展框架的小程序,你也可以獲得大部分的方法) – MByD 2011-05-04 07:32:25

回答

2

沒有你不能。

如果某個方法不是靜態的,則必須從某個類的實例中調用該方法。即使在這裏給出,如

public class A{ 

    private void foo() 
    { 
     bar(); 
    } 
    private void bar() 
    { 

    } 
} 

你不叫吧,就像自己的例子,你怎麼稱呼它在A的當前實例,這就好比​​

編輯

在你的例子中,當你在init(否則你不能稱它)時,你已經有一個MethodCall的實例。所以致電square()實際上是this.square()getContentPane()這是JApplet的一種方法(它是MethodCall的超類)

+1

Downvoter - 我想聽聽這個答案不正確。 – MByD 2011-05-04 07:21:04

+0

+1用於抵消反對票。 – 2011-05-04 07:27:16

0

當然可以,只要它是在功能可見。舉例來說,調用函數和被調用函數在同一個類或子類中。如果其被調用的方法範圍的子類應該是默認的,保護的或公共的。

+0

這是不準確的。在這些情況下,你實際上稱它爲「this」。 – MByD 2011-05-04 07:15:50

+0

正確。但問的問題是沒有啓動一個對象。 – 2011-05-04 07:18:12

+0

如果你到達那裏 - 你已經有一個對象... – MByD 2011-05-04 07:19:52

11

你的問題是不是真的不清楚,但這裏有一個簡單的總結:

class A { 
    public static void foo() { 
     bar();  // illegal, no object 
     foo();  // legal, implicit 
     A.foo(); // legal, explicit 
     A a = new A(); 
     a.bar(); // legal - we call a non-static function on an object 
    } 

    public void bar() { 
     bar();  // legal, implicit 
     this.bar(); // legal, explicit 
     foo();  // legal, implicit 
     A.foo(); // legal, explicit 
    } 
} 

注意,在這種情況下,內本身的功能調用是無限遞歸。

+0

只需要注意:方法public void bar()中的調用bar()也是無限遞歸的。 – 2011-05-04 07:16:57

+0

@Danilo我在底部添加了註釋以避免評論中的信息太多,謝謝。 – 2011-05-04 07:20:14

0

如果我正確理解你的問題,你問你是否可以在一個標準的非靜態Java方法的函數內調用函數。

這是可能的,只要你想調用的函數在相同的類或類層次結構中,或者你調用的函數本身是靜態的。

0

這應該工作:

public class CallTest { 

    public static void someMethod(){ 
     System.out.println("blabla"); 
    } 

    public static void main(String[] args) { 
     CallTest.someMethod(); 
    } 

} 
相關問題