栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

错题分析two

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

错题分析two

public class Example{
    String str = new String("good");
    char[ ] ch = { 'a' , 'b' , 'c' };
    public static void main(String args[]){
        Example ex = new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[ ]){
        str = "test ok";
        ch[0] = 'g';
    }
}

A:good and abc

B:good and gbc

C:test ok and abc

D:test ok and gbc

首先我们都知道 String 和char[]都是引用数据类型,他们都会在栈中存放地址,在堆中存放的是具体的值,由栈中的值指向具体的地址。

现在我们来看题,我们现在先假设ex.str地址为0x110,它指向的是“good”,ex.char[]的地址为0x111,指向的是{‘a’,'b','c'}。现在我们通过change方法,将我们的str的值赋给了change中的局部变量str,(这个是局部变量和前面的str有区别,那个是全局变量,并不是同一个)所以它现在还是指向“good”,它的地址也是0x110,现在通过代码将局部str等于“test ok”,所以说会在堆中重新付一个值给str,即局部str的地址会修改,假设变成0x1100,指向test ok。但我们此时全局的str的地址并没有修改,还是指向“good”。再看ch,这个全局变量的ch会将值也会付给局部变量的ch,现在我们通过坐标索引改变它的值,这里记住我们是改变它的值,并没有重新赋值给他。所以堆中的{‘a’,'b','c'}就会变成{‘g’,'b','c'},此时我们全局变量的ch还是指向这个值的,所以我们的输出结果就为good and gbc。如图:

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/294125.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号