【问题标题】:Java Beginner Question : What is wrong with the code below?Java初学者问题:下面的代码有什么问题?
【发布时间】:2010-06-15 16:27:02
【问题描述】:
public class Function
{
   public static void main(String args[])
   {
      System.out.println(power(3,2));
      System.out.println(power(3,2));
      System.out.println(power(2));
   }
   public long power(int m)
   {
      return m*m;
   }
   public long power(int m,int n)
   {
      long product=1;
      for(int i=1;i<=n;i++)
      {
          product=product*m;
      }
      return product;
   }
}

编译器显示此错误:-

Function.java:5: 不能从静态上下文引用非静态方法 power(int,int)

[编辑]

对缩进的事情感到抱歉:/从现在开始我会记住这一点。

好的,我刚刚添加了 static 关键字,现在它工作正常。这个静态关键字有什么区别?我是 java 的初学者,还没有研究过 static 的作用。我肯定会在本书的其他章节中阅读它,但请有人告诉我它的作用。谢谢。

【问题讨论】:

  • 这就是问题所在。没有适当的缩进!
  • 另一点...这不是错误,但编码String[] argsString args[] 更容易接受(尽管它们实际上是相同的)...
  • @froadie:你会接受String... args吗?

标签: java non-static


【解决方案1】:

如错误消息所述,静态方法 (main) 无法在没有对象实例的情况下调用非静态方法 (power)。

您应该将power 方法设为静态。

说明

普通的类方法与类的一个实例相关联。
例如,String.startsWith method 只能在 String 实例上调用。在没有字符串实例的情况下调用startsWith 是没有意义的。

有时,您会想要创建一个不需要类实例的方法。
例如,Integer.parseInt method 不会在 Integer 实例上调用。仅仅为了能够调用Integer.parseInt 而必须创建一个Integer 实例是没有意义的。
这些方法称为static 方法。

mainstatic 方法的一个示例。由于它不是在 Function 类的实例上调用的,因此它不能调用实例方法。 (因为没有实例可以调用它们)

【讨论】:

    【解决方案2】:

    一个快捷的经验法则(没有完整的背景解释)是静态方法/函数不能调用非静态方法/函数,所以你想从你的主函数调用的任何东西都需要在它前面有 static 关键字.

    核心问题是 Java 是一种面向对象的语言,静态与非静态需要相当多的面向对象的先决知识。 Java 的一个缺点是它确实需要初学者在学习时跳过这种类型的一些障碍,这一切都源于 Java 的面向对象的性质,一旦你了解了 OO,它就会全部到位(语言设计者做出的决定不一定是最好的,但它们是合乎逻辑的)

    如果我不解释什么是静态,我希望你不会觉得它傲慢。我可以告诉你,这不是一个特别困难的概念,但它只是依赖于一些面向对象概念的构建块,过早尝试解释(无论如何都是我)可能会让你望而却步。

    【讨论】:

      【解决方案3】:
      public static void main(String args[])
      {
        // Create an object
        Function f = new Function( );
      
        System.out.println(f.power(3,2));
        System.out.println(f.power(3,2));
        System.out.println(f.power(2));
      }
      

      【讨论】:

      • 我相信通过解释静态与非静态调用以及它们不兼容的原因来更好地服务于 OP。
      • 哦,有一个名为 function 的类?这是新的和有趣的..让我查一下!
      • 是的。它在 OP 中。
      【解决方案4】:

      您正在从static 方法(主)调用实例方法。您需要将power 方法设为静态,或者在main 内部,创建Function 类的实例并调用Function.power()

      【讨论】:

        【解决方案5】:

        这正是它所说的。

        静态方法不需要类的实例。你可以简单地做MyClass.staticMethod()。非静态方法(或实例方法)对类的实例进行操作。所以:

        MyClass myClass = new MyClass();
        myClass.instanceMethod();
        

        您不能调用非静态方法,因为它实际上并不存在。非静态方法仅在其所属类的实例的上下文中调用时才存在。

        您的解决方案是将power 设为静态方法。

        【讨论】:

          【解决方案6】:

          对于初学者来说,这是一个常见的困惑来源。仅仅因为方法是公共的并且与main 方法在同一个类中并不意味着您可以随时调用它。由于main() 是一个静态方法,它没有对象可以调用这些方法。

          您可以通过两种不同的方式更正它:

          1. power 方法都设为static。对于非常小的程序,这是最简单的方法。

            static 的意思是您不必构造对象来调用方法。如果你从另一个类调用静态方法,它看起来像Math.function(x),但由于这些静态方法在同一个类中,它看起来像function(x)

          2. 创建Function 类的对象并在其上调用power 方法。这是你通常会为一个更大的程序做的事情,但在这里它真的没有意义。

            作为参考,如下所示:

            Function f = new Function();
            
            System.out.println(f.power(3,2));
            System.out.println(f.power(3,2));
            System.out.println(f.power(2));
            

          【讨论】:

            【解决方案7】:

            所以,为了清楚起见,解决这个问题的另一种方法是将方法标记为静态(请记住,您不能从静态方法调用非静态方法,如 main,但您可以从非静态方法):

            public class Function
            {
               public static void main(String args[])
               {
                  System.out.println(power(3,2));
                  System.out.println(power(3,2));
                  System.out.println(power(2));
               }
               public static long power(int m)
               {
                  return m*m;
               }
               public static long power(int m,int n)
               {
                  long product=1;
                  for(int i=1;i<=n;i++)
                  {
                      product=product*m;
                  }
                  return product;
               }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-06-14
              • 2018-06-27
              相关资源
              最近更新 更多