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.

Java中关于“=”和“==”的分析的更多相关文章

  1. Java中ArrayList源码分析

    一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...

  2. Java中json工具对比分析

    Java中几个json工具分析 1, 环境 JDK1.6+IDE(IntelliJ IDEA)+windowsXP+GBK编码 2,分析对象 jackson1.8.2 http://jackson.c ...

  3. Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

    (一)Eclipse中的快捷键:  ctrl+shift+f自动整理选择的java代码 alt+/ 生成无参构造器或者提升信息 alt+shift+s+o 生成带参构造 ctrl+shift+o快速导 ...

  4. 大杂烩 -- Java中Iterator的fast-fail分析

    基础大杂烩 -- 目录 Java中的Iterator非常方便地为所有的数据源提供了一个统一的数据读取(删除)的接口,但是新手通常在使用的时候容易报如下错误ConcurrentModificationE ...

  5. Java中的<< 和 >> 和 >>> 分析理解

    Java中的<< 和 >> 和 >>> 详细分析 <<表示左移移,不分正负数,低位补0: 注:以下数据类型默认为byte-8位 左移时不管正负,低 ...

  6. Java中I/O的分析

    Java中I/O的原理: 在java程序中,对于数据的输入/输出操作以”流“的方式进行的. 流是内存中一组有序数据序列 Java将数据从源读入到内存当中,形成了流,然后这些流可以写到目的地. Java ...

  7. Java中Iterator的fast-fail分析

    1.fail-fast简介 fail-fast机制是java集合(Collection)中的一个错误机制.当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件. 例如:当某一个线 ...

  8. Java中的递归原理分析

    解释:程序调用自身的编程技巧叫做递归.        程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用 ...

  9. java中i=i++问题分析

    http://www.ticmy.com/?p=43 重点:局部变量表 和 操作数栈的执行过程. 使用javac编译后再使用javap -c Test反编译这个类查看它的字节码,如下(只摘取main方 ...

随机推荐

  1. A-Frame WebVR开发新手教程

    WebVR和WebGL应用程序接口使得我们已经能够在浏览器上创建虚拟现实(VR)体验.但从project化的角度而言,开发社区还须要很多其它方便强大的开发库来简化编程.Mozilla的 A-Frame ...

  2. chkconfig命令具体介绍

    命令介绍: chkconfig命令用来更新.查询.改动不同执行级上的系统服务.比方安装了httpd服务,而且把启动的脚本放在了/etc/rc.d/init.d文件夹下,有时候须要开机自己主动启动它,而 ...

  3. 【Android】12.2 利用Intent启动和关闭Activity

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 Android应用程序中一般都有多个Activity,在Activity中,通过调用StartActivity方法 ...

  4. Servlet与WebService关系

    转自:http://www.cnblogs.com/cy163/archive/2008/04/16/1155767.html 其实从实现的效果上,它们是很相似的         相同点:     客 ...

  5. 服务器swap

    交换区(swap)是存在于高速存储设 备上的一块区域,是虚拟内存系统重要的组成部分.通过交换区,我们不再局限于有限的物理内存空间,理论上可以无限地扩大虚拟内存系统,从而运行更多的程 序,进行更多的业务 ...

  6. ubuntu 清理系统垃圾与备份

    虽然linux下不会有windows下的那么多垃圾和磁盘碎片!但还是会留下一些用不着的临时文件或是多次升级后的N个旧的内核! 1,非常有用的清理命令:sudo apt-get autocleansud ...

  7. 解决python2.7 UnicodeDecodeError和UnicodeEncodeError问题

    最近在项目中,读取上传的csv文件,并写入时,会报编码问题, with open(origin_file_path, mode='wb')as f: for chunk in file_obj: f. ...

  8. Linux下安装Python3.6和第三方库

    如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境, 比如yum!!!!! 不要动现有的python2环境! 一.安装p ...

  9. java 多线程11:volatile关键字

    直接先举一个例子普通的线程实例变量的非可见性: public class MyThread28 extends Thread { private boolean isRunning = true; p ...

  10. Python 并行分布式框架 Celery

    Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...