如果我们声明一个方法是静态的,那么无需实例化,我们可以在类体内的任何地方调用该方法。
如果我们没有声明一个方法是静态的,那么可以实例化一个对象,然后调用该方法。
现在如果我们不声明一个方法是静态的并且也没有实例化,我们可以在一个函数中调用一个函数吗?
编辑:
我现在明白了,我的预感是正确的。除非有静态或对象实例化,否则我们不能在函数内调用另一个函数。
但是在Java applets中我记得看到一个函数是从另一个函数调用的。
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
参见square()函数
答案 0 :(得分: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
}
}
请注意,在这种情况下,对函数内部函数的调用是无限递归的。
答案 1 :(得分:3)
否你不能。
如果方法不是静态的,则必须从某个类的实例调用它。即使在这里给出的例子中,例如
public class A{
private void foo()
{
bar();
}
private void bar()
{
}
}
你不会像自己一样调用bar,你在A的当前实例上调用它,就像this.bar()
修改强>
在您的示例中,当您在MethodCall
时,您已经拥有init
的实例(否则您无法调用它)。所以square()
的来电实际上是this.square()
。与getContentPane()
相同,这是JApplet的一种方法(它是MethodCall
的超类
答案 2 :(得分:0)
是的,只要它对功能可见,你就可以。比如说调用函数和被调用函数在同一个类或子类中。如果它是一个子类,则被调用的方法范围应该是default,protected或public。
答案 3 :(得分:0)
如果我正确理解你的问题,你会问你是否可以用标准的非静态Java方法调用函数中的函数。
只要您要调用的函数位于同一个类或类层次结构中,或者您调用的函数本身是静态的,这是可能的。
答案 4 :(得分:0)
这应该有效:
public class CallTest {
public static void someMethod(){
System.out.println("blabla");
}
public static void main(String[] args) {
CallTest.someMethod();
}
}