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

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

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


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


byte

short

int

long

float

double

char

bollen

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


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


对于下面的代码段:


   

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

有着一下的讲解:


0a2653c851af460fa595bd959398a8f1.png


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


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


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


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


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

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


2d65d23f6d4748949b924e4057485923.png


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编译器所给的各种警告:


6de278e6d6694ce5bb08e7e842b7e74b.png


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


简单更改一下:


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

桑树代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


在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]
    }

上述代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


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


2d65d23f6d4748949b924e4057485923.png


在上述代码中:


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));
    }

上述代码的运行结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


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


12c3b7f3f8814309a195c64f051d4445.png


在上述代码中: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而言:


34e8d716411043c08c7ffba9fbba23de.png


就array2而言:


92ba0822ed0b46e1ae72df8a17d3a45b.png


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


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


再通过改变数值:


d79b274929334152a6d38be91e2d1be3.png


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

dfc80ca9d8004e6c9ddc00e8448ffc6a.png

讲解一下吧!!:

f91d8a108d0c413eb930b624a9967d37.png

创建数组array1,没有给数组设置初始值,因此,每个位置都是0,

通过下标的方式将数组中的每个元素都修改为,10,20,30;

创建数组array2,并将其中的元素设置为:1,2,3,4,5;

通过下标的方式将数组中的前两个元素设置为:100,200;

array1=array2,即,让array1去引用array2引用的数组空间,此时array1与array2实际上是同一个数组!

通过array1将2号和3号位置修改为300,400,此时array2也能看到数组中的修改的结果!因此array1和array2引用 的是同一个数组!

通过array2将4号位置修改为500,此时array1也能看到数组中的修改的结果!因此array1和array2引用 的是同一个数组!

通过对数组array2元素进行打印,得到100,200,300,400,500


相关文章
|
5月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
981 1
|
6月前
|
Java 测试技术
Java浮点类型详解:使用与区别
Java中的浮点类型主要包括float和double,它们在内存占用、精度范围和使用场景上有显著差异。float占用4字节,提供约6-7位有效数字;double占用8字节,提供约15-16位有效数字。float适合内存敏感或精度要求不高的场景,而double精度更高,是Java默认的浮点类型,推荐在大多数情况下使用。两者都存在精度限制,不能用于需要精确计算的金融领域。比较浮点数时应使用误差范围或BigDecimal类。科学计算和工程计算通常使用double,而金融计算应使用BigDecimal。
2596 102
|
7月前
|
存储 缓存 人工智能
Java int和Integer的区别
本文介绍了Java中int与Integer的区别及==与equals的比较机制。Integer是int的包装类,支持null值。使用==比较时,int直接比较数值,而Integer比较对象地址;在-128至127范围内的Integer值可缓存,超出该范围或使用new创建时则返回不同对象。equals方法则始终比较实际数值。
265 0
|
7月前
|
安全 算法 Java
Java 中 synchronized 与 AtomicInteger 的区别
在Java多线程编程中,`synchronized`和`AtomicInteger`均用于实现线程安全,但原理与适用场景不同。`synchronized`是基于对象锁的同步机制,适用于复杂逻辑和多变量同步,如银行转账;而`AtomicInteger`采用CAS算法,适合单一变量的原子操作,例如计数器更新。二者各有优劣,应根据具体需求选择使用。
224 0
|
8月前
|
算法 Java 数据库连接
Java 与 C++ 区别深入剖析及应用实例详解
本文深入剖析了Java和C++两种编程语言的区别,从编译与执行机制、面向对象特性、数据类型与变量、内存管理、异常处理等方面进行对比,并结合游戏开发、企业级应用开发、操作系统与嵌入式开发等实际场景分析其特点。Java以跨平台性强、自动内存管理著称,适合企业级应用;C++则因高性能和对硬件的直接访问能力,在游戏引擎和嵌入式系统中占据优势。开发者可根据项目需求选择合适语言,提升开发效率与软件质量。附面试资料链接:[点此获取](https://pan.quark.cn/s/4459235fee85)。
755 0
|
8月前
|
存储 Java C语言
Java List 复制:浅拷贝与深拷贝方法及区别
我是小假 期待与你的下一次相遇 ~
848 1
|
9月前
|
Java
Java 中 Exception 和 Error 的区别
在 Java 中,`Exception` 和 `Error` 都是 `Throwable` 的子类,用于表示程序运行时的异常情况。`Exception` 表示可被捕获和处理的异常,分为受检异常(Checked)和非受检异常(Unchecked),通常用于程序级别的错误处理。而 `Error` 表示严重的系统级问题,如内存不足或 JVM 错误,一般不建议捕获和处理。编写程序时应重点关注 `Exception` 的处理,确保程序稳定性。
305 0
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
266 1
|
4月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
280 1
|
5月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案