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

时间:2013-10-25 22:09:52

标签: java

当我尝试使用移动,即Slide.move(1,0)时,我得到错误:非静态方法move(int,int)无法从静态上下文引用

这是我目前的代码,我不知道什么是错的。

    public void move(int row, int col) {
        char [][] temp= new char [cells.length][]; 
        for (int i= 0; i< cells.length; i++) {
            int destRow = (i+row)%cells.length;
            temp[destRow] = new char [cells[i].length];
            for (int j= 0; j < cells[i].length; j++)
                temp[destRow][(j+col)%cells[i].length] = cells[i][j];
            }
              cells= temp;
        }

    }   

2 个答案:

答案 0 :(得分:3)

错误意味着它所说的内容。

您的move方法不是静态的。它需要调用一个对象的实例,例如:

Slide s = new Slide();
s.move(...);

你正在调用静态上下文,即没有this的地方,也许是另一种静态方法,或直接通过Slide.move(...)。你不需要这样做。

这些失败:

Slide.move(...); // error: move requires an instance

// and

class Slide {
    void move (...) { 
        ... 
    }
    static void method () {
        move(...); // error: method is static, there is no instance
    }
}

这些不会失败:

Slide s = new Slide(); 
s.move(...);

// or

class Slide {
    void move (...) { 
        ... 
    }
    void method () {
        move(...);
    }
}

// or

class Slide {
    static void move (...) { 
        ... 
    }
    static void method () {
        move(...);
    }
}

所以要么从非静态上下文中调用它,要么使它成为静态方法。

至于推荐某个地方阅读更多关于这些内容(你在评论中提到的内容),请尝试http://docs.oracle.com/javase/tutorial/上的官方Java教程(看看“学习Java语言”的路径(特别是: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html)。

至于你的输出问题,因为这是一个单独的问题,你想为它发布一个单独的问题。

答案 1 :(得分:1)

那是因为您将move方法定义为非静态方法,方法是public void将其设为静态,而是需要编写public static void

另请注意,变量名称区分大小写,如果您写Slide.move(),则明确调用Slide class,因为您的变量名为slide