请看如下代码:
package com.ibelifly.commonclass.object.equals;
public class User {
public String name;
public int age;
public User() {
}
public void show(){
System.out.println(name+" "+age);
}
public static void main(String[] args) {
User u1;
User u2=null;
User u3=new User();
u1.show();
u2.show();
u3.show();
}
}
这篇文章将介绍上述代码中,其中三句代码的区别:
User u1; //代码1
User u2=null; //代码2
User u3=new User(); //代码3
上述含义:
代码1:对象未初始化
代码2:对象为空(null)
代码3:对象的诸属性被赋默认值,引用类型默认值为null
运行结果:
代码1:语法错误,编译不通过。程序报错:可能尚未初始化变量u1
原因: u1属于局部变量,局部变量声明以后,Java 虚拟机不会自动的为它初始化为默认值。因此对于局部变量,必须先经过显示的初始化,才能使用它。
代码2:运行时异常。运行时发生NullPointerException
异常,程序停止执行。
原因: 代码2的含义为,将引用类型变量u2置空(即u2成了一个空指针),u2不指向任何对象或有效地址。对于空指针来说,它不指向任何对象,也就没有所谓的成员变量和方法,这个时候用它去调用某些属性和方法,就会出现空指针异常NullPointerException
。
代码3:运行成功并输出。输出结果有null
。
原因: 使用new关键字创建对象时,若未给对象进行初始化,JVM会给对象进行默认的初始化。引用类型默认值为null,int类型默认值为0。
总结:
- Java为了提高代码安全性,规定:
- 对于类的成员变量,不管程序有没有显示的初始化,Java 虚拟机都会先自动给它初始化为默认值。
- 局部变量声明以后,Java 虚拟机不会自动的为它初始化为默认值。因此对于局部变量,必须先经过显示的初始化,才能使用它,否则编译会报错。
- 空指针就是空引用,Java空指针异常就是引用本身为空,却调用了方法,这个时候就会出现空指针异常。
参考文章:
https://blog.csdn.net/m0_37860769/article/details/78293816
https://www.cnblogs.com/ttflove/p/6033393.html