【问题标题】:JAVA, is there a way to display the name of an object in an ArrayList in my outputJAVA,有没有办法在我的输出中显示 ArrayList 中的对象名称
【发布时间】:2020-12-09 11:30:18
【问题描述】:

我正在开发一个根据面积比较形状的应用程序。它起作用了,我只是想让输出更好。

我有一个 Shapes 超类和两个形状子类 Rectangle 和 Circle。他们都有 toString() 方法来输出他们的区域。

    @Override
    public String toString() {
        return " has an area of : " + getArea();
    }

我制作了两个圆,分别称为圆 1 和圆 2。与矩形类似。将它们存储在一个名为 shapeList 的 ArrayList 中 我正在使用以下代码遍历数组并输出 toString()。

for (Shapes s:shapesList) {
                System.out.println(s.toString());
            }

有没有办法让我的输出打印“矩形 1 有一个区域圆 1 有一个区域等等等等。 过去我在我的对象中设置了名称,所以我可以在我的循环中使用 s.getName() 。但我想知道是否有另一种方法可以在我的输出中获取对象名称

希望我已经解释清楚了,第一次发帖!

【问题讨论】:

  • 当您说“对象名称”时,您是指您在代码中定义的变量名称吗?如果是,那么您应该考虑这些不是唯一标识符,并且您的对象之一可以被多个变量名引用。例如:Object o1 = new Object(); Object o2 = o1 o1 和 o2 都指向同一个对象。因此,如果您想打印对象名称,它应该如何决定应该使用哪一个?
  • 简短的版本是:对象没有名称,除非您明确地给它们一个字段来存储该名称。将变量名视为编译器了解您所引用内容的工具,但它们在运行时基本上不再存在。
  • @JoachimSauer 谢谢,一旦我读到这篇文章,我就想起了一次旧讲座的记忆。我现在明白了
  • @OHGODSPIDERS |感谢您的帮助,我从旧讲座中就知道这一点。谢谢提醒!

标签: java object arraylist output


【解决方案1】:

好吧,你真的不能那样做。对象不包含变量名称,这意味着您不能只打印变量的名称,而是在打印:

Shapes rectangle = new Rectangle();
// the object Rectangle doesn't know the variable name - rectangle

另一方面,您可以创建一个名为 name 的变量并对其进行设置,这样您就知道自己在调用哪个变量了:

class Shapes {
    protected String name;
    
    public void setName(String name) {
        this.name = name
    }

    public String getName() {
        return this.name;
    }
}

然后在RectangleCircle类中,甚至在Shapes类中,可以创建toString方法:

    @Override
    public String toString() {
        return getName() + " has an area of : " + getArea();
    }

【讨论】:

    【解决方案2】:

    您可以将public/protected abstract String getShapeName() 方法添加到Shape 类,并在RectangleCircle 类中提供实现。然后你就可以在Shape.toString()使用这个方法了

    【讨论】:

      【解决方案3】:

      this.getClass().getSimpleName(); 结合 this.hashCode(); 可能是您正在寻找的 - 如果您不介意哈希码的长度

      getSimpleName();

      返回源代码中给出的基础类的简单名称。如果底层类是匿名的,则返回一个空字符串。

      hashCode();

      在合理可行的情况下,Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。 (这通常是通过将对象的内部地址转换为整数来实现的,但这种实现技术并不是我们所需要的

      您的 ```toString()`` 将如下所示

      @Override
      public String toString() {
          return this.getClass().getSimpleName() + " " + this.hashCode() + " has an area of : " + getArea();
      }
      

      【讨论】:

        猜你喜欢
        • 2023-01-17
        • 2020-05-06
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        • 2017-03-18
        相关资源
        最近更新 更多