JAVA 初始化的疑问
第21行在类构造函数执行前,在堆内存中建立了一个v2实例对象吗?还是只是给v2一个引用值,并没有建立实例对象?同样第20行在类构造函数前,执行了什么操作?新建了一个v1实...
第21行 在类构造函数执行前,在堆内存中建立了一个v2实例对象吗?还是只是给v2一个引用值,并没有建立实例对象?
同样 第20行 在类构造函数前,执行了什么操作?新建了一个v1实例对象吗?
20-23这三行代码中有什么区别?v1 v2 v3有什么不同? 展开
同样 第20行 在类构造函数前,执行了什么操作?新建了一个v1实例对象吗?
20-23这三行代码中有什么区别?v1 v2 v3有什么不同? 展开
2个回答
展开全部
20-23的执行顺序应该都是:1在堆内存中分配空间建立对象,2然后栈内存中声明引用,3然后将刚才堆内存中建立的对象地址值赋值给栈中的引用
不同之处是:
20行建立的v1指向的对象就是一个普通对象,可以被更改、不属于Value类,只属于v1引用的这个对象自己。
21行建立的v2指向的对象就是一个有final属性的对象,说明这个对象不能被执行任何更该数值的操作,你可以理解为相当于常数(常熟不能被更改值),其他属性和v1一样。
22行建立的v3指向的对象就是一个在加上21行的v2所具有的不能被更改值这一属性的基础上的一个static静态对象,也就是说v3的对象属于类Value共有,也就是说所有Value以后或者之前已经new出来的对象,都共同拥有v3这一个对象,只是v3因为加上了final不能被更改。
PS:如果你声明v3的时候,不加上final,比如private static v3 = new Value();那么你可以验证一下v3被static修饰后的“所有类对象共有”这一属性,比如Value类里你放上一个int数值i,你用v1更改i的值,然后用v2读取
PPS:Value这个类你没有明确写出来,所以我以上所有回答都是建立在将你的Value类当成一个很普通的类来看待的
望采纳,谢谢
不同之处是:
20行建立的v1指向的对象就是一个普通对象,可以被更改、不属于Value类,只属于v1引用的这个对象自己。
21行建立的v2指向的对象就是一个有final属性的对象,说明这个对象不能被执行任何更该数值的操作,你可以理解为相当于常数(常熟不能被更改值),其他属性和v1一样。
22行建立的v3指向的对象就是一个在加上21行的v2所具有的不能被更改值这一属性的基础上的一个static静态对象,也就是说v3的对象属于类Value共有,也就是说所有Value以后或者之前已经new出来的对象,都共同拥有v3这一个对象,只是v3因为加上了final不能被更改。
PS:如果你声明v3的时候,不加上final,比如private static v3 = new Value();那么你可以验证一下v3被static修饰后的“所有类对象共有”这一属性,比如Value类里你放上一个int数值i,你用v1更改i的值,然后用v2读取
PPS:Value这个类你没有明确写出来,所以我以上所有回答都是建立在将你的Value类当成一个很普通的类来看待的
望采纳,谢谢
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询