2011-01-23 50 views
4

美好的一天!初学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

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

您的答复将不胜感激。 谢谢您的建议基于

,我做了一个实例,它是新的测试()如下:

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

关于你的编辑:第一,`calcArea`是一个实例方法,它在一个对象上被调用,并且(通常)执行与该对象相关的操作。第二个使`calcArea`成为静态(类)方法,它(通常)通常仅执行没有任何对象实例的动作。在这里,`calcArea`在它的参数上工作,返回一个结果,这对于类方法来说很好。现在在一个名为`calcArea()`(无参数)的实例方法名为Rectangle的类中,您可以看到它是如何乘以自己的高度和宽度成员变量以返回特定于对象的结果。 – 2011-01-23 15:49:02

回答

4

Nanne建议的绝对是解决您的问题。不过,我认为如果你现在习惯了这种习惯,在你学习java的过程中尽早尝试尽可能少地使用静态方法会比较谨慎(除非适用)(例如,实用方法) 。这里是你的代码修改,以创建测试的一个实例,并调用油杉方法测试对象上:

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

7

你的主要是静态的,所以你可以把它叫做无类测试(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; 
} 
} 

正如评论指出,和其他的答案也显示,你可能不想要通过这条路线来实现evertyhing:你将只获得静态函数。找出你的代码中的静态应该是什么,也许让自己成为一个对象并从那里调用函数:D

+0

这是真的,但这种方式初学者结束所有方法是静态的。那很糟。我建议尽快离开静态环境,像`public static void main(String [] args){new Test()。go(args);}` – maaartinus 2011-01-23 15:07:16

+0

true,@maaartinus,但没有上下文程序很难猜测什么是地点和原因。但@newbie确实可以检查出来。 – Nanne 2011-01-23 15:09:19

1

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

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

+0

相当不错的答案,不知道它是否真的值得downvoting。 – Rekin 2011-01-23 14:58:36

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

,而无需创建一个对象,

这里; 测试是类的名称,但要这样做calcArea()方法必须是静态的,或者您可以通过对象调用非静态方法;您可以通过一个类实例化,例如创建一个对象:

Test a = new Test(); 

这里“a”是类型测试的对象,

a.calcArea(7,12); 

可以称为如果方法定义为静态