究竟什么是Object []?

时间:2014-11-05 10:15:56

标签: java

我很难理解Object[]是什么。它是一个保持对象的数组吗?例如,当我们这样做时会发生什么:

int a = 5;
String b = "Hi";
Object[] c = { a, b };

我刚刚创建了一个添加了属性ab的对象吗?或者我得到一个Object数组,其中ab被计为对象数组c的对象和元素?

感谢。

8 个答案:

答案 0 :(得分:4)

实际上你创建了一个从Object派生的对象数组(对于Java中的所有对象都是如此),现在包含位置0上的Integer(由autoboxing创建)和位置1上的String。

答案 1 :(得分:2)

Java不是动态类型的,因此您无法像在javascript(without reflection)中那样动态添加属性。顺便说一句。在java中,你不要将它们称为属性,而是实例成员/字段或方法,如果它是一个函数,它在classes中定义(但你通常使用从类构造的实例)。因此Object是一个类,而Object obj = new Object(); obj是一个实例

符号ClassName[]始终表示类型为ClassName的数组,因此

Object[]

表示一个对象数组。和

String[]

一个只能包含字符串的数组。

您可以使用

初始化数组
Object[] objArr = new Object[3];

创建一个可容纳3个元素的新空数组。或者您可以通过

直接设置元素
Object[] objArr = {"elem1","elem2","elem3"};

创建一个包含3个元素(elem1-3)的数组。因此:

System.out.println(objArr[0]); //"elem1"
System.out.println(objArr[1]); //"elem2"
System.out.println(objArr[2]); //"elem3"
System.out.println(objArr[3]); // ArrayIndexOutOfBoundsException

因为您使用Object作为类型,所以您可以为数组设置几乎任何内容,因为任何类都会自动从Object继承

Object[] objArr = {"elem1",2.34,new Date()};
System.out.println(objArr[0]); //"elem1"
System.out.println(objArr[1]); //2.34
System.out.println(objArr[2]); //11.05.2014

2.34是一个double,所以是一个原语,但是从1.4 java autoboxes every primitive into its Object pendant(所以Double)开始,这就是它的工作原理。请注意,通常使用静态类型语言,您不希望这样做,因为您失去了静态类型检查的优点,因此最好定义您的类型并使用它们。

答案 2 :(得分:1)

  

我刚刚创建了一个添加了属性a和b的对象吗?

没有。这些都是元素。 属性!=元素。

  

我得到一个对象数组,其中a和b被算作对象和对象数组的元素吗?

小错了。计算为对象的元素。

  Object[] c = { a, b }; // a is Integer and b is String

当您编写上述行时,这意味着您创建了一个包含元素ab的数组对象。您可以使用c

引用数组

答案 3 :(得分:0)

  

是一个保存对象的数组吗?

准确地说,它是一个包含对其他对象的引用的对象。

Java中的所有对象都在堆上创建并存在,直到垃圾收集器回收它们。引用指向那些内存位置并为您的程序提供访问权限。

您提供的示例使用两个不可变对象。如果您选择了一个可变对象并将其添加到您的数组中,那么真正的乐趣就会发生。

答案 4 :(得分:0)

在执行程序时,它将打印,

  

5
   喜

迭代数组。这表明Object数组包含a of Integerb of String

答案 5 :(得分:0)

它是一组对象。您已经将原始int中的a自动装入Integer并将其添加到Object数组中。记住所有对象扩展对象。尝试将Objects转换为它们的子类类型,这可能会帮助您了解正在发生的事情。 E.G。

int a2 = (Integer) c[0];
String b2 = (String) c[1];

答案 6 :(得分:0)

Object []是一个对象引用数组。从你的代码中,想象你这样做了:

int a = 5;
String b = "Hi";
Object o1 = a; // Autoboxes to java.lang.Integer
Object o2 = b;

非常相似:

int a = 5;
String b = "Hi";
Object[] c = new Object[2];
c[0] = a;
c[1] = b;

......对吗?这正是您上面的代码所做的更简单的方式。因此,您创建一个数组,其中每个元素都包含对Object的引用。

答案 7 :(得分:0)

对象是Java中每个非基元的超类。在您的代码中:

int a = 5; // <- int is a primitive
String b = "Hi"; // <- String is a subclass of Object
Object[] c = { a, b };

c 希望拥有一个Object数组,并且因为 a 是一个int,所以发生了autoboxing(这意味着编译器使int成为一个整数-宾语)。您可以将它与以下代码进行比较(这基本上是编译器在幕后所做的)。

int a = 5; // <- int is a primitive
String b = "Hi"; // <- String is a subclass of Object
Object[] c = { new Integer(a), b }; // <- int is autoboxed to it's container-class Integer

正如我所提到的,Objects是Java中每个非原始的超类。因此,让我们将您的代码与以下内容进行比较:

我有三个班级:

class C{ } // Just compare this with Object
class B extends C{ } // Compare this with String
class A extends C{ } // Compare this with Integer

// translating your code to:
A a = new A();
B b = new B();
C[] c = { a, b };

左侧是引用类型,右侧是对象类型

// List is the reference type, ArrayList is the object type
List<String> list = new ArrayList<String>(); // (or List<String> list = new ArrayList<>(); in Java 7+)

// With the C, B and A classes above:
// C is the reference type, A is the object type
C myClass = new A();