Java初学者问题:下面的代码有什么问题?

时间:2010-06-15 16:27:02

标签: java non-static

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的初学者,还没有研究静态做什么。我肯定会在本书的后续章节中阅读它,但有人请告诉我它的作用。感谢。

7 个答案:

答案 0 :(得分:9)

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

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

解释

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

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

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

答案 1 :(得分:4)

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

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

如果我不解释静态是什么,我希望你不会发现它的光顾。我可以告诉你,这不是一个特别困难的概念,但它仅仅依赖于一些OO概念的构建块,而过早的解释尝试(无论如何)可能会让你失望。

答案 2 :(得分: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));
}

答案 3 :(得分:2)

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

答案 4 :(得分:2)

这正是它所说的。

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

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

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

您的解决方案是使power成为静态方法。

答案 5 :(得分: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));
    

答案 6 :(得分: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;
   }
}