欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java原始类型引用类型

程序员文章站 2022-03-25 10:34:34
...

Java原始类型引用类型

原始类型

Java原始类型有8中、分别是:bool byte char short int long float double

原始类型的函数参数传值方式是按值传递!

这个很容易理解

引用类型

引用类型函数传递参数的方式是按引用传递,在c++里面理解的话就是 (传递本身&) 这个时候! Java原始的8个数据类型分别有他们对应的引用类型封装!

根据以上的猜想、我猜测他们的函数传递参数的方式是按照 引用传值!

但是下面的一个例子颠覆了我的认知:

package cn.zhaojunchen;

public class Test {
    static void inc(int a) {
        a = a + 1;
    }

    static void inc_ref(Integer a) {
        a = a + 1;
    }

    public static void main(String[] args) {
        Integer value = -1;
        System.out.println(value);
        inc(value);
        System.out.println(value);
        inc_ref(value);
        System.out.println(value);
    }
}

// 输出:
-1
-1
-1

ok、分析一下首先对于inc(value); 这里面的传递参数应该是 Integer自动拆箱变为int、然后int a是按照值传递的方式、所以inc(value) 不会是value变化! (这个很好理解)

inc_ref(value); 则需要调试一下:结果如下

Java原始类型引用类型

步进函数:查看参数a:

Java原始类型引用类型

再次执行:

Java原始类型引用类型

Java原始类型引用类型

解释就是: 参考于此

理由很简单,可以看到 Integer 类中final的value字段(private final int value;),说明一旦integer类创建之后他的值就不能被修改,在 index++ 的时候Integer是创建一个新的类,所以这个第二次输出的时候结果是一样的!

Java泛型编程

Java泛型编程> 必须为引用类型:我理解的是数据结构(如链表)里面存储的都是对象的引用(从c的角度讲是对象的指针!)、而不是存储的原始值

Stack<Item> stack  = new Stack<Item> ()
Item 必须是引用类型!

原始类型(如int)及其对应的类型(Integer) 会存在自动装箱和自动拆箱的操作!

  Stack<Integer> stack = new Stack<Integer>();
  stack.push(12);// 自动装箱(int to Integer)
  int i = stack.pop(); // 自动拆箱(Integer to int)