0

我对 Java 很陌生,所以如果我没有正确使用某些术语,请告诉我。我有一个名为的对象类Player,它有一个名为的方法,该方法getInventory()返回ArrayList<Item>名为的对象inventory

我希望该方法以ArrayList保存物品的形式返回玩家的库存,到目前为止,它工作正常。

该类Item是我的类ArmorSword继承的抽象基类/父类。所以,我希望格式(如果您甚至想这样称呼它,我正在使用纯文本的“GUI”方法)看起来像这样:

  • 带状锁甲 - 护甲
  • 锁子甲 - 盔甲
  • 长剑——剑

我使用以下代码来显示“Banded Mail”部分(在循环中通常使用计数):

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

我尝试使用以下代码来破译该对象是由什么类型的类组成的(即该类的名称):

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

我只想根据制造对象的类别打印“盔甲”或“剑”或“盾”。我认为附加toString()可以解决问题,但它给了我这个输出:

类武器装备demo.Armor

所以我想知道两件事:

  • 我将如何覆盖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()通常用于调试目的。并且只返回一个对象的类是很奇怪的,因为它无法区分同一类的两个不同实例。如果你想显示项目的类型,我会使用专用的 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 中返回一个 Item。

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()。

现在,回答您的问题:在 Item.java 中添加一个方法 getItemTypeName() ,该方法返回一个字符串。将其定义为为 Armor 类等返回“Armor”。不要使用类名。为什么?你最终会想要以一种不一定有意义的方式进行子类化。魔剑,也许吧。或 CursedSword,您可能仍希望将其显示为“Sword”。

于 2013-03-09T07:47:58.813 回答