【问题标题】:Are arrays really Objects?数组真的是对象吗?
【发布时间】:2015-07-10 09:12:27
【问题描述】:

请看下面的代码 -

class test {
  public static void main(String args[]){
      int[] somearray = {1, 2};
      printarray(somearray);
  }

  static void printarray(Object[] array){
      System.out.println(array[0]);
  }
}

上面的代码将无法编译,因为printarray 方法不能接受原始数组。 或者这是一个自动装箱限制?如果是这样,那么我认为这是一个很大的限制。

【问题讨论】:

  • 一个数组一个对象,但是一个基元数组与Objects的数组不兼容,因为基元不是对象,自动装箱可以't 处理那个转换。
  • "上面的代码不能编译,因为 printarray 方法不能接受原始数组。" - 不,代码不会编译,因为您没有为args 指定类型。将其更改为 String[] args 并编译正常。请将其编辑为您希望我们考虑的实际代码,它会产生您感兴趣的错误消息。
  • @JonSkeet 即使修正了主要方法签名,它也没有在 1.6.0_45 上为我编译,这是现在在 1.7/1.8 中工作的东西吗?
  • 数组本身对象。您似乎在混淆数组 和数组 包含 的内容。
  • 是的,这就是为什么在提问时花点时间很重要,并确保您确实发布了您想要发布的代码。将来,将您看到的错误也包含在内会很有帮助,并且最好也遵循正常的 Java 命名约定。

标签: java arrays oop object


【解决方案1】:

关于您的问题标题“数组真的是对象吗?”:是的,它们是。

关于您描述的问题:原始类型数组不是对象数组(因为int 不是java.lang.Object)。

为了让你的代码工作,你可以这样声明你的数组:

Integer[] somearray = {1, 2};

而不是使用原始类型int

请注意,这里有些拳击生效。

【讨论】:

  • 这根本不能回答问题。 Are Arrays really Objects?
  • 你是对的@ChetanKinger,但也许这并不是问题的关键。无论如何,它去了。
  • 这有点危险,因为它仍然是整数数组而不是对象数组。尝试将除 Integer 之外的任何内容放入数组中将引发 ArrayStoreException。
【解决方案2】:

数组是Object。实际上在 Java 世界中,每个非原始类型都是 Object. 因为您创建的每个类都直接或间接地是 Object (java.lang.Object) 的子类。

看下面的代码sn -p -

int[] intArray = new int[10];
Object anObject = intArray; //valid assignment
Object[] objArray = intArray; //invalid assignment.

这里的intArray 本身就是一个Object。所以它可以分配一个Object。但是intArray 不是Object 的数组,即-Object[]。 所以我们不能将intArray分配给Object[]

【讨论】:

    【解决方案3】:

    这样想:

    int 不是Object,而是primitive data type

    因此int[]Object[] 不同

    如果您想让printarray 方法保持不变,那么 您应该将 somearray 更改为 Integer(表示整数的对象)

    例如

    Integer[] somearray = {1, 2};
    printarray(somearray);
    

    【讨论】:

      【解决方案4】:

      数组真的是对象吗?

      数组是动态创建的对象,它们作为一个容器来保存(恒定)数量的相同类型的对象。看起来数组不像任何其他对象,这就是它们被区别对待的原因。

      如果您将main 签名修复为:

      ,您的代码编译:
      public static void main(String args[])
      

      如果添加printarray(somearray),它将无法编译,因为somearray 是一个包含int 的数组,其中printarray(应该命名为printArray)是一个接受Object 数组的方法。

      您的问题有很多解决方案,其中之一是将someArray 更改为Integer[] 类型。

      【讨论】:

      • Above code will not compile since printarray method cannot accept primitive arrays。我不相信你已经回答了这个问题。
      • @ChetanKinger 我回答了标题。将编辑我的答案。
      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2012-02-05
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多