欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java,

来源: javaer 分享于  点击 22538 次 点评:6

java,


java之赋值

最近在写一个小项目的时候发生了一个bug,困扰了我挺长时间,最终终于找到了它,隐藏的还是挺深的,但涉及的知识点非常基础,就是常用的赋值。

先出结论吧,在这篇文章中介绍了作者理解的赋值,但是我看完并不觉得好,但看到下面的comment3,总结的非常到位而清晰,感谢www.gaimor.cn在此引用下他的comment

java中有两种数据,一种是基本数据类型(int,float,double,boolean),另外一种是引用数据类型(类,接口,数组)。对于基本数据类型,赋值(b=a)的时候,是把a的值,复制一份给b。对于引用型数据类型,赋值(b=a)是把a指向的地址复制给b,这时候b的操作实际就是a的操作,所以看起来好像b的行为会影响a的结果。但是对于String类,它有一个特性,是字符串常量,String a="aaa";a="bbb";执行这两个语句时,a的地址实际发生了变化。所以 String a="aaa";String b="bbb";b=a;b="ccc";执行完后,b指向了ccc,a还是指向aaa;

在此写个小Demo验证下

public class Demo {
    private int typeOfInt=0;
    private boolean[] array={false};

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Demo().test();
    }

    public void test(){
        int anotherInt=typeOfInt;
        System.out.println(anotherInt);www.shenghuodemeili.com
        typeOfInt=1;
        System.out.println(anotherInt);

        boolean[] anotherArray = array;
        System.out.println(anotherArray[0]);
        array[0]=true;
        System.out.println(anotherArray[0]);
    }
}

执行结果

0
0
false
true

基于此我来分析下自己遇到的隐藏bug,事情是这样的,我有一个9*9的boolean类型的二维数组,我当时图省事,就没有老老实实写81个false,看下我当时情况的demo

public class Demo {     
    private boolean[] flag = {false,false,false,false,false,false,false,false,false};
    private boolean[][] flags ={flag,flag,flag,flag,flag,flag,flag,flag,flag};

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Demo().test();
    }

    public void test(){         
        flags[0][0]=true;
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                System.out.print(flags[i][j]);
            }
            System.out.println();
        }
    }
}

我本来只是想修改flags[0][0],却得到了我意想不到的结果

true false false false false false false false false 
true false false false false false false false false 
true false false false false false false false false 
true false false false false false false false false 
true false false false false false false false false 
true false false false false false false false false 
true false false false false false false false false 
true false false false false false false false false 
true false false false false false false false false 

至此,有了上面对数组赋值的基础,大家应该也明白了我这种图省事写的方法是不行的,flags直接用了flag的地址,所以修改了flags[0][0],实际上是在修改flag[0]。

相关文章

    暂无相关文章
相关栏目:

用户点评