开发者社区> 问答> 正文

java中的引用和new的用法

初学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指向的空间,这里我就不明白了,为什么,
还望各位指教

展开
收起
蛮大人123 2016-06-12 17:18:07 4801 0
5 条回答
写回答
取消 提交回答
  • new一次就会在堆中分配一块内存,假设地址为AAA。而a,a1是在栈中分配的局部变量,第一行a的值可以理解为AAA,即a指向了AAA代表的内存块。第二行,相当于a1也等于AAA,那么a,a1都指向AAA的内存。第三行,相当于堆中又分配一块内存,假设地址为BBB,那么这时a=BBB了。这样a指向BBB的内存块,而a1依然指向AAA

    2019-07-17 19:34:42
    赞同 展开评论 打赏
  • 第一步: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栈空间、堆空间的存储类型,再来理解。

    2019-07-17 19:34:41
    赞同 展开评论 打赏
  • 简单的说你可以把引用看成指向某个地址(实际要比这复杂),但和C的指针不同,C的指针可以通过加减法然后就不知道指到哪里去了,Java里不能这么做。new A()是创建了类A的实例,这里术语是实例instance,而不是对象Object,也不是类Class。如果这个新建实例的地址是0x1234,那么第一句赋值后a指向地址在0x1234的某个实例。第二句a1也指向了同一个实例。在JVM里,这个实例现在被强引用了两次,分别是a和a1。第三句,又新建了一个实例,比如地址是0x5678,但是赋给了a,这样a就断开了对0x1234的引用,而引用了0x5678的实例。至此,0x1234和0x5678各有一个强引用。只要有强引用存在,实例就不会被当成垃圾清除掉。

    2019-07-17 19:34:41
    赞同 展开评论 打赏
  • 只有new A的时候分配了空间, A a1 = a其实就相当于把指向地址传递了一下

    2019-07-17 19:34:41
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    int i = 3;
    i = 4; //为什么这里不写int?能明白么?因为i已经定义了。
    或者说int i = 3;其实是如下两行
    int i; //在此之前不知道什么是i,需要定义
    i = 3;//赋值
    用了new都是分配了空间。

    2019-07-17 19:34:41
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载