【Java基础总结】舍友给我带饭,请我给他讲明白Java中的引用,对象,和空指针异常~听完直呼值了,问我下顿想吃啥~

2年前 (2022) 程序员胖胖胖虎阿
162 0 0

📢博客主页:🏀九九舅舅酒酒🏀
📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!👏
📢本文由 【九九舅舅酒酒】 原创,首发于 CSDN🙉🙉🙉
📢由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!✨个人主页
📖精品专栏(不定时更新)【JavaSE】 【MySQL】【LeetCode】【Web】【操作系统】

📖精品文章(纯JavaSE实现图书管理系统<含精解注释>)


系列文章

第一篇:面向对象时,哈喽一定爱极了world吧?【史上最有爱的Java基础总结(足足六千字)】【一】

写在前面

最近再回头过来看Java基础知识,以不同的角度再去看,收获良多,特记之。

在学习过程中,我们通常纠结于要不要深入钻研,结合本人的学习过程最近再回头反省。

我觉得学习初期,还是应该在大的体系上去学习,不要卡进度,但是也不可盲目追求进度,一旦自欺欺人盲目追求速度。久而久之自己都怀疑自己了。不如脚踏实地的系统学习,打扎实基础逐步推进。只有系统学习才能学到真东西!其中尤其忌讳无论什么东西,第一遍看不懂,也不仔细钻研,便将不懂的问题逐渐搁置一旁,久而久之,积累的多了,蚁多尚能噬象,何况基础不牢呢?必然是地动山摇!

但是学习过程中也确实有些内容偏难,晦涩难懂,针对这些,我们可以大致有个印象。说到这里就不得不提一嘴,譬如有力扣刷题经验的同学,你第一次见难题,压根没头绪,没见过类似题 和 看了题解也没做出来,但是大致知道怎么做了,隔一段时间第二次再去做这个题,多多少少就有头绪了。

我们不可以去追逐偏难怪知识点和 刷题。但是有些简单中等高频率的题,和学习过程中重要的知识点,这些一定要第一次就弄懂,而后学习过程中不断巩固,加深理解。佛说三重境界,看山是山,看山不是山,看山仍是山。无论沿途有多少风景,没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。

更新本系列文章的初心,一是巩固当初年少无知,漏过的重要知识点。二是对Java重要知识点进行系统的梳理和总结,对自己负责,建立完整健全的java基础知识体系结构。三是文章可能写一些俏皮话,保持更新频率,也算是学习反思和日记了吧!~自引,复习专用!~

由于本人水平有限,只是在学小白一枚。知识的理解难免有不当之处,代码可能存在错误的地方,有任何问题欢迎评论区留言指出,感激不尽!

创作不易,烦请三连支持一下!~

Java学习之旅,我们一起学习,共同进步!~


目录

写在前面

由空指针异常,深耕引用

知识铺垫之:再谈数据类型

什么情况下会出现 NullPointerException呢?

异常原因解释

1)引用和对象的关系是什么

2)什么叫做解引用(dereference)

3)引用为 null 代表什么含义


由空指针异常,深耕引用

知识铺垫之:再谈数据类型

Java 语言是一种强类型语言。通俗点说就是:在 Java 中存储的数据都是有类型的,而且必须在编译时就确定其类型。 

我们知道Java中的数据类型分为 基本数据类型 和 引用类型

在 Java 的领域里,基本数据类型变量存的是数据本身,而引用类型变量存的是保存数据的空间地址。说白了,基本数据类型变量里存储的是直接放在抽屉里的东西,而引用数据类型变量里存储的是这个抽屉的钥匙,钥匙和抽屉一一对应。

其中引用类型

类class
Java引用类型包含的三大类 接口interface
数组array

什么情况下会出现 NullPointerException呢?

我给你了一把钥匙,但是找不到钥匙能打开的抽屉。这就是空指针异常!

看到这里,请试着自己写一个空指针异常出来!

public class Test1 {
    public void method(){
        System.out.println("Hello!");
    }

    public static void main(String[] args) {
        Test1 test1 = null;
        test1.method();
//        int[] test_array = null;
//        System.out.println(test_array.length);
    }
}
Exception in thread "main" java.lang.NullPointerException
	at com.zdx.daily.java0105.p1.Test1.main(Test1.java:19)

当引用变量(钥匙)根据引用去开具体对象(抽屉)的时候,发现抽屉根本不存在(对象为null)。这时候就出现了空指针异常!~

        int[] test_array = null;
        System.out.println(test_array.length);

试试数组这种引用类型,结果仍然是出现 NullPointerException!

再试试字符串的String 类

        String string = null;
        System.out.println(string.length());

结果仍然是出现 NullPointerException,String类属于是class类引用的一种,所以符合引用。


异常原因解释

空指针异常会发生在 对一个引用做解引用操作时,结果引用是 null,就会出现空指针异常

这里有几个概念

1)引用和对象的关系是什么

我们需要知道声明 是指为被声明的条目分配内存来存储数据

我们每使用new声明一个对象,位于内存上的JVM(java虚拟机)内有一块叫做堆(heap)的地方就会分配内存给我们所声明的对象。如果是 Person per = new Person();

所new出来的对象,会主动把地址交给他的等号左边,使其左边的引用变量对对象进行引用,

引用指向的是对象,指向可以修改。

即引用指向的是存储单元里的值。【修改:此处引用指向的应为存储单元的地址!】

【即引用变量内所存储的值是对象的地址值】

【Java基础总结】舍友给我带饭,请我给他讲明白Java中的引用,对象,和空指针异常~听完直呼值了,问我下顿想吃啥~

这里顺嘴提一句,在Java中,只要有new关键字出现new对象,就一定在JVM的堆上开辟存储单元用来存储对象!~老陈在这里保证对象一定在堆(Heap)上,但是没说引用变量一定在栈(Stack)上嗷!~所以学java就先不谈地址(虽然底层有地址)


2)什么叫做解引用(dereference)

解引用就是根据你刚才给出的存储单元的地址,去这个存储单元里找你所需要的东西!

在C/C++里,解引用的操作符是(*),在java里,解引用的操作符是(.)

比如一个字符串对象(string),是一个具体的抽屉,抽屉切实存在的,我需要从这个抽屉中拿到字符串的长度。就需要解引用!~

【Java基础总结】舍友给我带饭,请我给他讲明白Java中的引用,对象,和空指针异常~听完直呼值了,问我下顿想吃啥~

通过解引用,这个string抽屉内有这么多内容。

 【Java基础总结】舍友给我带饭,请我给他讲明白Java中的引用,对象,和空指针异常~听完直呼值了,问我下顿想吃啥~


3)引用为 null 代表什么含义

 在C/C++里面

而指针指的是地址,是门牌号,一旦门牌号里的内存(居民)搬走之后,人去楼空了,那么这个地址是没有用的。指针是变量,变量换言之就是一段内存空间的代表。

在Java里面

闲白扯一句:Java的引用是强大的,消除了野指针,消除了数百万级别的内存浪费,程序具有健壮性,当一个对象没有任何一个引用指向它的时候,他就会消亡。内存区域就会被回收。

回到我们的Java为null代表什么含义

比如说今年过年,你收了一大笔压岁钱,你妈妈告诉你说帮你把压岁钱保存起来,存在抽屉里。

并给了你一把钥匙        String 压岁钱抽屉钥匙;

但是等你需要钱了,真的需要去动这笔钱的时候,你发现,压根都没有这个抽屉哦!

哈哈哈哈哈哈艹,这下理解了吧?String 压岁钱抽屉钥匙 = null;

用上面的抽屉做解释,就是:当你真的要去抽屉里翻找压岁钱了,你却发现你手里的钥匙没有和任何抽屉做绑定!于是你(JVM)只能以空指针的形式抱怨了!~NullpointerException


由于本人水平有限,只是在学小白一枚。知识的理解难免有不当之处,代码可能存在错误的地方,有任何问题欢迎评论区留言指出,感激不尽!

创作不易,烦请三连支持一下!~

重回头系统Java学习之旅,我们一起学习,共同进步!~让我们一起向未来!


最后的最后

光阴荏苒 斗转星移,请相信
爱和希望总会比病毒蔓延得快
请相信
“一方有难,八方支援”的中国力量
请相信
凛冬散尽之时,星河定会长明
我们终将用勇敢和坚毅
照亮同一使命

山河共风雨
日月耀明天
我们同心抗疫
必将苦尽甘来,山河无恙

人间皆安,万事顺遂,长乐无忧

相关文章

暂无评论

暂无评论...