在java中,对象数组中未实例化的元素调用该类的静态变量

public class DVD {
static int l=1;
public static void main(String[] args) {
DVD[] dvd=new DVD[10];
DVD dvd1;
System.out.println(dvd[0]); //输出null
System.out.println(null.l); //编译错误
System.out.println(dvd[0].l); //输出1.编译运行都正常
System.out.println(dvd1.l); //输出2.编译错误
//输出1只是声明了对象数组,但是并没有为dvd[0]创建对象,所以为null,怎么还能调用l属性
//输出2声明了dvd1,也是没有创建对象,为什么一调用l就报错
}
}

注:请尽量详细说明,谢谢

DVD[] dvd=new DVD[10];
为每个dvd的0-9元素 在栈内存分配了内存地址,并初始化为不指向任何地址。

DVD dvd1;
在栈内存分配了地址,但是没初始化指向一个堆内存,栈内存里是原来该内存上的数据,随机指向了一个堆地址,所以这种情况很可怕,调用dvd1.l编译器是不会通过的。

DVD dvd1 = null;
在栈内存分配了地址,初始化为不指向任何地址,就不会随机指向一个堆地址了。这样在调用dvd1.l,就能通过了,并且也能得到l的值了。

静态代码是使用公共内存空间的,就是说所有对象都可以直接引用,不需要创建对象再使用。要是定义一个静态方法的话也是可以调用的,不只是静态变量。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-05

    DVD是个对象数组,你只初始化了数组,而没是实例化数组里的没个对象,所以为null;

    看第1条。为空不能点属性

    看第1条,为空的对象不能点属性

    请看第3条

追问

那输出1的dvd[0]不是为null吗,那不就等于null调用属性l吗?

追答

你的变量l是静态的, 不需要实例化对象只需要一个类即可调用,所以可以输出!

第2个回答  2013-07-05
dvd[0].l , dvd1.l 编译时实际都是调用DVD.l

dvd1.l编译错误,实际是eclipse的一个检测的语法吧,我猜测直接用javac编译应该没问题

要想dvd1.l编译不报错,声明的时候写个 DVD dvd1 = null;就可以了

null.l报错是因为null无法确定是哪个类,如果有个VCD类也有l这个变量,而其他几种调用方式都可以唯一确定是DVD这个类,所以不管是不是null都可以调用成功
第3个回答  2013-07-05
很明显的空指针,dvd1就null的,
DVD[] dvd=new DVD[10]; DVD中的每一个对象都是DVD这个类,这个类中有一个I变量,当然能获取到的
第4个回答  2013-07-05
1.当你new DVD[10]的时候就已经为dvd[0]创建对象了,所以dvd[0].l时是正常的。
2.因为你dvd1没有实例化。你可以直接写DVD.l
第5个回答  2013-07-05
他的任何电话
相似回答