基于java中的null类型---有关null的9件事

目录
  • 关于null的9件事
    • 1、首先,null是java中的关键字,像public、static、final
    • 2、就像每种原始类型都有默认值一样
    • 3、要澄清一些误解
    • 4、null可以赋值给引用变量
    • 5、任何含有null值的包装类
    • 6、如果使用了带有null值的引用类型的变量,instanceof操作会返回false
    • 7、可以使用静态方法来使用一个值为null的引用类型变量
    • 8、可以将null传递给方法使用
    • 9、可以使用== 或者 != 操作来比较null值
  • Java: null是什么??
    • null是什么?
    • 1、对于null的理解
    • 2、null的作用
    • 3、使用null时要注意的问题

今天听到一个问题,java中的null类型,null竟然是一种类型

java语言中有两种类型,一种是基本类型,还有一种是引用类型。还有一个特殊的null类型即表达式null的类型,它没有名字。

因为null类型没有名字,所以不可能声明为null类型的变量或者转换为null类型。

null引用是null类型表达式唯一可能的值。

null引用可以转换为任意引用类型。

实际上,程序员可以忽略null类型,可以认为null仅仅是一个可以称为任何引用类型的特殊符号。

一个null类型(null(空)引用是这种类型的唯一的一个值),可以赋值给任意类型,将返回一个该类型对象的空引用(其实还是null)。

对于java程序员来说,null是令人头痛的东西。时常会受到空指针异常的骚扰。所以要好好了解一下null,确保正确使用null。

关于null的9件事

1、首先,null是java中的关键字,像public、static、final

它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别他们然后报错。

现在,当你在敲代码的时候,IDE可以纠正这个错误。

2、就像每种原始类型都有默认值一样

int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。就像你创建了一个布尔类型的变量,它将false作为自己的默认值,java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你)。

这对静态和非静态的object来说都是正确的。就像你在这里看到的这样,myObj定义为静态引用,所以可以在主方法里直接使用它。注意:主方法是静态方法,不可使用非静态变量。

3、要澄清一些误解

null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型,

可以看到idea并没有报错,可以正常编译。在编译和运行时期,将null强制转换成任何引用类型都是可行的,在运行时期都不会抛出空指针异常。

4、null可以赋值给引用变量

不能将null赋值给基本类型变量,如int、double、float、boolean。

可以看到,直接将null赋值给基本类型会出现编译错误。但将null赋值给包装类object,然后将object赋给各自的基本类型,编译不会报错,但运行会空指针,这是自动拆箱导致的。

5、任何含有null值的包装类

在java拆箱生成基本数据类型时候都会抛出一个空指针异常。

这段代码看起来非常简单并且没有错误。你所做的一切是找到一个数字在数组中出现了多少次, 这是Java数组中典型的寻找重复的技术。

开发者首先得到以前的数值,然后再加一,最后把值放回Map里。程序员可能会以为,调用put方法时,自动装箱会自己处理好将int装箱成Interger,但是他忘记了当一个数字没有计数值的时候,HashMap的get()方法将会返回null,而不是0,因为Integer的默认值是null而不是0。

当把null值传递给一个int型变量的时候自动装箱将会返回空指针异常。设想一下,如果这段代码在一个if嵌套里,没有在测试环境下运行,但是你一旦放在生产环境里,BOOM:-),是不是美兹兹。

6、如果使用了带有null值的引用类型的变量,instanceof操作会返回false

这是instanceof操作一个很重要的特性,使得对强制类型转换检查很有用

7、可以使用静态方法来使用一个值为null的引用类型变量

因为静态方法使用静态类型绑定,不会抛空指针异常

8、可以将null传递给方法使用

这时方法可以接收任何引用类型,如 public void print(Object obj) 可以这样调用print(null).编译可以通过,但结果就取决去你的方法了。这个例子中的print方法,不会抛出空指针异常,只是退出,业务逻辑允许的话,推荐使用null安全的方法。

9、可以使用== 或者 != 操作来比较null值

但是不能使用其他算法或者逻辑操作,如大于、小于。与SQL不同,java中的null==null会返回true;

避免空指针异常可以使你的代码变的null安全。

敲黑板,划重点!!!!——————>null是任何一个引用类型变量的默认值,在java中不能使用null引用来调用任何instance方法或者instance变量。

Java: null是什么??

null是什么?

对于一条实例化语句:

Student stu=new Student();    //语句1

先是声明一个名为stu的Student类型变量,然后利用new关键字为其创建实例。

与下面的语句相比较:

Student stu;                            //语句2

语句2是声明一个类型为Student 的变量stu,从表述习惯上讲stu 是实例变量,但实际上此时stu并未成为一个真正的实例,它仅仅只是一个变量名字。

stu= new Student();                //语句3

语句3的执行结果就使得stu真正成为了一个Student实例,它指向了内存中的某块地址空间。

语句1是一步到位,定义了一个实例变量并同时赋值。

1、对于null的理解

为了明确地表示那些仅有名字而没有实例空间的变量的具体内容,Java引入了关键字null, null 就是表示“空”的意思,是绝对意义上的空,这个空指的是不存在的意思。为了更好地理解null是什么,这里举个例子:

有个准备进人施工阶段的楼字建筑项目,设计图纸已经确定了,建筑设计师们正在讨论某间单元的装修效果时,该单元的房号已经命名,假设为A901,此时,A901就是null的,它相当于上面写的语句2(一个名为stu的Student),这里它只是一个名为A901的房屋单元。

而当该楼字项目已经施工完毕的时候,则A901就地在它所处的位置上真正地占有了一块物理空间,此时它就是非null(非空)了,也就是说它拥有了一块实例化的空间。就算这间房屋里头没有摆放东西,它也是存在的。我们千万不能将日常表达语“一间空的房问”等同于Java语言中的"房间为空”。

在Java中,假设房间类为Room,则:

Room room=null; //房间为空,房间room只是一个名字,实际不存在。
Room room= new Room(); //一间空的房间,这间房里没东西。 

null就是空,抽象意义上的空,空就是无的概念。

对于null的理解,应该是这样的:仅有一个变量名,但实际上不存在。

2、null的作用

(1) 判断一个对象实例是否null,

用if(obj= = null){}来判断。

(2) 释放内存,让一个非null的实例变量赋值为null,这样这个实例指针引用就被释放了,等待JVM回收其对应的内存垃圾。

3、使用null时要注意的问题

(1) null是关键字,是大小写敏感的,不能将null写成Null或NULL.

(2) null用来标识一个空的对象,因此不能将null赋给基本型的变量。比如:

String s= null; //正确
int i=null; //错误,应修正为"int i=0;"char c= null; //错误

(3) 对于一个值为null 的对象,如果你试图去访问其成员,则会触发空指针异常(NullPointerException)。

(4) 用instancaeof(判断对象是否属于某种类型)去操作null对象,会返回false.

如:有语句: String s= null;

则“s instanceof String”的结果是false。

(5) 可以使==或着!=操作来比较null值,但是不能使用其他算法或者逻辑操作,例如<或者>。

在Java中,null ==null将返回true。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java不要再使用!=null判空了!

    前言 对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误. 那么,有什么办法可以避免在代码中写大量的判空语句呢? 有人说可以使用 JDK8提供的 Optional 来避免判空,但是用起来还是有些麻烦. 作者在日常工作中,封装了一个工具,可以可以链式调用对象成员而无需判空,相比原有的if null逻辑 和 JDK8提供的 Optional 更加优雅易用,在工程实践中大大提高了编码效率,也让代码更加的精准和优雅. 不优

  • Java 中的 xx ≠ null 是什么新语法

    奇怪的不等于(≠) 最近,栈长用 IntelliJ IDEA 看源码时发现: 咦-这是什么鬼? Java 不等于的写法不是一直都是 != 么?什么时候可以写 ≠ 了?? 不科学啊- 以为我是老花眼了,认真看了几遍,觉得应该是 IDEA 的特效吧,然后去点那个符号,发现也还原不了原样... 然后互联网网冲浪了一翻,终于被我找到了这个开关: Preferences > Editor > Reader Mode > Font ligatures Reader Mode: 用于只读模式的编辑器设

  • 在Java中避免NullPointerException的解决方案

    我object != null要避免很多NullPointerException. 有什么替代方法: if (someobject != null) { someobject.doCalc(); } 解决方案: 在我看来,这似乎是一个相当普遍的问题,初级和中级开发人员往往会在某个时候遇到这些问题:他们要么不知道,要么不信任他们所参与的合同,并且防御性地检查了null.另外,在编写自己的代码时,他们倾向于依靠返回空值来表示某些内容,因此要求调用者检查空值. 换句话说,在两种情况下会出现空检查: 如

  • Java split函数拆分后变成null问题解决方案

    对于一些特殊的情况,split拆分后并没有保留全的元素 如下例子: String x ="a,,,,,,"; String []y = x.split(","); for(int i=0;i<y.length;i++){ System.out.println(y[i]); } 输出结果: 只拆分得到了第一个字母,后面默认的空字符串并没有保留. 后来想到了使用StringUtils函数,查了一下,修改为如下: String x ="a,,,,,,&qu

  • 解决JAVA8 Collectors.toMap value为null报错的问题

    2018年11月7日 17:59:27 该bug貌似在java9中修复,欢迎补充 2019年3月19日 17:59:11 查看java11的toMap方法后,发现并没有修改任何实现 Caused by: java.lang.NullPointerException java.util.HashMap.merge(HashMap.java:1224) java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320) java.uti

  • 详解java中String值为空字符串与null的判断方法

    Java空字符串与null的区别 1.类型 null表示的是一个对象的值,而不是一个字符串.例如声明一个对象的引用,String a=null. ""表示的是一个空字符串,也就是说它的长度为0.例如声明一个字符串String s="". 2.内存分配 String a=null:表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间. String s="":表示声明一个字符串类型的引用,其值为""空

  • Java中HashMap里面key为null存放到哪

    我们知道HashMap集合是允许存放null值的 hashMap是根据key的hashCode来寻找存放位置的,那当key为null时, 怎么存储呢? 在put方法里头,其实第一行就处理了key=null的情况. // HashMap的put方法 public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) // key为null调用putForNull

  • 基于java中的null类型---有关null的9件事

    目录 关于null的9件事 1.首先,null是java中的关键字,像public.static.final 2.就像每种原始类型都有默认值一样 3.要澄清一些误解 4.null可以赋值给引用变量 5.任何含有null值的包装类 6.如果使用了带有null值的引用类型的变量,instanceof操作会返回false 7.可以使用静态方法来使用一个值为null的引用类型变量 8.可以将null传递给方法使用 9.可以使用== 或者 != 操作来比较null值 Java: null是什么?? nul

  • 基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把一个长度为4的byte数组转换为int类型.下面有两种方式. public static byte[] int2byte(int res) { byte[] targets = new byte[4]; targets[0] = (byte) (res & 0xf

  • 基于Java中的数值和集合详解

    数组array和集合的区别: (1) 数值是大小固定的,同一数组只能存放一样的数据. (2) java集合可以存放不固定的一组数据 (3) 若程序事不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用 数组转换为集合: Arrays.asList(数组) 示例: int[] arr = {1,3,4,6,6}; Arrays.asList(arr); for(int i=0;i<arr.length;i++){ System.out.println(arr[

  • 基于java中两个对象属性的比较

    两个对象进行比较相等,有两种做法: 1.情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可.这里就不用说明 2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用类反射, 具体代码如下: public static void main(String[] args) { A a = new A(); a.setUserName("a"); a.setPassword("p"); a.setQq("q"); a.

  • 基于java中集合的概念(详解)

    1.集合是储存对象的,长度可变,可以封装不同的对象 2.迭代器: 其实就是取出元素的方式(只能判断,取出,移除,无法增加) 就是把取出方式定义在集合内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类. 二每一个容器的数据结构不同,所以取出的动作细节也不一样.但是都有共性内容判断和取出,那么可以将共性提取,这些内部类都符合一个规则Iterator Iterator it = list.iterator(); while(it.hasNext()){ System.out

  • 基于Java中最常用的集合类框架之HashMap(详解)

    一.HashMap的概述 HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构. HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是对的映射,允许多个null值和一个null键.但此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 除了HashMap是非同步以及允许使用null外,HashMap 类与 Hashtable大致相同. 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性

  • java中的Reference类型用法说明

    本文简要总结java中的Reference类型. 最近在研读jdk并发框架,其中AQS是重点,由于我打破砂锅问到底的轻微强迫症,google了AQS作者Doug Lea的论文原文[The java.util.concurrent Synchronizer Framework],有兴趣的同学可以自行下载.其中谈到设计同步框架的核心是选择一个严格意义上的FIFO队列,作为阻塞线程队列并对其进行维护. 对此主要由两种选择,一个是MCS锁,另一个时CLH锁.因为CLH锁比MCS对取消和超时的处理更方便,

  • Java 中的变量类型

    目录 1.局部变量 2.成员变量(实例变量) 3.类变量 1.局部变量 在方法或语句块中定义的变量被称为局部变量.变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁. 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方法.或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁: 访问修饰符不能用于局部变量: 局部变量只在声明它的方法.构造方法或者语句块中可见: 局部变量是在栈上分配的. 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用. 2.成员

  • 深入理解Java中的字符串类型

    1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和wstring类实现与C语言兼容和Unicode标准.Java内部通过String类实现对字符串类型的支持.这意味着:我们可以直接对字符串常量调用和String对象同样的方法: //可以再"abc"上直接调用String对象的所有方法 int length="abc".l

随机推荐