我很难理解Object[]
是什么。它是一个保持对象的数组吗?例如,当我们这样做时会发生什么:
int a = 5;
String b = "Hi";
Object[] c = { a, b };
我刚刚创建了一个添加了属性a
和b
的对象吗?或者我得到一个Object
数组,其中a
和b
被计为对象数组c
的对象和元素?
感谢。
答案 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
当您编写上述行时,这意味着您创建了一个包含元素a
和b
的数组对象。您可以使用c
答案 3 :(得分:0)
是一个保存对象的数组吗?
准确地说,它是一个包含对其他对象的引用的对象。
Java中的所有对象都在堆上创建并存在,直到垃圾收集器回收它们。引用指向那些内存位置并为您的程序提供访问权限。
您提供的示例使用两个不可变对象。如果您选择了一个可变对象并将其添加到您的数组中,那么真正的乐趣就会发生。
答案 4 :(得分:0)
在执行程序时,它将打印,
5
喜
迭代数组。这表明Object
数组包含a of Integer
和b 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();