Java空对象(null)是怎么回事?
Java 语言支持两种数据类型,分别是基本数据类型和引用数据类型,而 null 是一种特殊的引用数据类型。本节主要介绍 Java 空对象是什么及如何判断对象是否为空。
经过《Java new运算符深入剖析》一节的学习,我们知道了对象的实例化就是为对象开辟内存空间。
例如以下 3 条语句(如果理解下面内容有点困难,建议先学习《Java new运算符深入剖析》一节):
为了明确表示那些仅有名字而没有内存空间的变量的具体内容,Java 引入了关键字 null。 null 表示“空”的意思,是绝对意义上的空,这个空指的是不存在。
一个引用变量(当变量指向一个对象时,这个变量就被称为引用变量)没有通过 new 分配内存空间,这个对象就是空对象,Java 使用关键字 null 表示空对象。示例代码如下:
引用变量的默认值是 null。当试图调用一个空对象的属性或方法时,会抛出空指针异常(NullPointerException),如下代码所示:
判断一个对象是否为 null,可以用
产生空对象主要有以下两种可能性:
经过《Java new运算符深入剖析》一节的学习,我们知道了对象的实例化就是为对象开辟内存空间。
例如以下 3 条语句(如果理解下面内容有点困难,建议先学习《Java new运算符深入剖析》一节):
Student stu = new Student(); // 语句1
Student stu2; // 语句2
stu2 = new Student(); // 语句3
- 语句 1 先声明一个 Student 类型的变量 stu,然后利用 new 关键字为其创建实例。一步到位,定义了一个实例变量并同时赋值。
- 语句 2 是声明一个 Student 类型的变量 stu2,虽然从表述习惯上讲 stu2 是实例变量,但实际上此时 stu2 并未成为一个真正的实例,它仅仅只是一个变量名字。
- 语句 3 中的 stu2 才成为了一个 Student 实例,它指向了内存中的某块地址空间。
为了明确表示那些仅有名字而没有内存空间的变量的具体内容,Java 引入了关键字 null。 null 表示“空”的意思,是绝对意义上的空,这个空指的是不存在。
一个引用变量(当变量指向一个对象时,这个变量就被称为引用变量)没有通过 new 分配内存空间,这个对象就是空对象,Java 使用关键字 null 表示空对象。示例代码如下:
String str1= null;
str1 = "新宝库";
引用变量的默认值是 null。当试图调用一个空对象的属性或方法时,会抛出空指针异常(NullPointerException),如下代码所示:
String str1; // 相当于 String str1= null; // 输出null字符串 System.out.println(str1); // 调用length()方法 int len = str1.length();第 5 行代码不会发生编译错误,但是当代码运行到第 5 行时,系统会抛出空指针异常。这是因为调用 length() 方法时,str1 是空对象。程序员应该避免调用空对象的属性和方法。
判断一个对象是否为 null,可以用
if (obj == null) { }
来判断。代码如下:
// 判断对象是否为null if (str1 != null) { int len = str1.length(); }如果把上面代码改成如下代码:
String str2 = ""; int num = str2.length(); System.out.println(num); // 输出结果为0运行以上代码时没有抛出异常,因为 str2 是一个值为
""
的字符串对象。""
表示的是一个长度为 0 的空字符串,它在内存中会被分配一个空间,str2 是直接指向""
内存空间的实例化对象。产生空对象主要有以下两种可能性:
- 程序员自己忘记了实例化,所以程序员必须防止这种情况发生,应该仔细检查自己的代码,为自己创建的所有对象进行实例化并初始化。
- 空对象是其它地方传递过来的,需要通过判断对象是否为 null 进行避免。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算