无法从静态上下文引用非静态方法

时间:2013-01-29 13:34:45

标签: java non-static

  

可能重复:
  calling non-static method in static method in Java

当我尝试从我的main-function调用一个涉及已定义对象的方法时,我遇到了“非静态方法无法从静态上下文引用”-error。

我有三个类:Person-class,Book-class和包含main-method的第三个类。

现在,我被要求在main()中创建四个Person-instances,并定义一个方法“doesAnybodyWantIt(Book b)”,询问四个人是否需要这本书。它看起来像这样:doesAnybodyWantIt(Book b){ me.doIwantIt(b); lisa.doIwantIt(b).. with the four person-objects).

因为我害怕,javac不知道存在四个Person对象并引发错误。我知道我可以改为像AnybodyWantIt(Book b,Person a,...)那样编写方法,但这不是我的问题。

所以我的问题是:有没有办法在不将Persons作为参数传递给doesAnybodyWantIt方法的情况下支持这个问题?我试图在构造函数方法中包含Person me = new Person(..)而没有运气。

在这种类型的设置中,我想对我知道将要定义的对象做特定的事情,我该如何回避错误?

我不确定我是否应该包含原始源代码;所有的方法和参数都给出了挪威语的名字,所以我担心它不会非常易读。

非常感谢你们! 马吕斯

感谢您的回复!你当然是对的,我必须在这个混乱的问题中加入一些代码。

class Error{
private Person jeg;

public void doesAnybodyWantIt(Bok b){  //This method has to be declaired withink the classm, and can only take the Bok b as a parameter. 
Bok bok = jeg.vilJegHaBoka(b);
// loops over the four persons in question. 
}


public static void main(String[] args){
Person jeg = new Person("Jeg", "java");
Person lisa = new Person("Lisa", "crime");
Person ramiz = new Person("Ramiz", "food");
Person emil = new Person("Emil", "sports");
doesAnybodyWantIt(new Bok("java"));  
}


}



class Bok{
private String kat;

Bok(String k){ //the category of the book is assigned to kat as a string. 
kat = k;
}

public String kategori(){return kat;} //returns the category.


}



class Person{
private String navn;  //name
// private Person bestevenn; non-relevant
private String bokKat; // The category of books that is at interest to the person.

Person(String navnet, String kat){   //sets the name and category of books. 
navn = navnet;
bokKat = kat;
}



private boolean mittInteressefelt(Bok b){  //Tests if the book's category is the same as my interest. 
if (bokKat.equals(b.kategori())){        //Returns true if interested. else false.
return true;
}
else{ 
return false;
}
}


public Bok vilJegHaBoka(Bok b){              //A method to decide if the book will be kept or not. Returns null if i want the book, and the book otherwise. 
if (mittInteressefelt(b) == true){  return null; }
else { return b;}

}
}

一个人有一个名字和兴趣领域,一本书有一个类别。赋值说我应该创建一个方法vilNoenHaBoka(= doesAnybodyWantTheBook)循环遍历在main中创建的四个特定Person对象,并询问他们每个人是否想要这本书。它还指出该方法应该看起来像public void vilNoenHaBoka(Bok b)。现在,我觉得非常不好问这个明确的与任务相关的问题,如果这不合适,请告诉我。然而,我只是想知道一般来说这样一个问题的好方法 - 例如我应该将Person-objects传递给vilNoenHaBoka()吗?

再次感谢!

2 个答案:

答案 0 :(得分:2)

除了main()方法之外,我认为您不需要任何静态上下文。相反,你应该询问每个Person是否需要一本书,例如

List<Person> persons = ... // and populate your list
for (Person p : persons) {
   if (p.wantsBook(book)) {
      ...
   }
}

OO的关键是你告诉对象为你做事,而不是提取信息并自己动手。

答案 1 :(得分:0)

看起来你被要求做一些奇怪的事情。 如果我理解你很好,你被要求在类中有一个静态方法,并让这个方法迭代你的Person对象并用它们做'某事'。 Tou也被问到静态的做任何人只需要一本书作为参数。 如果这就是你被要求的东西(什么不是一件非常好的事情),我唯一能看到的选择是在类上存储一个静态List属性来存储你的人。静态列表应该可以从静态的didAnybodyWantIt方法的insiade中获取,因此你可以访问你的人而不用方法参数传递它们。