Java中有两种类型的变量,一种是对象类型,另一种是基础类型(primitive type)。

对象类型普遍采用引用的方式,比如

 List a = new ArrayList();
List b = a;

这将会构造一个列表对象,并在a和b中各自保存该对象的一个引用,所以a与b将指向同一个列表对象。所以如果往a中加入元素的话,可以发现b也有相同的变化。

基础类型只有8种,boolean, byte, char, short, int, long, float, double,这种类型的变量,java是直接存值的,而不是存引用。比如定义int a = 1;,a中存放的就是1本身,而不是一个指向哪的一个引用。所以如果定义int a = 1, b = a;,此时的b与a是两个不同的变量,一个的变化不会影响到另一个。

但这些基础类型都有相应的对象类型的Wrapper类,它们是Boolean, Byte, Charactor, Short, Integer, Long, Float, Double类。如果定义:

Integer a =1, b = a;

那么此时,a与b将都使用对象型的方式,只保存一个引用,并且它们的引用指向了同一个Integer对象。这是与写int a = 1, b = a;的区别。下图表示了上面的两种方式的存储状态。

****************    primitive type    *****************
+------+ +-----+
int a | 1 | b | 1 |
+------+ +-----+ **************** object type *****************
+------+ +------------------|
Integer a | ---+---------> | Integer object(1)|
+------+ +------------------+

+------+ |
b | ---+------------------+
+------+

=================== 华丽的分割线 =================

在你这儿的

int a = 0,b = 0,c = 0,d = 0;
int[] alpha = {a,b,c,d};
a = 1; b = 2; c = 3; d = 4;

由于这里使用的是基本类型,所以第2行的时候,数组中的每个元素中的整数都是保存值的,而不是引用,所以第3行中的a, b, c, d再重新赋值并不会更改数组中相应元素的值。所以它们还都是0。

其实你会发现,如果这里不使用基本类型,而是使用它的Wrapper类,情况似乎也没变。

Integer a = 0,b = 0,c = 0,d = 0;
Integer[] alpha = {a,b,c,d}
a = 1; b = 2; c = 3; d = 4;

执行了上述的语句后,alpha中的各元素还是0。这是不是说数组中还是存值呢?不是的,因为Integer是对象类型,所以它是保存引用的。下面这一段代码能说明这现象的原因:

Integer a = 1;
Integer b = a;
a = 2;

这个时候你会发现b还是1。前两行会使a, b指向同一个对象,但是第3行,会生成一个新的对象(类似于new Integer(2)),并把a重新指向这个新对象。但这并不会影响b的指向,b还将保存原来对象的引用。所以前面的例子中第3行对a, b, c, d的重新赋值,并不会影响数组中相应引用的指向。所以也都还是指值为0的对象。

如果我们自定义如下一个类

class Int {
public int value;
public Int(int v){this.value = v;}
}

并且执行下面的语句

Int a = new Int(0),b = new Int(0),c = new Int(0),d = new Int(0);
Int [] alpha = {a,b,c,d}
a.value = 1; b.value = 2; c.value = 3; d.value = 4;

此时你会发现alpha中的每个元素的值都变了,分别是1, 2, 3, 4。

java中两种类型变量的更多相关文章

  1. JAVA 中两种判断输入的是否是数字的方法__正则化_

    JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...

  2. Java中两种实现多线程方式的对比分析

    本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cf ...

  3. JSON语言规范与Java中两种解析工具基本使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6652250.html  一:JSON语言规范 一言以蔽之:“一个 :一个键值对,一个{}一个对象,一个[]一个 ...

  4. java中两种添加监听器的策略

    /*第一种:将事件的处理委托给其他对象,下面的例子是委托给了MyListener(implements ActionListener)*/ 1 import java.applet.Applet; i ...

  5. java中两种单例模式

    //懒汉式(线程不安全) class LazySingleton{ private static LazySingleton singleton; private LazySingleton(){} ...

  6. java中两种发起POST请求,并接收返回的响应内容的方式  (转)

    http://xyz168000.blog.163.com/blog/static/21032308201162293625569/ 2.利用java自带的java.net.*包下提供的工具类 代码如 ...

  7. jsp中两种include的区别【转】

    引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...

  8. Java中四种引用:强、软、弱、虚引用

    这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...

  9. Java中几种日志方案

    .本文记录Java中几种常用的日志解决方案 0x01 Log4j .这应该是一个比较老牌的日志方案了,配置也比较简单,步骤如下 1)添加对应依赖,比如 Gradle 中 dependencies { ...

随机推荐

  1. (转载)猫都能学会的Unity3D Shader入门指南(一)

    原文地址 http://onevcat.com/2013/07/shader-tutorial-1/ 动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚 ...

  2. 浏览器对象模型BOM(Browser Object Model)

    1.结构 BOM是Browser Object Model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是w ...

  3. org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.chen.vo.Dept.parentId

    异常描述:执行以下的addAsHaveParentId2方法出现此异常: /*-----------------------类Dept.Dept.hbm.xml有parentId属性(数据库中有此列) ...

  4. 全面学习cookies

    来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(五) 本来想自己总结的,但是某文总结太好了(http://www.cnblogs.com ...

  5. 一个UUID生成算法的C语言实现 --- WIN32版本 .

    一个UUID生成算法的C语言实现——WIN32版本   cheungmine 2007-9-16   根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...

  6. 深入理解ClassLoader(五)—类的卸载

    原文地址:http://yhjhappy234.blog.163.com/blog/static/316328322011101413730764/?suggestedreading&wumi ...

  7. utf-8转换为ansi和修改文件名的批处理(可解决source insight中文注释乱码问题)

    source insight中文乱码有两个原因,一个是source insight的设置不正确.另外一个原因是源文件是utf-8格式的. 最近在工作中用source insight 查看jsp文件.j ...

  8. Spring中的实例生成方式及其生命周期

    三种实例化bean的方式1.使用类构造器实例化 <!-- 使用类构造器实例化,class属性表示要使用的类的全限定名 --> <bean id="userDao1" ...

  9. Python生成器与yield

    列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] >>> f ...

  10. nginx负载均衡 - session失效

    最近迷上了Nginx,真实麻雀虽小,五脏俱全..功能实在强大.. nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以 ...