3
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 的作用。我肯定会在本书的其他章节中阅读它,但请有人告诉我它的作用。谢谢。

4

7 回答 7

9

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

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

解释

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

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

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

于 2010-06-15T16:28:47.237 回答
4

一个快捷的经验法则(没有完整的背景解释)是静态方法/函数不能调用非静态方法/函数,因此您想从主函数调用的任何内容都需要在其前面有 static 关键字。

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

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

于 2010-06-15T18:13:58.277 回答
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));
}
于 2010-06-15T16:29:13.053 回答
2

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

于 2010-06-15T16:29:47.593 回答
2

这正是它所说的。

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

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

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

您的解决方案是制作power一个静态方法。

于 2010-06-15T16:31:43.547 回答
2

对于初学者来说,这是一个常见的困惑来源。仅仅因为一个方法是公共的并且与该方法在同一个类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));
    
于 2010-06-15T16:33:04.917 回答
1

因此,为了清楚起见,解决此问题的另一种方法是将方法标记为静态(请记住,您不能从静态方法调用非静态方法,例如 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;
   }
}
于 2010-06-15T21:19:27.383 回答