初学者Java - 静态错误

时间:2011-01-23 14:44:10

标签: java

美好的一天!

我是Java的初学者。我无法编译以下代码:

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

出现以下错误:

  

Non-static method calcArea(int, int) cannot be referenced from static content

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

您的回复将受到高度赞赏。 谢谢

根据您的建议,我创建了一个新的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;
 }
}

6 个答案:

答案 0 :(得分:7)

您的main是静态的,因此您可以在没有类测试(new test())的情况下调用它。但是它调用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

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

答案 2 :(得分:4)

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这样的方法属于实例上下文而不是静态上下文所以它可以对对象的内部状态进行操作。这将使您的代码更加面向对象,而且程序更少。

答案 3 :(得分:1)

你知道静态方法是什么吗?

如果没有,请查阅,但简短的回答是静态方法不能(不能)访问“this”,因为它没有分配给该类的任何特定实例。因此,您无法在静态方法中调用实例方法(非静态方法),因为计算机将如何知道该方法应在哪个实例上运行?

答案 4 :(得分:1)

如果方法被定义为静态,则意味着您可以通过类名称调用该方法,例如:

int a = Test.calcArea(7, 12);

没有创建对象,

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

Test a = new Test();

这里“a”是Test和

类型的对象
a.calcArea(7,12);
如果方法定义为静态,则可以调用

答案 5 :(得分:0)

您的类calcArea应该声明为 static ,如果要使用该类,则必须首先创建该类的实例。如某人所建议,在类中应返回该类的参数。