2012-01-04 87 views
1

任何人都可以向我解释,为什么我不被允许执行以下操作?非静态方法来自非静态参考错误。简单的程序

public class first_class { 

    int grade1=7; 
    int grade2=4; 

    double average; 

    public double calcAverage() { 
     average=(grade1+grade2)/(2); 
     System.out.println(average); 
     return average; 
    } 

    public static void main(String []args) { 
     first_class.calcAverage(); 
    } 
} 

我得到的错误消息“非静态方法calcAverage()不能从静态上下文在first_class.main(first_class.java:17)引用”。

回答

2

试试这个:

new first_class().calcAverage(); 

什么这是首先创建first_class类的新实例,然后在该实例上调用calcAverage()方法。现在,您正在引用实例上的方法,而不是试图静态引用它。

该错误是指示您从静态方法(main()方法)尝试引用没有实例的方法。如果方法标记为静态,但是您的calcAverage()未标记为静态,则可以执行此操作,所以您需要改为创建一个实例。

+1

修正了它。对不起,打字速度很快。 – rfeak 2012-01-04 01:59:52

1

您尚未实例化first_class的实例。

这是在你的previous question讨论,我的回答有第一款仍持有:)(如由于我关于Java的命名约定评论。)

+0

我需要一个关于如何在main中做的例子,这引起了一些问题,但是谢谢,我现在明白它更好了 – John 2012-01-04 02:12:44

+0

@John它不是'main'/not -'main';你可以使用'main'的静态或实例方法。 – 2012-01-04 02:13:20

0
public static void main(String[] args) 
{ 
    first_class f=new first_class(); 
    f.calcAverage(); 
} 

该方法不是静态的。您必须按照上述first_class的对象访问它。此外,您不遵循Java命名约定。班级名称应该是FirstClass而不是first_class


如果您想通过名称访问方法,您的代码应如下所示。

package temp; 

final class first_class 
{ 
    static int grade1=7; 
    static int grade2=4; 

    static double average; 
    public static double calcAverage() 
    { 
     average=(grade1+grade2)/(2); 
     System.out.println(average); 
     return average; 
    } 
} 

final public class Main 
{ 
    public static void main(String[] args) 
    { 
     first_class.calcAverage(); 
    } 
} 

使该声明的字段类static内,因为在Java静态方法只能有静态成员(字段或方法)的访问,你就可以使用静态方法来访问它们如前面提到的片段。

+0

我试图执行它的标准方式,但谢谢你的其他解决方案 – John 2012-01-04 02:09:50

+1

@John没有“标准”;两者都是合法的。要使用哪个取决于您的需求。 – 2012-01-04 02:12:12

+0

迄今为止我们还没有看到'final'的用法,所以我认为它不太标准,但我猜不是。对困惑感到抱歉。 – John 2012-01-04 02:17:41