详谈一下: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


相关文章
|
22天前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
55 9
|
27天前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
60 12
|
2月前
|
Java
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
今日分享的主题是如何区分&和&&的区别,提高自身面试的能力。主要分为以下四部分。 1、自我面试经历 2、&amp和&amp&amp的不同之处 3、&对&&的不同用回答逻辑解释 4、彩蛋
|
3月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
107 14
|
2月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
36 1
|
3月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
104 8
|
3月前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
2天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
35 14
|
5天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
34 13
|
6天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。

热门文章

最新文章