• 详谈一下:Java中的基本类型变量(8种)与引用类型变量的区别


    对于Java语言中的基本类型,不知道各位老铁是否还能全能说出来!!

    Java语言中的8种基本类型:

    1. byte
    2. short
    3. int
    4. long
    5. float
    6. double
    7. char
    8. bollen

    上面8种Java语言中的基本类型,所对应的变量,就是基本类型变量!!

    下面笔者就引用(引用变量)来对大家做一下讲解:

    对于下面的代码段:

    1. int[] array1={1,2,3,4};
    2. int a=10;

    有着一下的讲解:

    其实对于上图,说白了就是:引用变量其实就是一共变量用来存放地址的!!

    下面开始言归正传:详谈一下:基本类型变量(8种)与引用类型变量的区别??

    基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值

    引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址

    1. public static void func( ) {
    2. int a=10;
    3. int b=20;
    4. int[] array=new int[]{1,2,3};
    5. }

    在上述代码中:a,b ,array都是函数内部的变量,因此,其空间都在func方法对应的栈帧中分配的!

    a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值

    array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。 

    从上图可以看到,引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该 地址,引用变量便可以去操作对象。有点类似C语言中的指针,但是Java中引用要比指针的操作更简单。

    在Java当中:局部变量在使用的时候必须初始化

    1. public static void main(String[] args) {
    2. int[] array;
    3. System.out.println(array);
    4. int a;
    5. System.out.println(a);
    6. }

    请看输入时候,IDEA编译器所给的各种警告:

     因此,对于上述两个变量:array ,a 都是局部变量,都需要进行初始化,才能正常使用!!

    简单更改一下:

    1. public static void main(String[] args) {
    2. int[] array=null;
    3. System.out.println(array);
    4. int a=0;
    5. System.out.println(a);
    6. }

    桑树代码的运行结果为:

    在array这个引用中,不指向任何对象,所以在写的时候,直接赋值给null(小写)即可

    在谈引用变量!!!

    请看下面的简单代码:

    1. public static void main(String[] args) {
    2. int[] array={1,2,3,4};
    3. array[0]=99;
    4. int[] array2=array;
    5. array2[0]=190;
    6. System.out.println(Arrays.toString(array)); // [190,2,3,4]
    7. System.out.println(Arrays.toString(array2)); // [190,2,3,4]
    8. }

    上述代码的运行结果为:

    下面笔者就上述代码,画出来图形进行简单解析一下:

     在上述代码中:

    int[] array2=array;

    array里面存放的是0x123,赋值给了array2,即array2里面存放的是:0x123!!

    其实对于这个并不难想象:你可以将上面的部分代码,想象成下列所述代码:

    1. int a=10;
    2. int b=a;

     笔者在借用一个案列进行解析一下:

    1. public static void main(String[] args) {
    2. int[] array1={1,2,3,4};
    3. int[] array2={11,22,33,44};
    4. array1=array2;
    5. array1[0]=1888;
    6. System.out.println(Arrays.toString(array1));
    7. System.out.println(Arrays.toString(array2));
    8. }

    上述代码的运行结果为:

     下面笔者就上述代码,画出来图形进行简单解析一下:

    在上述代码中:array1=array2 将array2中存储的地址赋值给array1 , 即,此时,array1也指向数组:{11,22,33,44}  再通过,array1[0]=1888,导致,array1与array2的结果为:1888,22,33,44

    在array1=array2 中,两个引用,同时指向一个对象!通过其中任何一共引用修改这个对象的值!另一个去访问的时候,也是会被改变的!

    思考一下:在下列代码中,请注意区分:array1 与 array2!!

    1. public class Main {
    2. public static void main(String[] args) {
    3. int[] array1=new int[3];
    4. array1[0]=10;
    5. array1[1]=20;
    6. array1[2]=30;
    7. int[] array2=new int[]{1,2,3,4,5};
    8. array2[0]=100;
    9. array2[1]=200;
    10. array1=array2;
    11. array1[2]=300;
    12. array1[3]=400;
    13. array2[4]=500;
    14. for (int i = 0; i < array2.length; i++) {
    15. System.out.print(array2[i]+" ");
    16. }
    17. }
    18. }

    下面笔者就上述代码进行简单分析:

    就array1而言:

     就array2而言:

    在通过array1=array2,将array2里面存储的数据赋值给array1 !!

    因此,此时:array1与array2 都指向着:

    再通过改变数值:

     因此,此时,array1与array2 都指向{100,200,300,400,500}

    讲解一下吧!!:

    1. 创建数组array1,没有给数组设置初始值,因此,每个位置都是0,
    2. 通过下标的方式将数组中的每个元素都修改为,10,20,30;
    3. 创建数组array2,并将其中的元素设置为:1,2,3,4,5;
    4. 通过下标的方式将数组中的前两个元素设置为:100,200;
    5. array1=array2,即,让array1去引用array2引用的数组空间,此时array1与array2实际上是同一个数组!
    6. 通过array1将2号和3号位置修改为300,400,此时array2也能看到数组中的修改的结果!因此array1和array2引用 的是同一个数组!
    7. 通过array2将4号位置修改为500,此时array1也能看到数组中的修改的结果!因此array1和array2引用 的是同一个数组!
    8. 通过对数组array2元素进行打印,得到100,200,300,400,500

     

  • 相关阅读:
    2023数维杯数学建模竞赛D题思路+模型+代码+论文
    教程|fNIRS数据处理工具包Homer2下载与安装
    100天精通Python(爬虫篇)——第43天:爬虫入门知识
    MongoDB权限验证开启与mongoose数据库配置
    基于NXP iMX8测试Secure Boot功能部署
    聚观早报 |英伟达发布H200;夸克发布自研大模型
    Unity3D 基础——使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果
    二十三种设计模式:解密职责链模式-购物优惠活动的设计艺术
    QT制作带有界面的静态库,并且调用时的一个大坑:可以获取窗口指针,但是show()时直接崩溃。。。。
    【无标题】
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/127712096