覆盖toString()/点运算符如何真正起作用

时间:2013-03-09 07:34:36

标签: java string tostring

我对Java很新,所以请告诉我我是不是正确使用了某些术语。我有一个名为Player的对象类,它有一个名为getInventory()的方法,它返回名为ArrayList<Item>的{​​{1}}对象。

我希望这种方法以保存项目的inventory形式返回玩家的广告资源,到目前为止,它的工作正常。

ArrayList类是我的类ItemArmor继承的抽象基类/父类。所以,我想要格式化(我使用纯粹的基于文本的方法来处理“GUI”,如果您甚至想要调用它),看起来像这样:

  • Banded Mail - Armor
  • 锁子甲 - 盔甲
  • 长剑 - 剑

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

Sword

我尝试使用以下代码来破译对象的类型(该类的名称,即):

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

我想根据制作对象的类来打印“Armor”或“Sword”或“Shield”。我认为附加 toString()可以解决这个问题,但它会给我这个输出:

  

类weaponequipdemo.Armor

所以我想知道两件事:

  • 我如何覆盖System.out.println(player.getInventory().get(count).getClass().toString()); 来显示名称 班级?实例中toString()的确切位置 toString()?以及

  • 最重要的是,如何使用点运算符将对象附加到其上的许多其他方法?我理解像player.getInventory().get(count).getClass().toString()这样的类有一个方法 名为Player,但是getName()呢?

    你在方法中放了一个方法吗?这甚至可能吗?从 我一直在看东西的方式,点运算符是一种方式 描绘在一个物体的壳内进一步(一种方法是 在一个类中),但如果这是真的,那么这意味着你可以拥有 方法内部的方法。我很困惑。

非常感谢你的帮助。

3 个答案:

答案 0 :(得分: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());

并且您无法自定义输出,因为类java.lang.Class的toSTring()方法不在您的控制之下。

请注意,toString()通常用于调试目的。并且仅返回对象的类是奇怪的,因为它使得无法区分同一类的两个不同实例。如果你想显示项目的类型,我会使用专用的getType()方法而不是toString()。如果您想显示护甲的描述,那么toString()或名为getDescription()的方法就可以了。

答案 1 :(得分:0)

1)您可以使用toString(),而不是getName(),而不是player.getInventory().get(count).getClass().getName()

2)在player.getInventory().get(count).getClass().getName()中,player.getInventory()返回具有get()方法的类的对象,并在该对象上调用get()方法。另一个对象由get()返回,其中getClass()被调用,依此类推。没有涉及方法的“嵌套”。

答案 2 :(得分:0)

  

我如何重写toString()只显示名称   班级?恰好在实例中的toString()   player.getInventory()获得(计数).getClass()。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”等。不要使用类名。为什么?你最终会想要以一种不一定有意义的方式继承子类。可能是MagicalSword。或者CursedSword,你可能想要只显示“剑”。