【问题标题】:Arrays are really homogeneous?数组真的是同质的吗?
【发布时间】:2018-10-02 07:34:46
【问题描述】:

在下面的代码中,EX1 和 EX 2 证明了同质理论,但在 EX3 中它包含多个类型值。那么,我们怎么能说数组是齐次的呢?这背后的确切理论是什么?

public class Test {
        public static void main(String[] args) {
            // Ex 1
            int [] intArr = new int[5];
            intArr[0] = 1;
            intArr[1] = 2;

            // Ex 2
            int [] intArr2 = new int[5];
            intArr2[0] = 1;
            intArr2[1] = "ss";

            // Ex 3
            Object [] objArr = new Object[5];
            objArr[0] = 1;
            objArr[1] = "ss";
            objArr[3] = new Object();
        }
    }

【问题讨论】:

  • 您将 EX3 声明为对象数组,并且 java 的语法糖允许您不明确将 1 和“ss”声明为 Object(就像自动装箱和拆箱与 Integer <-> int 一起使用)。但是当它们被添加到数组中时,它们会被转换为Object,因此数组保持同质。它仅包含 Object 类型的值
  • You can't assign a String to an int array。你在发布之前测试过你的代码吗?
  • @TimBiegeleisen 我认为这是 OP 的一部分,指出数组是同质的,OP 应该将 Ex 2 标记为导致编译错误。
  • @xtratic 是的,看到 Random Guy 的评论后,我明白了这个问题。
  • @Sandun Perera 在 Ex 3 中,objArr[0] 包含一个Integer,它是一个Object,与int 相框; objArr[1] 包含一个 String,它是一个 Object;并且objArr[3] 包含一个Object,这显然是一个Object。所以你有一个充满Objects的数组。

标签: java arrays data-structures collections


【解决方案1】:

这里有两个概念:继承和自动装箱

Inheritance - String 继承自 Object,因此是 Object。这意味着 String 在编译时会自动获取 Object 类中定义的所有方法和属性。它是一个对象加上特定于字符串的附加内容。但是,它可以被 Java 视为一个对象,因为它是一个对象。当它被添加到数组中时,它被添加为一个对象,而不是一个字符串。那是因为 Array 被定义为一个对象数组。

char a = "ss".charAt(1);   // Legal as charAt(..) is a method in the String class
Object [] objArr = new Object[5];
objArr[1] = "ss";  
objArr[1].charAt(1);       // Not legal because charAt(..) method is not defined for Object

Oracle Tutorial

Auto-Boxing - Java 执行一种称为自动装箱的快捷方式,将原语自动转换为一组特殊的包装类,所有这些类都继承自 Object。因此,由于自动装箱和继承,将数字分配给 Object 也会将该数字转换为 Object。

因此,添加到数组中的所有内容都作为对象添加。确实,数组中的对象可能是继承自 Object 的类。但是,就数组而言,它们是 Object 类型的。即便如此,如果您要将其从数组中拉出并将其转换为 Integer,您也可以这样做。它仍然带有整数信息,但如果没有演员表,该信息将不可用。从数组的角度来看,它只是一个对象。

Oracle Tutorial

【讨论】:

  • 谢谢你的意思。您的意思是数字 1 (int) 转换为 Integer (Wrapper class) 1 并在添加到数组时再次转换为 Object?
  • 差不多。它将 1 转换为 Integer 包装类。但是,当它将它添加到数组中时,我不会说它会转换它。这是它变得更加混乱的地方。它将它作为对象添加到数组中。但是,如果要将其从数组中拉出并将其转换为整数,则可以这样做。它仍然带有整数信息,但该信息无法通过演员表获得。从数组的角度来看,它只是一个对象。
  • @LiveNLearn 我建议您将该评论合并到您的答案中,作为重要的一点。
  • 谢谢大家。 @LiveNLearn 我想我明白你的意思了吗?有没有可能通过分析字节码来了解这里发生了什么?
猜你喜欢
  • 2020-02-17
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 2013-05-25
  • 2013-06-11
  • 1970-01-01
  • 2018-07-19
相关资源
最近更新 更多