初学java,有些问题很幼稚,还望各位大神能多扶持
首先,说说引用的问题,
我定义了一个A类。其中初始化属性name为A,
接下来:
A a = new A;//创建一个对象
A a1 = a;//这里好像是一个引用,有点不懂,我把他理解为指针,
a = new A; // 这是第二个问题,在创建对象的时候,一般不都是类 对象 = new 类吗?为什么这里可以直接new呢,而且看教程上是说又新分配了一个空间,我想问的是只要是new,都是分配存储空间吗,及即使不创建对象
//
还有补充一点,在第三行代码中,由于是新分配了一个空间,第一二条代码相当于a1指向原来a指向的空间,然后后来a又指向了一个新的内存,在这个时候,a指向了两个存储空间,教程上说a指向原来的空间这就作废了,然后这时,a1指向了两个空间,
教程上说这时a1指向了原来a指向的空间,这里我就不明白了,为什么,
还望各位指教
new一次就会在堆中分配一块内存,假设地址为AAA。而a,a1是在栈中分配的局部变量,第一行a的值可以理解为AAA,即a指向了AAA代表的内存块。第二行,相当于a1也等于AAA,那么a,a1都指向AAA的内存。第三行,相当于堆中又分配一块内存,假设地址为BBB,那么这时a=BBB了。这样a指向BBB的内存块,而a1依然指向AAA
第一步:A a = new A;
这里可以看成三步:
1、A a是声明,2、new A生成对象,3、赋值
对java对象来说,引用和对象是分别存储的,在这里也就是a本身需要存储在一个空间(栈),new A的对象需要存储在一个空间(堆);对赋值而言,其实是把引用a存储的地址,指向了new A的实际对象所在的空间地址。
第二步:A a1 = a;
通过上面的分析,容易知道a存储的是new A的对象地址。这里a1和a都指向的是同一个对象。
第三步:a = new A
a本身还是存在栈的那个空间,不过a存储的地址是另一个new A的对象地址了。现在a、a1就不是指向同一个对象了。
譬如,楼主有一个通讯录。
1、你在通讯录上起了个名字:小明,但其实你也不知道小明是谁,他在哪里。但是名字在你通讯录上了。 小明这俩个字就是你的引用,这个引用存在你的通讯录上。
这时,有个男生说,我叫小明,家住在北京三环,对象小明的地址是三环。然后你把这个小明关联到你通讯录上的小明上了,通讯录小明名字上存了一个北京三环的地址,这就是赋值。
2、然后你又起了个名字明明,你把小明的地址写到明明这里,因为我们约定一个地址只能住一个人,所以现在小明、明明,都是指的住在北京三环的那个人了。
3、过俩天,你又认识一个女生,女生把她地址告诉你,你把通讯录上小明的地址改成这个女生的北京二环了。 现在,通讯录上小明、明明就是俩个人了。
栈空间分配引用地址,引用本身存的是对象的地址,对象的地址在堆空间。
建议lz可以去了解一下java栈空间、堆空间的存储类型,再来理解。
简单的说你可以把引用看成指向某个地址(实际要比这复杂),但和C的指针不同,C的指针可以通过加减法然后就不知道指到哪里去了,Java里不能这么做。new A()是创建了类A的实例,这里术语是实例instance,而不是对象Object,也不是类Class。如果这个新建实例的地址是0x1234,那么第一句赋值后a指向地址在0x1234的某个实例。第二句a1也指向了同一个实例。在JVM里,这个实例现在被强引用了两次,分别是a和a1。第三句,又新建了一个实例,比如地址是0x5678,但是赋给了a,这样a就断开了对0x1234的引用,而引用了0x5678的实例。至此,0x1234和0x5678各有一个强引用。只要有强引用存在,实例就不会被当成垃圾清除掉。
int i = 3;
i = 4; //为什么这里不写int?能明白么?因为i已经定义了。
或者说int i = 3;其实是如下两行
int i; //在此之前不知道什么是i,需要定义
i = 3;//赋值
用了new都是分配了空间。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。