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

2023-10-27

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

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

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

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

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

对于下面的代码段:

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

有着一下的讲解:

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

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

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

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

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

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

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

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

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

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

    public static void main(String[] args) {
        int[] array;
        System.out.println(array);
        int a;
        System.out.println(a);
    }

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

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

简单更改一下:

    public static void main(String[] args) {
        int[] array=null;
        System.out.println(array);
        int a=0;
        System.out.println(a);
    }

桑树代码的运行结果为:

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

在谈引用变量!!!

请看下面的简单代码:

   public static void main(String[] args) {
        int[] array={1,2,3,4};
        array[0]=99;

        int[] array2=array;

        array2[0]=190;

        System.out.println(Arrays.toString(array));   // [190,2,3,4]
        System.out.println(Arrays.toString(array2));  // [190,2,3,4]
    }

上述代码的运行结果为:

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

 在上述代码中:

int[] array2=array;

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

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

        int a=10;
        int b=a;

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

    public static void main(String[] args) {
        int[] array1={1,2,3,4};
        int[] array2={11,22,33,44};

        array1=array2;

        array1[0]=1888;

        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
    }

上述代码的运行结果为:

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

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

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

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

public class Main {
    public static void main(String[] args) {
        int[] array1=new int[3];
        array1[0]=10;
        array1[1]=20;
        array1[2]=30;

        int[] array2=new int[]{1,2,3,4,5};
        array2[0]=100;
        array2[1]=200;

        array1=array2;

        array1[2]=300;
        array1[3]=400;

        array2[4]=500;

        for (int i = 0; i < array2.length; i++) {
            System.out.print(array2[i]+" ");
        }
    }
}

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

就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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 链表随机指针

    我卡住的一个原因是 我曾想便利两次 想在第二遍的同时把两个链表分离开 结果失败了 必须三遍 以为random指针很可能指到前面已经断开的节点 而这个还是不用哈希的方式 因此如果前面的链表断开了 就都乱套了 Definition for a
  • Android Studio模拟器启动后不停闪烁(已玄学解决)

    问题描述 Android Studio模拟器启动后不停闪烁 解决方法 右侧点击Device Manager打开设备管理 点击修改标志 将Graphics 图样 换成Software 软件 点击Finish 这个方法是网上找的 但是不好使TA
  • Linux命令 - cp命令

    Linux命令 cp命令 cp 是copy的缩写 Linux中 cp命令用来复制文件或者目录 一般情况下 shell会设置一个别名 在命令行下复制文件时 如果目标文件已经存在 就会询问是否覆盖 不管你是否使用 i参数 但是如果是在shell
  • python图像差分法目标检测_运动目标检测(4)—背景差分法

    背景减法利用图像序列中的当前帧和事先确定的背景参考模型间的差异比较 来确定运动物体位置 是一种基于统计学原理的运动目标检测的方法 这种方法的性能取决于背景建模技术 Gloyer等人使用单高斯模型的思路 但常常不能准确地描述背景模型 1999
  • Android调用系统发送短信界面

    很多软件都有分享的功能 不少是支持短信分享的 其实就是调用系统发送短信的Activity 代码实现非常简单 发送短信 param smsBody private void sendSMS String smsBody Uri smsToUr
  • Elasticsearch基本概念及CRUD常用操作

    Elasticsearch基本概念及CRUD常用操作 一 介绍 二 REST 风格 三 索引CRUD 3 1 创建索引 3 2 查询索引 3 3 删除索引 四 文档CRUD 4 1 添加文档 4 1 1 普通添加 随机ID 4 1 2 普通
  • Mybatis学习笔记-Mabatis缓存

    Mybatis学习笔记 Mybatis缓存 缓存就是内存中的数据 常常来自对数据库查询结果的保存 使用缓存 我们可以避免频繁的与数据库进行交互 进而提高响应速度 MyBatis提供了对缓存的支持 分为一级缓存和二级缓存 可以通过一下图解来理
  • 解决github访问不了的方法

    1 打开网站http tool chinaz com dns 在A类型的查询中输入 github com 找到最快访问的ip地址 并复制下来 2 修改系统文件的hosts文件 进入C Windows System32 drivers etc
  • 董事聘任书

    EX 10 38 4 future s1a3 ex1038 htm DIRECTOR OFFER LETTER Exhibit 10 38 The Future Education Group Inc Room 501 Gaohelanfe
  • 前端实习面试题(自己当笔记用)

    一 CSS 01 Flex布局 display flex 在父元素设置 子元素受弹性盒影响 默认排成一行 如果超出一行 按比例压缩 容器属性 1 flex direction属性 取值 row 默认 row reverse column c
  • pycharm导入未安装的第三方库,无错误提示,急需

    pycharm导入未安装的第三方库 无错误提示 急需 如下图所示 第三方库pandas未安装 但是pycharm没有错误 如下图所示 第三方库pandas未安装 但是pycharm没有错误 pandas 并未i安装 pandas下面不是应该
  • Python基础第二话:列表+元组+字典+集合,学基础还得是这....

    Python基础知识第二话 Python基础知识第一话 这一章的知识紧接上一章 零基础的小伙伴可以从上 一章学起来 当然 你也可以收藏起来慢慢学习 学习是不可操之过急的啦 列表 Python学习交流Q群 906715085 print 创建
  • Gradle 详解

    原文地址 深入理解Android 一 Gradle详解 InfoQ 备用地址 Gradle史上最详细解析 AndroidM 博客园 以下内容为复制 粘贴 建议看原文 编者按 随着移动设备硬件能力的提升 Android 系统开放的特质开始显现
  • vue三种方式实现父子间通信

    当前有子组件Student和父组件App 如何让Student发送自己的学生名 App接收并显示 有三种方法 父传子 props
  • mysql 存储过程如何声明多个变量赋值_mysql存储过程:定义变量,赋值,判断,输出...

    1 定义变量 赋值 判断 输出 DROP PROCEDURE IF EXISTS proc first 如果proc first存在就删除 create procedure proc first 创建存储过程 begin 定义变量 DECL
  • Sql_Server中如何判断表中某列是否存在

    判断表AA中是否存在AA ID这一列 如果不存在 则新增 IF NOT EXISTS SELECT 1 FROM syscolumns INNER JOIN sysobjects ON sysobjects id syscolumns id
  • C++环形缓冲区

    环形缓冲区 ring buffer 也称作循环缓冲区 cyclic buffer 圆形队列 circular queue 圆形缓冲区 circular buffer 环形缓冲区并不是指物理意义上的一个首尾相连成 环 的缓冲区 而是逻辑意义上
  • 一文教你搞懂Go中栈操作

    LInux 进程在内存布局 多任务操作系统中的每个进程都在自己的内存沙盒中运行 在 32 位模式下 它总是 4GB 内存地址空间 内存分配是分配虚拟内存给进程 当进程真正访问某一虚拟内存地址时 操作系统通过触发缺页中断 在物理内存上分配一段
  • 开源进展

    作为一个友好的 功能丰富的区块链中间件平台 WeBASE一直致力于降低区块链开发者的研发门槛 提高区块链开发效率 如今 WeBASE v1 5 4来了 此次更新新增区块链应用实训课程案例集 以及管理台操作指引与设计说明 助力社区开发者更快捷
  • 详谈一下:Java中的基本类型变量(8种)与引用类型变量的区别

    对于Java语言中的基本类型 不知道各位老铁是否还能全能说出来 Java语言中的8种基本类型 byte short int long float double char bollen 上面8种Java语言中的基本类型 所对应的变量 就是基本