Java 静态方法不能直接调用非静态方法
根据中写入的限制,静态方法不能直接调用非静态方法。“直接”的确切含义是什么?为什么我不能这样做?是的,我可以用什么间接的方法来做呢?这意味着如果你有一个实例方法Java 静态方法不能直接调用非静态方法,java,static,Java,Static,根据中写入的限制,静态方法不能直接调用非静态方法。“直接”的确切含义是什么?为什么我不能这样做?是的,我可以用什么间接的方法来做呢?这意味着如果你有一个实例方法a,你不能从静态方法b调用它 void a() { // ... } static void b() { a(); } 无效 您不能这样做,因为静态方法没有在实例中运行,因此它不知道在哪个实例上调用该方法。这里的“直接”表示您没有在对象上调用该方法 比如说, public class Foo { public s
a
,你不能从静态方法b
调用它
void a() {
// ...
}
static void b() {
a();
}
无效
您不能这样做,因为静态方法没有在实例中运行,因此它不知道在哪个实例上调用该方法。这里的“直接”表示您没有在对象上调用该方法
比如说,
public class Foo {
public static void method1() {
Foo myFoo = new Foo();
myFoo.method2(); // This is OK - we're calling method2 on an object.
method2(); // This doesn't compile - we're trying to call method2 directly.
}
public void method2() {
System.out.println("This is method2");
}
}
因此,当有一个非静态方法正在被调用的对象时,静态方法调用非静态方法是可以的。但是不引用对象的直接调用是无法完成的
当然,您可以直接从一个静态方法调用另一个静态方法。您还可以直接从另一个非静态方法调用一个非静态方法
根据javatpoint中编写的限制,静态方法不能直接调用非静态方法
当然可以。他们只需要一个实例来调用它们。下面是一个静态方法直接调用非静态方法的示例:
class Example {
public static void main(String[] args) {
Example e = new Example();
e.hiThere(); // <========== Direct call to instance method
go(e);
}
private static void go(Example e) {
e.hiThere(); // <========== Direct call to instance method
}
private void hiThere() {
System.out.println("Hi there");
}
}
类示例{
公共静态void main(字符串[]args){
示例e=新示例();
e、 hoheree();//静态方法绑定到类。
非静态方法绑定到类(对象)的实例
这意味着您可以像这样(直接)调用静态方法:
SomeClass.someStaticMethod();
但要调用非静态方法,需要首先构造类的对象(这就是“间接”的意思):
因此,如果你在一个静态方法中,你就在任何对象实例之外。这意味着你不能调用一个非静态方法。Java无法神奇地知道你想在哪个对象上使用/执行该方法
public static void someStaticMethod()
{
//You aren't working with any object here
}
但是,如果您在非静态方法中,则您在对象实例中。这意味着您可以调用当前正在使用的对象的其他非静态方法。这些都是类中的非静态方法(以及超类,如果它们正确设置了访问修饰符)
我可以用哪些间接的方法来做这件事
从静态方法调用非静态方法的“间接”方法是首先用非静态方法构造类的对象(如第二个代码块所示).通过声明一个静态方法,表示对该方法的调用不会改变对象的状态。因此,您不需要声明该方法的类的实例,也不能调用可以改变实例状态的方法。“我可以用哪些间接方法来做?”取决于您想要实现什么。“静态方法不能直接调用非静态方法”是一个非常误导性的说法。如果教程真的这么说,那就太不幸了。
public static void someStaticMethod()
{
//You aren't working with any object here
}
public void someNonStaticMethod()
{
//This is valid now.
this.someOtherNonStaticMethod(); //"this." is optional
}
public void someOtherNonStaticMethod()
{
//Do some stuff
}