转载:https://www.cnblogs.com/X-World/p/5686122.html

Java中的Null是什么?

1)首先,null是关键字,像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错。

2)就像每种基本类型都有默认值一样,如int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。就像你创建了一个布尔类型的变量,它将false作为自己的默认值,Java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你)。为了证明这个事实,你可以通过创建一个变量然后打印它的值来观察这个引用变量。

3)我们要澄清一些误解,null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型,来看下面的代码:

String str = null;
Integer i = null;
Double d = null;

String myStr = (String) null;
Integer myI = (Integer) null;
Double myD = (Double) null;
你可以看到在编译和运行时期,将null强制转换成任何引用类型都是可行的,在运行时期都不会抛出空指针异常。
4)null可以赋值给引用变量,你不能将null赋给基本类型变量,例如int、double、float、boolean。编译器将会报错。

正如你看到的那样,当你直接将null赋值给基本类型,会出现编译错误。但是如果将null赋值给包装类object,然后将object赋给各自的基本类型,编译器不会报,但是你将会在运行时期遇到空指针异常。这是Java中的自动拆箱导致的。
5) 任何含有null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。一些程序员犯这样的错误,他们认为自动装箱会将null转换成各自基本类型的默认值,例如对于int转换成0,布尔类型转换成false,但是那是不正确的,如下面所示:

Integer iAmNull = null;
int i = iAmNull; // Remember - No Compilation Error

但是当你运行上面的代码片段的时候,你会在控制台上看到主线程抛出空指针异常。在使用HashMap和Integer键值的时候会发生很多这样的错误。当你运行下面代码的时候就会出现错误。
public class Test3 {
  public static void main(String args[]) throws InterruptedException {
    Map numberAndCount = new HashMap<>();
    int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};
    for(int i : numbers){
      int count = (int) numberAndCount.get(i);//NullPointerException
      numberAndCount.put(i, count++);
    }
  }
}
package test;
import java.util.HashMap;
import java.util.Map;

public class Test3 {
  public static void main(String args[]) throws InterruptedException {
    Map numberAndCount = new HashMap<>();
    Integer[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};

    for(Integer i : numbers){
      Integer count = (Integer) numberAndCount.get(i);
      numberAndCount.put(i, count++); // NullPointerException
    }  
  }
}

这段代码看起来非常简单并且没有错误。你所做的一切是找到一个数字在数组中出现了多少次,这是Java数组中典型的寻找重复的技术。开发者首先得到以前的数值,然后再加一,最后把值放回Map里。程序员可能会以为,调用put方法时,第一种方式是转换int报空指针,验证之前说的。第二种方式,自动装箱会自己处理好拆装箱问题,但是忘记了当一个数字没有计数值的时候,get方法返回null,而不是0,因为Integer的默认值是null而不是0。当把null值传递给一个int型变量的时候自动装箱将会返回空指针异常。

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

1
2
3
4
5
6
Integer iAmNull = null;
if(iAmNull instanceof Integer){
System.out.println(“iAmNull is instance of Integer”);
}else{
System.out.println(“iAmNull is NOT an instance of Integer”);
}
  这是instanceof操作一个很重要的特性,使得对类型强制转换检查很有用

7)你可能知道不能调用非静态方法来使用一个值为null的引用类型变量。它将会抛出空指针异常,但是你可能不知道,你可以使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态绑定,不会抛出空指针异常。下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Testing {
public static void main(String args[]){
Testing myObject = null;
myObject.iAmStaticMethod();
myObject.iAmNonStaticMethod();
}

private static void iAmStaticMethod(){
System.out.println(“I am static method, can be called by null reference”);
}

private void iAmNonStaticMethod(){
System.out.println(“I am NON static method, don’t date to call me by null”);
}
8)你可以将null传递给方法使用,这时方法可以接收任何引用类型,例如public void print(Object obj)可以这样调用print(null)。从编译角度来看这是可以的,但结果完全取决于方法。Null安全的方法,如在这个例子中的print方法,不会抛出空指针异常,只是优雅的退出。如果业务逻辑允许的话,推荐使用null安全的方法。

9)你可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。在Java中null==null将返回true。

在java中对null的理解相关推荐

  1. java 类 null_深入理解java中的null“类型”

    本文研究的主要是java中的null"类型"的相关实例,具体介绍如下. 先给出一道简单的null相关的题目,引发我们对null的探讨,后面会根据官方语言手册对null"类 ...

  2. 详细了解java中的null_深入理解java中的null“类型”

    本文研究的主要是java中的null"类型"的相关实例,具体介绍如下. 先给出一道简单的null相关的题目,引发我们对null的探讨,后面会根据官方语言手册对null"类 ...

  3. Java中Map集合如何理解(四)——精简

    目录 引言 概念 Map集合实现类 HashMap LinkedHashMap TreeMap 默认排序 自定义排序方式 常用API 遍历Map集合 键找值 键值对 Lambda表达式 结束语 引言 ...

  4. java 0x01什么意思_null有哪些常见的意思?(Java中的null到底是什么意思?)

    让我们从下面的陈述开始: 1. 这句话到底是什么意思? 回想一下什么是变量,什么是值. 一个常见的比喻是变量类似于一个盒子. 就像您可以使用一个框来存储某些东西一样,您也可以使用一个变量来存储一个值. ...

  5. Java中有关Null的9件事

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  6. java 返回空数组_避免在Java中检查Null语句

    1.概述 通常,在Java代码中处理null变量.引用和集合很棘手.它们不仅难以识别,而且处理起来也很复杂.事实上,在编译时无法识别处理null的任何错误,会导致运行时NullPointerExcep ...

  7. java中的null类型---有关null的9件事

    摘自 https://blog.csdn.net/qq_25077777/article/details/80174763 今天听到一个问题,java中的null类型,null竟然是一种类型 java ...

  8. java 删除二维数组中的null_避免在Java中检查Null语句

    1.概述 通常,在Java代码中处理null变量.引用和集合很棘手.它们不仅难以识别,而且处理起来也很复杂.事实上,在编译时无法识别处理null的任何错误,会导致运行时NullPointerExcep ...

  9. JAVA 中的null

    为什么80%的码农都做不了架构师?>>>    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误. ...

最新文章

  1. Smokeping图表参数说明
  2. ASP.NET Core开发之HttpContext
  3. 关于c语言中负数位移位操作的漫谈
  4. bzoj3959(LCT)
  5. android studio sift,android - 使用SIFT / SURF通过Android Studio在Android上使用opencv进行特征提取 - 堆栈内存溢出...
  6. ReentrantReadWriteLock源码解析
  7. Android studio之如何快速查看页面的布局
  8. PostgreSQL 9.6 keepalived主从部署
  9. sql共享功能目录无法更改_大企业数据库服务首选!AliSQL这几大企业级功能你不可不知...
  10. Jsp+Ssh+Mysql实现简单的校园实习兼职管理
  11. Substance PBR Guide
  12. 【优化选址】基于matlab遗传算法求解多城市多应急物流中心选址优化问题【含Matlab源码 H001期】
  13. 数字图像处理实验之对数变换
  14. Let's encrypt 通配域名(二级, 三级)
  15. 一个值得推荐的脑图制作神器!
  16. 【1月7日】议程正式公布!年度AIoT产业盛典重磅来袭!
  17. window 开发hadoop
  18. 数据库之考勤管理系统
  19. 搭建大型分布式服务(二十五)如何将应用部署到TKE容器集群?
  20. bootstrap.yml与application.yml的区别

热门文章

  1. python实现dem输出三维模型_python DEM数据可视化
  2. 动态数组vector的使用_简单代码示例
  3. MySQL修改、删除表的结构
  4. 小猴吃桃matlab,看图写话:小猴吃桃精彩选篇
  5. Java 递归创建目录
  6. Python 小白从零开始 PyQt5 项目实战(1)安装与环境配置
  7. php测试号推送消息失败,信息发送失败是什么原因
  8. 搜索用计算机弹奏9277的数字,计算机基础知识参考试题(含答案)
  9. java导出csv文件_R语言数据导入与导出
  10. opencv roberts算子_边缘检测 Roberts算子