csdnhbc20 2023-03-02 11:29 采纳率: 100%
浏览 22
已结题

一个java引用类型的问题

问题如下,代码在下面:
调用函数前a的值为:18
a的内存地址为:1013423070
a属性的内存地址为:380936215
b的内存地址为:1013423070
b属性的内存地址为:142638629
调用函数后a的值为:0


为什么a属性的内存地址和b属性的内存地址不一样呢?这里不是只有一个Person对象么?
a属性的内存地址为:380936215
b属性的内存地址为:142638629


又有一个问题,a和b是不同的两个变量,为什么这里内存地址会相同呢?应该是a和b的值相同吧?
a的内存地址为:1013423070
b的内存地址为:1013423070


public class TestZhiAndYinYong
{
    //引用类型:类和对象
    public static void main(String[] args)
    {
        Person a = new Person();
        a.age = 18;
        System.out.println("调用函数前a的值为:" + a.age);
        System.out.println("a的内存地址为:" + System.identityHashCode(a));
        System.out.println("a属性的内存地址为:" + System.identityHashCode(a.age));
        fun(a);
        System.out.println("调用函数后a的值为:" + a.age);
    }

    public static void fun(Person b)
    {
        b.age = 0;
        System.out.println("b的内存地址为:" + System.identityHashCode(b));
        System.out.println("b属性的内存地址为:" + System.identityHashCode(b.age));
    }
}

class Person
{
    int age;
}

  • 写回答

3条回答 默认 最新

  • 於黾 2023-03-02 13:35
    关注

    这是因为java有内存优化机制,-127到128之间的整数,都预先分配了内存地址
    所以age一开始是18时指向一个地址,改为0后指向了另一个地址
    python也有类似的机制
    这不仅在成员变量里存在
    你定义两个int a,b,然后给它们赋相同的值,会发现它们地址一样
    这种机制的好处在于,假如你搞了一堆指示灯变量,来回修改它们的值,一会0一会1一会2
    那么即使定义了1000个变量,后面其实指向的只是3个地址,而不是1000个不同的地址
    这样在你大量定义数值非常小的变量时,可以有效的节约内存

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月17日
  • 已采纳回答 3月9日
  • 创建了问题 3月2日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装