0

私は Java にかなり慣れていないので、用語を正しく使用していない場合は教えてください。という名前のオブジェクトを返すPlayerという名前のメソッドを持つという名前のオブジェクトクラスがあります。 getInventory()ArrayList<Item>inventory

私はそのメソッドArrayListがアイテムを保持する の形でプレーヤーのインベントリを返すようにしたかったのですが、これまでのところ問題なく動作しています。

Itemクラスは、クラスが継承する抽象基本/親クラスArmorですSword。だから、私はフォーマットを次のようにしたかった(私は「GUI」に純粋にテキストベースのアプローチを使用している.

  • バンド付きメイル - アーマー
  • 鎖帷子 - 防具
  • ロングソード - ソード

次のコードを使用して、"Banded Mail" 部分を表示します (count は通常どおり、ループで使用されます)。

System.out.print(player.getInventory().get(count).getName());

そして、次のコードを使用して、オブジェクトが作成されたクラスのタイプ (つまり、そのクラスの名前) を解読しようとしました。

System.out.println(player.getInventory().get(count).getClass().toString());

オブジェクトが作成されたクラスに基づいて、「鎧」または「剣」または「盾」を印刷したかっただけです。toString()を追加するとうまくいくと思いましたが、代わりに次の出力が得られます。

クラス Weaponequipdemo.Armor

だから私は2つのことを知りたいです:

  • toString()クラスの名前だけを表示するようにオーバーライドするにはどうすればよいですか? toString()のインスタンスの 正確な場所はどこplayer.getInventory().get(count).getClass().toString()ですか? と

  • 最も重要なことは、ドット演算子を使用してオブジェクトに追加できる他の多くのメソッドをオブジェクトが持つことができるのはなぜでしょうか? Playerクラスが という名前のメソッドを持ちたいのは理解できますgetName()が、 はどうplayer.getInventory().get(count)ですか?

    メソッドの中にメソッドを入れますか?それは可能ですか?私が物事を見てきた方法から、ドット演算子はオブジェクトのシェルの内側にさらに進むことを表す方法です(メソッドはクラスの内側にあります)が、それが本当なら、それはあなたが中にメソッドを持つことができることを意味しますメソッドの。よくわかりません。

ご協力をお願いいたします。

4

3 に答える 3

1

player.getInventory().get(count)型の式Itemです。だから電話したら

System.out.println(player.getInventory().get(count));

それは同等です

Item i = player.getInventory().get(count);
System.out.println(i);

これはと同等です

Item i = player.getInventory().get(count);
System.out.println(i.toString());

したがって、Item が Armor クラスの場合に Armor を出力したい場合は、次のようにクラスでオーバーライドtoString()する必要があります。Armor

@Override
public String toString() {
    return "Armor";
}

剣についても同じです:

@Override
public String toString() {
    return "Sword";
}

使用する場合

System.out.println(player.getInventory().get(count).getClass().toString());

それは同等です

Class<Item> clazz = player.getInventory().get(count).getClass();
System.out.println(clazz.toString());

クラスの toSTring() メソッドは制御下にないため、出力をカスタマイズすることはできませんjava.lang.Class

toString()通常、デバッグ目的で使用されることに注意してください。また、同じクラスの 2 つの異なるインスタンスを区別することが不可能になるため、オブジェクトのクラスのみを返すのは奇妙です。アイテムのタイプを表示したい場合は、代わりに専用の getType() メソッドを使用しtoString()ます。鎧の説明を表示したい場合は、toString()、または という名前のメソッドgetDescription()で問題ありません。

于 2013-03-09T07:50:26.397 に答える
0

1) を使用する代わりに、 を使用toString()できますgetName()player.getInventory().get(count).getClass().getName()

2) ではplayer.getInventory().get(count).getClass().getName()、メソッドplayer.getInventory()を持つクラスのオブジェクトが返され、そのオブジェクトでメソッドが呼び出されます。が呼び出されると、別のオブジェクトが返されます。関連するメソッドの「ネスト」はありません。get()get()get()getClass()

于 2013-03-09T07:43:05.207 に答える
0

クラスの名前だけを表示するために toString() をオーバーライドするにはどうすればよいですか? player.getInventory().get(count).getClass().toString() のインスタンスの toString() は正確にはどこにありますか? と

getInventory() は ArrayList を返します

get(count) は、ArrayList からアイテムを返します。

getClass は、アイテムのクラスを表す Class オブジェクトを返します。

より短い書き方です:

ArrayList<Item> inventory = player.getInventory();
Item item = inventory.get(count);
System.out.println(item.getName());

最も重要なことは、ドット演算子を使用してオブジェクトに追加できる他の多くのメソッドをオブジェクトが持つことができるのはなぜでしょうか? Player のようなクラスに getName() という名前のメソッドがあることは理解していますが、player.getInventory().get(count) はどうでしょうか。

そうではありません。各呼び出しは何らかのオブジェクトを返します - 後続の呼び出しはそのオブジェクトに対して行われます。上記を参照。

メソッドの中にメソッドを入れますか?それは可能ですか?から

いいえ。

私が見てきた方法では、ドット演算子はオブジェクトのシェルの内側にさらに進むことを表す方法です (メソッドはクラスの内側にあります)。メソッド。よくわかりません。

ドットは、「左側のものを取り、右側のものをそれに対して行う」と言っていると考えてください。次のような場合:

a().b().c()

a() の結果を取得し、そのオブジェクトで b() メソッドを見つけて呼び出します。続いて、その呼び出しからの戻り値を b() に取り、それに対して c() を呼び出します。

ここで、質問に答えるために、文字列を返すメソッド getItemTypeName() を Item.java に追加します。Armor クラスなどに対して「Armor」を返すように定義します。クラス名は使用しないでください。なんで?最終的には、必ずしも意味をなさない方法でサブクラス化したくなるでしょう。マジカルソードかな。または、CursedSword は、まだ "Sword" として表示したい場合があります。

于 2013-03-09T07:47:58.813 に答える