zoukankan      html  css  js  c++  java
  • 面试题((A)null).fun()——java中null值的强转

    面试题分享

    public class A {public static void fun1() {
            System.out.println("fun1");
        }
    
        public void fun2() {
            System.out.println("fun2");
        }
    
        public static void main(String[] args) {
            ((A) null).fun1();
            ((A) null).fun2();
        }
    }
    
    • 题目:
      以上代码是否可以编译通过?
      如可以通过,结果是什么?

    • 答案:
      代码可以编译通过,null 可以强制转为任意类型,调用其类中的静态方法不报异常,调用其类中的非静态方法会报空指针异常

    理解

    执行下面代码打印结果为 null:
            A a = (A) null;
            System.out.println(a);
    
    由于将 null 强转为 A 的对象,编译上可以通过,
    但是实际值仍然为 null,非静态方法是属于对象的方法,
    所以调用非静态方法会报空指针异常
    
    
    执行以下代码不报异常:
            A a2 = null;
            a2.fun1();
    
    
    由于 fun1 是静态方法,静态方法数随着类加载而加载的,
    所以 java 编译器在编译的过程中对我们的代码进行的了优化,
    我们通过查看 class 文件即可看出,这两行代码改变成为了下面的样式:
    
            A a2 = null;
            fun1();
    
    

    原因

    java 编译器对于 使用对象调用类中的静态方法进行了优化。对于 a2.fun1() 给优化为 fun1()

    **java 推荐使用类名直接调用静态方法 **, 从而减少了编译器的工作,提高了编译效率。

    如图:左侧为 java 源文件,右侧为编译后的 class 文件

    1.jpg

  • 相关阅读:
    windows下安装redis以及redis扩展,设置redis为windows自启服务
    Redis和Memcache的区别
    Git 简单入门使用
    ssh 连接 mac osx下 virtual box虚拟机中的 cent os 记录
    把可运行jar转换成Linux服务运行
    CentOS 7 配置FTP(vsftpd)
    团队总结
    第五周小组项目总结
    第四周小组项目总结
    第三周小组项目总结
  • 原文地址:https://www.cnblogs.com/shaofeer/p/11229146.html
Copyright © 2011-2022 走看看