• 色即是空,空即是色---java有关null的几件小事


    故事背景

    ---摩诃般若波罗蜜多心经:

    观自在菩萨,行深般若波罗蜜多时,照见五蕴皆空,度一切苦厄。舍利子,色不异空,空不异色;色即是空,空即是色。受想行识,亦复如是。舍利子,是诸法空相,不生不灭,不垢不净,不增不减。是故空中无色,无受想行识,无眼耳鼻舌身意,无色声香味触法,无眼界,乃至无意识界,无无明,亦无无明尽,乃至无老死,亦无老死尽。无苦寂灭道,无智亦无得。以无所得故,菩提萨埵。依般若波罗蜜多故,心无挂碍,无挂碍故,无有恐怖。远离颠倒梦想,究竟涅磐,三世诸佛,依般若波罗蜜多故,得阿耨多罗三藐三菩提。故知般若波罗蜜多是大神咒,是大明咒, 是无上咒,是无等等咒,能除一切苦,真实不虚。故说般若波罗蜜多咒,即说咒曰:揭谛揭谛,波罗揭谛,波罗僧揭谛,菩提娑婆诃。

    色即是空,空即是色---java有关null的几件小事

     上面的经文总是让我容易冷静下来,可是java中的null总是让我有点不知所措,下面让我们看看吧!

    java中的空null

    我们先看几段代码吧

    1.例一:null的对象性

    public class NullTest {
        public static void greet() {
            System.out.println("Hello world!");
        }
        public static void main(String[] args) {
            ((NullTest) null).greet();
        }
    }

    上面的程序看起来似乎应该抛出NullPointerExceptioin 异常,因为其main 方法

    是在常量null 上调用greet 方法,而你是不可以在null 上调用方法的,对吗?

    其实编译和运行都没有问题。运行结果为:

    Hello world!

    2.例二:null的初始化

        public static void main(String[] args) {
            String str=null;
            Integer in=null;
            Double dou=null;
            
            String str1=(String)null;
            Integer in1=(Integer)null;
            Double dou1=(Double)null;
            
            int in2=null;
            int in3=(int)null;
        }
    色即是空,空即是色---java有关null的几件小事

     

    发现null可以初始化引用类型,也可以转换为任意的引用类型。但不能给基本类型赋值,或者转换为基本类型。

    3.例三:null的相等性

        public static void main(String[] args) {
            System.out.println(null==null);
            System.out.println(null!=null);        
            System.out.println(Double.NaN==Double.NaN);
            System.out.println(Double.NaN!=Double.NaN);
        }

    结果该是什么呢?

    true

    false

    false

    true

    4.例四:null不是引用类型

        public static void main(String[] args) {
            Integer in=null;
            if(in instanceof Integer) {
                System.out.println("null is integer");
            }else {
                System.out.println("null is not integer");
            }
        }

    你猜会打印出什么?

    色即是空,空即是色---java有关null的几件小事

     

    结果是:

    null is not integer

    5.例5:不可传递

        public static void main(String[] args) {
            Integer i=null;
            int k=i;
            System.out.println(k);
        }

    报错:

    Exception in thread "main" java.lang.NullPointerException

    NullTest.main(NullTest.java:6)

    6.例6:null的数组

        public static void main(String[] args) {
            String[] arr1={"abc","123",null,"sky"};
            boolean flag=false;
            for (String s1 : arr1) {
            if(s1.equals("sky")) {
                flag=true;
                break;
            }
            }
            System.out.println(flag);
        }

    运行时报错

    Exception in thread "main" java.lang.NullPointerException

    at NullTest.main(NullTest.java:8)

    修改成:

        public static void main(String[] args) {
            String[] arr1={"abc","123",null,"sky"};
            boolean flag=false;
            for (String s1 : arr1) {
            if(s1.equals("sky")) {
                flag=true;
                break;
            }
            }
            System.out.println(flag);
        }

    就没有问题了。

    追根到底

    JSL3.10.7定义了null

    The null type has one value, the null reference, represented by the null literal null, which is formed from ASCII characters.

    JSL4.1做了补充:

    1.There is also a special null type, the type of the expression null (§3.10.7, §15.8.1), which has no name.

    Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type.

    2. The null reference is the only possible value of an expression of null type.

    3.The null reference can always be assigned or cast to any reference type (§5.2, §5.3, §5.5).

    4.In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.

    参考资料

    【1】https://baike.baidu.com/item/%E8%89%B2%E5%8D%B3%E6%98%AF%E7%A9%BA/6210?fr=aladdin

    【2】https://docs.oracle.com/javase/specs/jls/se12/html/jls-4.html#jls-4.1

    【3】https://docs.oracle.com/javase/specs/jls/se12/html/jls-3.html#jls-3.10.7

    【4】java解惑

  • 相关阅读:
    spring-boot集成8:集成shiro,jwt
    spring-boot集成6:集成redis实现字典缓存功能
    公告:《那些年,追寻Jmeter的足迹》上线
    那些年,追寻JMeter的足迹,免费送……
    Jmeter系列培训(1)--开山篇
    FlytestingToolkit工具派送,懒人的测试思考
    飞测历史分享,目录整理篇
    jenkins系列(11)-自动打tag升级篇
    大数据测试笔记(1)-测试的3条建议
    聊聊我们的线上巡检(2)
  • 原文地址:https://www.cnblogs.com/davidwang456/p/11663187.html
Copyright © 2020-2023  润新知