为什么 equals 方法需要常量在前,关于 null 的一点思考

文章目录

        • null 的使用
        • equals 和 空指针异常
        • null 和静态方法

null 的使用

null 是引用变量的默认值,就和 boolean 的默认值是 false,int 的默认值是 0,所以包装类 Boolean 和 Integer 等默认值也都是 null,而不是和基本类型相同。

public class NullTest {
    Boolean test;
    @Test
    public void test() {
    // 局部变量需要要初始化否则无法通过编译
    	String str = null;
        System.out.println(test);// null
        System.out.println(str);// null
    }
}

tips: 在 Java 中 null == null 是成立的,所以我们在判断对象是否为空的时候经常会使用 != null,但是不能使用其他的操作。

equals 和 空指针异常

String str = null;
if (str.equals("hhh")) {// 空指针异常
    System.out.println(str);
}

上面这段代码可以很明显看出来在执行 equals 判断的时候会抛出空指针异常,原因就是因为 str = null,所以在执行 equals 方法的时候就找不到相关的类,无法执行方法自然就会报错了。

但是这么说还是不够清晰,因为我已经定义了 String str = null,那很明显应该去调用 String 的方法啊,事实上并不是所想的那样,最简单的一个方法就是利用 str instanceof String 判断 str 是否是属于 String 类型,结果返回就是 false。(instanceof 用来判断变量运行期是否是后者的实例)

String str = null;
if (str instanceof String && str.equals("hhh")) {
    System.out.println(str);
} else {
	System.out.println("null");// null
}

null 和静态方法

public class NullTest {
    @Test
    public void testEquals() {
        NullDemo test = null;
        test.test2();	// test2
        test.test1();	// 空指针异常
    }
}
class NullDemo {
    public void test1(){
        System.out.println("test1");
    }
    public static void test2(){
        System.out.println("test2");
    }
}

由于静态方法是静态绑定,也就是说在编译时就已经方法和类绑定。而相对应的动态绑定则是在运行时根据具体对象的类型进行绑定。当然实际开发过程中我们也不会这么使用 test.test2()

知其然,知其所以然,CRUD 的枯燥工作中多动动脑子思考一些理所当然的问题,也能得到成长,这些应该才是在工作中积累下的宝贵经验吧。

你可能感兴趣的:(java基础)