0

重複の可能性:
Java の静的メソッドで非静的メソッドを呼び出す

メイン関数から既に定義されているオブジェクトを含むメソッドを呼び出そうとすると、「非静的メソッドは静的コンテキストから参照できません」というエラーが発生します。

Person クラス、Book クラス、および main メソッドを含む 3 番目のクラスの 3 つのクラスがあります。

ここで、main() 内に 4 つの Person インスタンスを作成し、4 人の Person に本が欲しいかどうかを尋ねるメソッド「doesAnybodyWantIt(Book b)」を定義するように求められました。次のようになります。doesAnybodyWantIt(Book b){ me.doIwantIt(b); lisa.doIwantIt(b).. with the four person-objects).

私が恐れていたように、javac は 4 つの Person オブジェクトが存在することを認識せず、エラーを発生させます。代わりに、メソッドを doesAnybodyWantIt(Book b, Person a, ... ) のように記述できることはわかっていますが、これは求められていることではありません。

だから私の質問は: Persons をパラメーターとしてdoesAnybodyWantIt-method に渡すことなく、この問題を回避する方法はありますか? 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;}

}
}

人には名前と興味のある分野があり、本にはカテゴリがあります。この課題では、main で作成された 4 つの特定の Person オブジェクトをループするメソッド vilNoenHaBoka (= doesAnybodyWantTheBook) を作成し、それぞれに本が必要かどうかを尋ねる必要があると述べています。また、メソッドは public void vilNoenHaBoka(Bok b) のように見える必要があるとも述べています。さて、この明らかに課題に関連した質問をするのは本当に申し訳ありません。これが不適切である場合はお知らせください。ただし、一般的にこのような問題に対処するための良い方法は何かを知りたいだけです-たとえば、Person-objects を vilNoenHaBoka() に渡す必要がありますか?

再度、感謝します!

4

2 に答える 2

2

ここでは、メソッド以外に静的コンテキストは必要ないと思いますmain()。代わりにPerson、本が欲しいかどうかをそれぞれに尋ねる必要があります。

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

OO の鍵は、情報を抽出して自分で行うのではなく、オブジェクトに何かを行うように指示することです。

于 2013-01-29T13:36:59.633 に答える
0

変なことを頼まれたようです。私があなたをよく理解していれば、クラスに静的メソッドを持ち、このメソッドを繰り返して Person オブジェクトを使用し、それらで「何か」を行うように求められました。Tou は、static doesAnybodyWantIt がパラメーターとして本のみを受け取ることも求められました。これがあなたが求められたものである場合(これはあまり良いことではありません)、私が見ることができる唯一のオプションは、Personsを格納するクラスに静的List属性を持つことです。その静的リストは、静的 doesAnybodyWantIt メソッドの内部から利用できる必要があるため、メソッドパラメーターでそれらを渡すことなく、ユーザーにアクセスできます。

于 2013-01-29T13:46:59.397 に答える