zoukankan      html  css  js  c++  java
  • java中两种类型变量

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

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

    1 List a = new ArrayList();
    2 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。

  • 相关阅读:
    DSP28335 烧写到RAM和FLASH方法
    脉冲提取
    基于飞秒光频梳的正弦相位调制干涉绝对距离测量方法研究 -张世华
    DSP28335 IO口寄存器
    DSP28335 使用技巧
    freertos、UCos这种实时操作系统和Linux、Windows这种系统的 本质区别
    stm32的定时器输入捕获 与输出比较
    五大常用算法--回溯
    Dijkstra算法
    字典树-Trie
  • 原文地址:https://www.cnblogs.com/lijia0511/p/4938837.html
Copyright © 2011-2022 走看看