java和c++中的数组是否为对象
java到底是不是把数组当做对象,全凭Java的设计者决定。
数组到底是不是对象, 通过代码验证:
复制代码
int[] a = new int[4];
//a.length; //对属性的引用不能当成语句
int len = a.length; //数组中保存一个字段, 表示数组的长度
//以下方法说明数组可以调用方法,java中的数组是对象.这些方法是Object中的方法,所以可以肯定,数组的最顶层父类也是Object
a.clone();
a.toString();
复制代码
在数组a上, 可以访问他的属性,也可以调用一些方法。这基本上可以认定,java中的数组也是对象,它具有java中其他对象的一些基本特点:封装了一些数据,可以访问属性,也可以调用方法。所以,数组是对象。
而在C++中,数组虽然封装了数据,但数组名只是一个指针,指向数组中的首个元素,既没有属性,也没有方法可以调用。如下代码所示:
复制代码
int main(){
int a[] = {1, 2, 3, 4};
int* pa = a;
//无法访问属性,也不能调用方法。
return 0;
}
复制代码
所以C++中的数组不是对象,只是一个数据的集合,而不能当做对象来使用。
package study;
public class GetClass {
public static void main(String[] args) {
Person p = new Person(1,"PersonClassObject");
int [] a={1,2,3,4};
System.out.println(a.getClass().getName());
String[] s = new String[2];
System.out.println(s.getClass().getName());
System.out.println(p.getClass());
System.out.println(p.getClass().getName());
}
}
/*
*输出:
[I
[Ljava.lang.String;
class study.Person
study.Person
* */
class Person{
int id;
String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
}
可见,java的数组是对象,其名称较为古怪就是了.
这只能有一个解释,那就是虚拟机自动创建了数组类型,可以把数组类型和8种基本数据类型一样, 当做java的内建类型。这种类型的命名规则是这样的:
每一维度用一个[表示;开头两个[,就代表是二维数组。
[后面是数组中元素的类型(包括基本数据类型和引用数据类型)
package study;
public class ArrayAndObject {
/* //1 在test1()中已经测试得到以下结论: 数组也是对象, 数组的顶层父类是Object, 所以可以向上转型
int[] a = new int[8];
Object obj = a; //数组的父类也是Object,可以将a向上转型到Object
int[] b = (int[]) obj; //可以进行向下转型*/
/* if(obj instanceof Object )//少年,这里定义类成员的地方,不是成员方法内部代码该出现的地方:(当出现莫名的错误时要记起来这一点);
{ //可以用instanceof关键字进行类型判定 (对象 instanceof 类)
System.out.println("obj的真实类型是int[]");
}*/
/*psvm快捷键:*/
public static void main(String[] args) {
//1 在test1()中已经测试得到以下结论: 数组也是对象, 数组的顶层父类是Object, 所以可以向上转型
int[] a = new int[8];
Object obj = a ; //数组的父类也是Object,可以将a向上转型到Object
//2 那么能向下转型吗?
int[] b = (int[])obj; //可以进行向下转型
//3 能使用instanceof关键字判定吗?
if(obj instanceof int[]&&a instanceof int[] ){ //可以用instanceof关键字进行类型判定
System.out.println("obj的真实类型是int[]");
/*Java中数组的另一种“继承”关系*/
/*如下代码是正确的,却很容易让我们疑惑:*/
String[] s = new String[5];
Object[] obja = s; //成立,说明可以用Object[]的引用来接收String[]的对象
/*Object[]类型的引用可以指向String[]类型的数组对象? 由上文的验证可以得知数组类型的顶层父类一定是Object,那么上面代码中s的直接父类是谁呢?难道说String[]继承自Object[],而Object[]又继承自Object? 让我们通过反射的方式来验证这个问题:*/
//那么String[] 的直接父类是Object[] 还是 Object?;我们打印父类看一下
System.out.println(s.getClass().getSuperclass().getName());//结果:java.lang.Object
}
}
}

浙公网安备 33010602011771号