深入理解java中的null“类型”
作者:明明如月小角落 发布时间:2022-07-28 00:41:20
本文研究的主要是java中的null“类型”的相关实例,具体介绍如下。
先给出一道简单的null相关的题目,引发我们对null的探讨,后面会根据官方语言手册对null“类型”进行解读。
题目:下面程序能正确运行吗?
解析:
输出应该为 :haha
因为null 是可以强转为任何类类型的,所以前面((NULL)null)是合法的,但是null强转以后是无效对象,其返回值为null,(后面会作解释)
而haha方法是静态方法,静态方法使用静态绑定,不会抛出空指针异常。
如果把haha()函数变为非静态之后,将会抛出空指针异常。
再来一个例子:
这道题其实和上面是差不多的。
结果还是输出“haha”
Java Language Specification中我们可以看到
在4.1. The Kinds of Types and Values一节中提到:
There are two kinds of types in the Java programming language: primitive types (§4.2) and reference types (§4.3). ”
Type:
PrimitiveType
ReferenceType
There is also aspecial null type, the type of the expression null (§3.10.7, §15.8.1), which has no name.
Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type.
The null reference is the only possible value of an expression of null type.
The null reference can always undergo a widening reference conversion to any reference type.
In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.
我给翻译一下:
Java语言中有两种类型,一种是基本类型,还有一种是引用类型。
还有一个特殊的null类型即表达式null的类型,它没有名字。
因为null类型没有名字,所以不可能声明为null类型的变量或者转换为null类型。
null引用是null类型表达式唯一可能的值。
null引用可以转换为任意引用类型。
实际上,程序员可以忽略null类型,可以认为null仅仅是一个可以成为任何引用类型的特殊符号。
看了这个一段,就比较豁然开朗了。
在5.2. Assignment Conversion一节中:
“A value of the null type (the null reference is the only such value) may be assigned to any reference type, resulting in a null reference of that type”
一个null类型(null(空)引用是这种类型的唯一的一个值)的值,可以赋值给任意类型,将返回一个该类型对象的空引用(其实还是null)。
在5.3. Method Invocation Conversion这一节有:
“A value of the null type (the null reference is the only such value) may be converted to any reference type.”
即“null可以被转换为任何引用类型。”
通过官方的语言手册,对null类型有了非常深刻的理解。
对我们编程以及以后求职笔试面试都有一定的帮助。
最后希望大家遇到一些奇怪的问题,除了百度外,尽量多去Stack Overflow网站上去搜索,也多去查官方手册。
来源:http://blog.csdn.net/w605283073/article/details/72896651


猜你喜欢
- 1. 添加maven依赖包<dependency> <groupId>org.apache.calcit
- 引言委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就
- Maven是项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。Maven是一个项目管理工具,它包
- ajax简介 Ajax 即“Asynchronous Javascript An
- 这几天面试中有遇到关于main数组中的args数组传值的问题,一般是从命令提示符中传值,也可以直接在java代码中赋值。而且这个数组的长度是
- 前言我们之前实现了打包发布NuGet,但是发布后的引用是公有的,谁都可以访问,显然这种方式是不可取的。命令版本:10分钟学会Visual S
- 一、mybatis-plus简介:Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增
- Android中Property模块的键值设置Prop模块是保存少量的全局共享信息,其保存的数据具有信息量少,跨进程共享数据等特性;每一条信
- 背景:在平时的开发中,我们时常会遇到下列场景公司的组织架构的数据存储与展示文件夹层级的数据存储与展示评论系统中,父评论与诸多子评论的数据存储
- 本文实例讲述了Java删除二叉搜索树最大元素和最小元素的方法。分享给大家供大家参考,具体如下:在前面一篇《Java二叉搜索树遍历操作》中完成
- AlarmManager通常用来开发手机闹钟,并且它是一个全局定时器,可在指定时间或指定周期启动其他组件(包括Activity,Servic
- 一、DataTable转XML#region DataTableToXml /// &
- SpringMVC 中,文件的上传,是通过 MultipartResolver 实现的。 所以,如果要实现文件的上传,只要在 spring-
- 写在前面项目中直接引用或者直接编译源码得到的ijkplayer在播放mkv文件时出现(-10000)的错误,去项目github查看了才知道,
- 本文实例为大家分享了Java实现简易计算器的具体代码,供大家参考,具体内容如下程序的运行环境为Windows10 ,编译环境为IDEA。计算
- 在对类访问使用时,常用到的有访问类的成员、方法。实例化在对类进行访问时,需要将类进行实例化。并产生一个对象。可以使用关键字new来实现。由于
- ? 通配符类型<? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类;<? super T&
- 前言CountDownLatch和CyclicBarrier两个同为java并发编程的重要工具类,它们在诸多多线程并发或并行场景中得到了广泛
- 本文实例展示了WinForm项目开发中NPOI用法,对于C#初学者有一定的借鉴价值。具体实例如下:private void ExportMe
- 现在版本更新有两种处理方式:跳转到App应用市场,通过应用市场下载更新安装。在App内进行Apk下载,下载完成后更新安装。实现思路:请求后台