非静态方法compute(int)不能从静态上下文引用

时间:2014-01-25 11:35:31

标签: java

下面给出的代码给出以下错误: - 无法从静态上下文引用非静态方法compute(int) 如果我不能在main()中创建一个方法,我该怎么办。

class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
    Scanner key = new Scanner(System.in);
    int t = key.nextInt();
    for(int i=0;i<t;i++){
        int a = key.nextInt();
        int b = key.nextInt();
        a=compute(a);
        b=compute(b);
        System.out.println(a+b);
    }   
}
int compute(int a){
    int basea=0, digit;
    int temp=a;
    while(temp>0){
        digit = temp%10;
        temp/=10;
        if(digit>(basea-1))basea=digit+1;
    }
    temp=a;
    a=0;
    int count=0;
    while(temp>0){
        digit = temp%10;
        temp/=10;
        a+=digit*Math.pow(basea,count);
        count++;
    }
    return a;
}

5 个答案:

答案 0 :(得分:0)

您有两种选择:

  1. 声明compute()静态:

    static int compute(int a){
    
  2. 创建IdeOne的实例并通过该引用调用compute()

    IdeOne ideOne = new IdeOne();
    a = ideOne.compute(a);
    
  3. 我认为阅读Java tutorials on classes and objects是个好主意。

答案 1 :(得分:0)

您尝试从静态方法(主要方法)调用非静态方法(即计算)。

使用int compute(int a){

更改static int compute(int a){

答案 2 :(得分:0)

在您的情况下,make方法compute是静态的。否则,创建一个Ideone对象并在其上调用您的方法。

答案 3 :(得分:0)

您无法从non-static方法访问static方法 您尝试访问的方法是实例级方法,如果没有类实例,则无法访问实例方法/变量 您无法访问不存在的内容。默认情况下,非静态方法尚不存在,直到您创建该类的对象存在哪个方法。静态方法总是存在。

您可以通过以下方式访问您的方法:
1.使compute()方法静态

 int compute(int a){  
  ///rest of your code  
 }  

2。创建类Ideone的实例并按类对象访问方法。

IdeOne obj = new IdeOne();  
obj.compute(a);
obj.compute(b);

答案 4 :(得分:0)

这里给出的答案主要是制作方法static,这对于这个大小的程序来说很好。但是,随着项目变得越来越大,并不是所有内容都将在您的主体中,因此您可以更大规模地获得此静态/非静态问题,因为其他类不会是静态的。

然后解决方案就是为Main制作一个课程,如下:

public class Main {

public static void main( String[] args ) {

Ideone ideone = new Ideone();

然后另一个文件包含您的class Ideone

public class Ideone {

 Scanner key;

 public Ideone() {

    key = new Scanner(System.in);
    int t = key.nextInt();
    for(int i=0;i<t;i++){
        int a = key.nextInt();
        int b = key.nextInt();
        a=compute(a);
        b=compute(b);
        System.out.println(a+b);

   } // end constructor

    int compute(int a){
       int basea=0, digit;
       int temp=a;
       while(temp>0){
         digit = temp%10;
         temp/=10;
         if(digit>(basea-1))basea=digit+1;
    }
    temp=a;
    a=0;
    int count=0;
    while(temp>0){
        digit = temp%10;
        temp/=10;
        a+=digit*Math.pow(basea,count);
        count++;
    }
    return a;
   } // end compute

} // end class

至于你的主文件。我的工作会奏效,但更好的做法是遵循这里给出的代码示例:

http://docs.oracle.com/javase/tutorial/uiswing/painting/step1.html

应用此实践将确保您在项目的任何位置都没有静态/非静态问题,因为唯一静态的是初始化您的实际代码,然后处理所有代码/进一步启动其他类(这都是非静态的)