非静态方法不能从静态内容中引用。

4
我无法编译以下代码:
public class Test {
 public static void main (String [] args ){
  int a = calcArea(7, 12);
  System.out.println(a);
 }

 int calcArea(int height, int width) {
  return height * width;
 }
}

出现以下错误:

非静态方法calcArea(int,int)无法从静态内容引用

这是什么意思?我该如何解决这个问题..?

编辑:

根据您的建议,我创建了一个实例,即new test():

public class Test {
    int num;
    public static void main (String [] args ){
        Test a = new Test();
        a.num = a.calcArea(7, 12);
        System.out.println(a.num);
    }

    int calcArea(int height, int width) {
            return height * width;
    }

}

这样做正确吗?如果我这样做有什么不同...

public class Test {
 public static void main (String [] args ){
  int a = calcArea(7, 12);
  System.out.println(a);
 }

 static int calcArea(int height, int width) {
  return height * width;
 }
}

关于您的编辑: 在第一个方法中, calcArea 是一个实例方法, 它在对象上被调用, 并(通常)执行与该对象相关的操作. 而第二个方法将 calcArea 设置为一个静态 (类) 方法, 通常只是执行不需要任何对象实例的操作。在这里,calcArea 在其参数上工作并返回结果,这使它成为一个好的类方法。现在,在一个名为 Rectangle 的类中,有一个名为 calcArea() 的实例方法 (没有参数),您可以看到它可能会将自己的高度和宽度成员变量相乘以返回一个对象特定的结果。 - Sdaz MacSkibbons
6个回答

8

你的main方法是静态的,因此可以在不创建test类实例(new test())的情况下调用它。但是它调用了calcArea方法,calcArea不是静态方法:它需要类的实例。

我猜你可以这样重写:

public class Test {
 public static void main (String [] args ){
  int a = calcArea(7, 12);
  System.out.println(a);
 }

 static int calcArea(int height, int width) {
  return height * width;
 }
}

正如评论所建议的那样,以及其他答案也显示了,您可能不希望为所有事情选择这条路线:您将仅获得静态函数。弄清楚在您的代码中实际上应该是静态的内容,并可能创建一个对象并从那里调用函数:D


没错,但这样做会让初学者所有的方法都变成静态的,这是不好的。我建议尽快离开静态上下文,像这样:public static void main (String [] args) {new Test().go(args);} - maaartinus
没错,@maaartinus,但是如果没有程序的上下文,很难猜出什么在哪里以及为什么。但是@newbie确实可以检查一下。 - Nanne

6

Nanne提出的建议肯定可以解决你的问题。但是,我认为在学习Java的早期阶段,现在就养成尽可能少使用静态方法的习惯是明智的,除非适用(例如实用程序方法)。这里修改了你的代码,创建了Test的一个实例,并在Test对象上调用calcArea方法:

public class Test {
 public static void main (String [] args ){
  Test test = new Test();
  int a = test.calcArea(7, 12);
  System.out.println(a);
 }

 int calcArea(int height, int width) {
  return height * width;
 }
}

当你在使用Java编程时,随着代码的进一步深入,并且可能会涉及到某些类型的多边形对象等,像calcArea这样的方法应该属于实例上下文而不是静态上下文,以便它可以操作您的对象的内部状态。这将使您的代码更加面向对象而不是过程式。


4

calcArea不能是静态的。如果要在主类中使用其他方法,必须创建它的实例。

public class Test {
 public static void main (String [] args ){
  Test obj = new Test();
  int a = obj.calcArea(7, 12);
  System.out.println(a);
 }

 int calcArea(int height, int width) {
  return height * width;
 }
}

1
如果一个方法被定义为静态的,那么你可以通过类名来调用该方法,例如:
int a = Test.calcArea(7, 12);

不创建对象的情况下,

这里;Test是类的名称,但要执行此操作calcArea()方法必须是静态的,或者您可以通过实例化类来调用非静态方法以创建对象,例如:

Test a = new Test();

这里的“a”是Test类型的对象。

a.calcArea(7,12);

如果该方法未被定义为静态的,则可以调用。


1
你知道什么是静态方法吗?
如果不知道,可以查一下,简单来说,静态方法不能访问“this”,因为它没有分配给类的任何特定实例。因此,在静态方法中无法调用实例方法(非静态方法),因为计算机如何知道应该在哪个实例上运行该方法呢?

非常好的回答,不知道它是否真的值得被踩。 - Rekin

0

你的 calcArea 类应该声明为 静态,如果你想使用该类,你必须首先创建一个类实例。在类中应该返回类的参数,正如某人建议的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接