【问题标题】:Why can a variable of type Object hold a reference to an array in Java?为什么 Object 类型的变量可以保存对 Java 中数组的引用?
【发布时间】:2020-08-06 08:53:16
【问题描述】:

根据JLS, under section 1.1,它声明:

类类型 Object 的变量可以保存空引用或对任何对象的引用,无论是类实例还是数组。

这意味着

Object obj = new Object[10];

在 Java 中是合法的。我知道可以做到,我想了解是否有适当的用途。

注意:我不确定这是否是重复的问题,但我在 Stackoverflow 上没有找到正确的答案,也许我搜索的关键字错误,答案已经存在,请指导我。

【问题讨论】:

    标签: java arrays object jls


    【解决方案1】:

    这是可能的,因为 Object 是所有非原始数据类型的超类。由于数组是复杂的数据类型,它们的超类也是 Object。所以你也可以写这样的东西

    Object obj = new int[10];
    

    但仅仅因为它是可能的并不意味着你应该这样做。在您的示例中,您以两种方式破坏了类型安全。首先,您将一个数组分配给一个对象,其次,您正在创建一个对象数组。这意味着您必须在对数组执行操作(例如设置或读取元素)之前进行强制转换。 此外,如果您想在它们上调用任何方法,则必须将您的数组元素转换回其原始类型。由于强制转换可能导致 ClassCastExceptions,因此应尽可能避免。

    【讨论】:

      【解决方案2】:

      注意在java中几乎所有东西都可以是一个对象

      所以这个

      Object obj = new Object[10];
      

      一样有效
      Object obj2 = new String("Hi");
      

      甚至

      Object[] obj3 = new Object[10];
      

      obj 和 obj3 之间的主要区别在于,使用 obj3 你可以做类似的事情

      obj[1] = "as"
      

      但在 obj 中你不能

      public static void main (String[] args) throws java.lang.Exception
      {
          Object[] obj = new Object[10];
          obj[0] = new Integer(1);
          obj[1] = "hello";
          System.out.println(obj[1]);
          Object obj2 = new Object[10];
          obj2[0] = new Integer(1);
          ^--- ERROR!
      }
      

      我认为关键是要了解 ref 是如何工作的,看看这个:

      //CASTING
      Object someString = new String("abcdf");
      

      此时 someString 不是字符串而是对象,因此如果需要作为字符串处理并使用所有字符串方法,则需要将其转换为字符串

      System.out.println(((String)someString).toUpperCase());
      

      努力去做

      System.out.println(someString.toUpperCase());
      

      将导致 java 抱怨,因为“对象”类没有方法 toUpperCase

      【讨论】:

      • 为什么obj2[0] = new Integer(1);会报错?
      • 因为您需要强制转换才能将其作为数组处理
      【解决方案3】:

      我想了解这是否有适当的用途。

      有。有时有必要编写代码,您可以在其中使用变量来引用“任何对象”。例如:

      • 通用容器数据类型。希望能够将“任何对象”放入列表或树数据结构中,而无需为每种类型的引用制作特殊版本的数据结构。得益于此,如果您想将数组放入列表中,则不需要新的特殊 List 接口,只需使用 List<int[]> 即可。
      • 反射。最好能够在变量中保存“任何对象”,这样您就可以提出有关它的问题,例如“这个对象的类型是什么”或“这个对象有哪些成员”之类的问题。如果不能使用 Object 类型来引用数组,则需要编写新的、更专业的方法。
      • System.arrayCopy 方法。此方法将项目从一个数组复制到另一个数组。数组使用 Object 类型传入。多亏了这一点,只需要一个 arrayCopy 方法,而不是每种数组都需要一个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        • 2013-06-11
        • 2017-02-27
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        相关资源
        最近更新 更多