我对Java很新,所以请告诉我我是不是正确使用了某些术语。我有一个名为Player
的对象类,它有一个名为getInventory()
的方法,它返回名为ArrayList<Item>
的{{1}}对象。
我希望这种方法以保存项目的inventory
形式返回玩家的广告资源,到目前为止,它的工作正常。
ArrayList
类是我的类Item
和Armor
继承的抽象基类/父类。所以,我想要格式化(我使用纯粹的基于文本的方法来处理“GUI”,如果您甚至想要调用它),看起来像这样:
我使用以下代码显示“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()
呢?
你在方法中放了一个方法吗?这甚至可能吗?从 我一直在看东西的方式,点运算符是一种方式 描绘在一个物体的壳内进一步(一种方法是 在一个类中),但如果这是真的,那么这意味着你可以拥有 方法内部的方法。我很困惑。
非常感谢你的帮助。
答案 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,你可能想要只显示“剑”。