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

时间:2010-01-11 15:38:17

标签: java static non-static

当我尝试在静态类中调用非静态方法时,我收到错误。

  

无法从类型回放

中对非静态方法methodName()进行静态引用

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

  

此静态方法无法隐藏xInterface

中的实例方法

有没有办法在另一个静态方法中调用非静态方法? (这两种方法分开包装和单独的类别。)

14 个答案:

答案 0 :(得分:126)

从静态方法调用非静态方法的唯一方法是让类的实例包含非静态方法。根据定义,非静态方法是在某个类的实例上调用的方法,而静态方法属于类本身。

答案 1 :(得分:85)

您可以创建要在其上调用方法的类的实例,例如

new Foo().nonStaticMethod();

答案 2 :(得分:40)

首先创建一个类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);
    }
}

答案 3 :(得分:9)

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())我们正在调用方法一(sm.methodOne())。

我希望这会有所帮助。

答案 4 :(得分:6)

听起来真正 的方法应该是静态的(即它不访问任何数据成员,并且不需要调用实例)。由于您使用了术语“静态类”,我理解整个类可能都是专用于类似实用程序的方法,可能是静态的。

但是,Java不允许实现接口定义的方法是静态的。因此,当您(自然地)尝试使方法成为静态时,您将获得“无法隐藏实例方法”错误。 (Java语言规范在section 9.4中提到了这一点:“请注意,接口中声明的方法不能声明为静态,否则会发生编译时错误,因为静态方法不能是抽象的。”

只要该方法出现在xInterface中,并且您的类实现了xInterface,您将无法使该方法成为静态。

如果您无法更改界面(或不想更改),您可以执行以下操作:

  • 使类成为单例:使构造函数成为私有,并在类中拥有一个静态数据成员来保存唯一的现有实例。这样您就可以在实例上调用该方法,但每次需要调用该方法时,至少不会创建新实例。
  • 在您的类中实现2个方法:实例方法(在xInterface中定义)和静态方法。实例方法将由一行委托给静态方法。

答案 5 :(得分:5)

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

就像当你尝试在没有实例的情况下调用类startsWith的非静态方法String时:

 String.startsWith("Hello");

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

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

所以你需要创建和实例来调用它。

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

有两种方法:

  1. 从静态方法中的实例调用非静态方法。请参阅fabien的oneliner样本的答案......虽然我强烈建议不要这样做。在他的例子中,他创建了一个类的实例,并且只将它用于一个方法,只是让它稍后处理它。我不推荐它,因为它将实例视为静态函数。
  2. 将静态方法更改为非静态方法。

答案 8 :(得分:1)

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

例如,您可以在静态方法中“新建”类的实例,然后调用非静态方法。

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

答案 9 :(得分:1)

在静态方法中使用非静态方法/字段的最简单方法是反...:

(为此,必须至少有一个此类的实例)

此类情况在Android应用开发中非常常见,例如: - 一个Activity至少有一个实例。

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);

答案 10 :(得分:1)

我使用一个接口并像这样创建一个匿名实例:

AppEntryPoint.java

public interface AppEntryPoint
{
    public void entryMethod();
}

Main.java

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

不像创建该类的实例并调用自己的方法那样优雅,但实质上完成了同样的事情。只是另一种方式。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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