Java中关于“=”跟“==”的分析
Java中变量分为普通原始变量(int char float等)和对象
一“=”
(1)普通原始变量
普通原始变量的声明和赋值语句如下
int a=3;
int b=a;
此时a和b都为普通原始变量,这里的内存使用情况如下
第一行在内存中开辟一块内存(大小为int所占的大小),并将这块内存用a标示,这时a的值的就是这块内存的内容,第二行b=a就是在内存中再开一块内存(大小为int所占的大小)但是这块内存的地址和第一行的地址是不一样的,但是软件人员也不知道所以不能直接使用内存。此时将a中的内容拷贝一份然后填充在b所表示的内存块中。执行完这两行代码后结果就是
开辟两块不同的内存,但是这两块内存中的内容是相同的。
(2)包装器和对象
假设A是一个类,现在有如下代码
A a;
a=new A();
A b=a;
这时候第一行代码就是在内存中开辟一块内存,并把这块内存标记为A类的引用,但是这块内存中的内容为null,表示这个A类的引用并不指向任何内存。
第二行代码就是先开辟一块内存,这块内存中的大小就是创造出A类一个默认对象的大小,然后创建一个A类的对象,将这个对象放入到这块内存中。然后再把这块内存的地址填充到引用变量a的内存中。
第三行代码就是先开辟一块内存,这块内存类型为A类对象引用并标记为b,然后将a内存中内容拷贝一份放到b内存中,所以b的引用也是第二行代码中创建的存放A类的对象的那块内存。
这三行代码执行完后,在内存中开辟了三块内存块。第一个内存块用a标示,类型为A类对象的引用,第二个内存块没有名字,类型为A类的对象,第三个内存块用b标示,类型也为A类对象的引用。
二 “==”
(1)普通原始变量
int a=3;
int b=3;
System.out.println(a==b);
此时在内存中开辟了两块内存块,被标示为a和b,内容都是3,这时候a==b比较的就是两块内存中的内容。输出为true
(2)包装器和对象
假设有A类
A a=new A();
A b=new A();
A c=a;
System.out.println(a==b);
System.out.println(a==c);
System.out.println(b==c);
第一行代码就是a为一块内存块,内容为另一块A类对象内存块的地址(假设为x)。
第二行代码就是b为一块内存块,内容为另一块A类对象内存块的地址(假设为y)。
第三行代码就是c为一块内存块,内容为和a所指向地址相同的内存块的地址(x)。
a==b判断的就是a内存块和b内存块中的内容,因为指向两块内存块的地址不同,所以第七行输出false
a==c判断的就是a内存块和c内存块中的内容,因为存放的都是第一行代码所产生的A类对象的内存块的地址,所以是相同的,输出true
b==c判断的是b内存块和c内存块中的内容,但是这两块的内存块中的内容是不同A类对象内存块的地址,所以输出false.
版权声明:本文为博主原创文章,未经博主允许不得转载。