Java 中静态方法中非静态方法的调用

在尝试调用静态类中的非静态方法时,出现了一个错误。

无法从类型回放对非静态方法 methodName ()进行静态引用

我不能使方法静态,因为这也会给我一个错误。

这个静态方法不能对 xInterface 隐藏实例方法

有什么办法可以避免在另一个静态方法中调用非静态方法吗?(这两个方法在不同的包和不同的类中)。

498652 次浏览

从静态方法调用非静态方法的唯一方法是拥有包含非静态方法的类的实例。根据定义,非静态方法是一个被称为 ON 的类的实例,而静态方法属于类本身。

你可以创建一个你想要调用方法的类的实例,例如。

new Foo().nonStaticMethod();

有两种方式:

  1. 从静态方法内的实例调用非静态方法。看看法比安的回答,虽然我强烈反对。通过他的示例,他创建了类的一个实例,并且只将其用于一个方法,只是让它稍后处理它。我不推荐使用它,因为它将实例视为静态函数。
  2. 将静态方法更改为非静态方法。

你不能直接绕过这个限制。但是在你的特殊情况下,你可以做一些合理的事情。

例如,您可以在静态方法中“ new up”类的一个实例,然后调用非静态方法。

但是如果你发布你的课程或者精简版的课程,你可能会得到更好的建议。

您需要包含非静态方法的类的实例。

类似于在没有实例的情况下尝试调用类 String的非静态方法 startsWith:

 String.startsWith("Hello");

您需要的是拥有一个实例,然后调用非静态方法:

 String greeting = new String("Hello World");
greeting.startsWith("Hello"); // returns true

因此需要创建和实例来调用它。

听起来这个方法实际上是静态的(也就是说,它不访问任何数据成员,也不需要调用实例)。因为您使用了术语“静态类”,所以我理解整个类可能专门用于类似实用程序的方法,这些方法可能是静态的。

然而,Java 不允许接口定义方法的实现是静态的。因此,当您(很自然地)尝试使该方法成为静态方法时,会得到“ cannot-hide-the-instance-method”错误。(Java 语言规范在 第9.4节: ”请注意,在接口中声明的方法不能声明为静态方法,否则会发生编译时错误,因为静态方法不能是抽象的中提到了这一点)

因此,只要该方法存在于 xInterface中,并且您的类实现了 xInterface,就不能使该方法成为静态的。

如果你不能改变界面(或者不想改变) ,你可以做以下几件事:

  • 使类成为单例: 使构造函数成为私有的,并且在类中有一个静态数据成员来保存唯一现有的实例。通过这种方式,您将对一个实例调用该方法,但至少不会在每次需要调用该方法时创建新的实例。
  • 在类中实现2个方法: 一个实例方法(在 xInterface中定义)和一个静态方法。实例方法将由一行代理到静态方法的代码组成。

首先创建一个类 Instance 并使用该实例调用非静态方法。 例如:

class demo {


public static void main(String args[]) {
demo d = new demo();
d.add(10,20);     // to call the non-static method
}


public void add(int x ,int y) {
int a = x;
int b = y;
int c = a + b;
System.out.println("addition" + c);
}
}

构造函数是一种特殊的方法,它在理论上是任何静态方法调用的“唯一”非静态方法。否则就不允许。

在静态方法中使用非静态方法/字段或者在静态方法中使用非静态方法/字段的最简单方法是..。

(要实现这一点,必须至少有这个类的一个实例)

这种情况在 android 应用程序开发中很常见,例如:-一个活动至少有一个实例。

public class ParentClass{


private static ParentClass mParentInstance = null;


ParentClass(){
mParentInstance = ParentClass.this;
}




void instanceMethod1(){
}




static void staticMethod1(){
mParentInstance.instanceMethod1();
}




public static class InnerClass{
void  innerClassMethod1(){
mParentInstance.staticMethod1();
mParentInstance.instanceMethod1();
}
}
}

注意:-这不能作为构建器方法使用... ..。

String.valueOf(100);

您可以使用以下方法在静态方法中调用非静态方法: Classname.class.method()

从静态方法调用非静态方法的唯一方法是拥有包含非静态方法的类的实例。

class A
{
void method()
{
}
}
class Demo
{
static void method2()
{
A a=new A();


a.method();
}
/*
void method3()
{
A a=new A();
a.method();
}
*/


public static void main(String args[])
{
A a=new A();
/*an instance of the class is created to access non-static method from a static method */
a.method();


method2();


/*method3();it will show error non-static method can not be  accessed from a static method*/
}
}

我使用一个接口并创建一个匿名实例,如下所示:

Java

public interface AppEntryPoint
{
public void entryMethod();
}

缅因州,爪哇

public class Main
{
public static AppEntryPoint entryPoint;


public static void main(String[] args)
{
entryPoint = new AppEntryPoint()
{


//You now have an environment to run your app from


@Override
public void entryMethod()
{
//Do something...
System.out.println("Hello World!");
}
}


entryPoint.entryMethod();
}


public static AppEntryPoint getApplicationEntryPoint()
{
return entryPoint;
}
}

虽然没有创建该类的实例并调用其自己的方法那样优雅,但实际上完成了相同的工作。只是另一种方式。

public class StaticMethod{


public static void main(String []args)throws Exception{
methodOne();
}


public int methodOne(){
System.out.println("we are in first methodOne");
return 1;
}
}

由于静态方法必须具有该类引用,因此未执行上述代码。

public class StaticMethod{
public static void main(String []args)throws Exception{


StaticMethod sm=new StaticMethod();
sm.methodOne();
}


public int methodOne(){
System.out.println("we are in first methodOne");
return 1;
}
}

这件事一定会被处决。因为在这里,我们创建的引用,除了“ sm”之外,什么都没有,通过使用那个类的引用,它什么都没有 但是(StaticMethod=new Static method())我们正在调用方法1(sm.methodOne())。

我希望这能有所帮助。

不可能在静态方法中调用非静态方法。其背后的逻辑是,我们不创建一个对象来实例化静态方法,但是我们必须创建一个对象来实例化非静态方法。因此,非静态方法不能在静态方法中实例化对象,从而使其不能被实例化。