前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【趣学程序】​一道面试题分享

【趣学程序】​一道面试题分享

作者头像
趣学程序-shaofeer
发布2019-07-27 18:29:02
2260
发布2019-07-27 18:29:02
举报
文章被收录于专栏:upuptop的专栏

面试题分享

代码语言:javascript
复制
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可以强制转为任意类型,调用其类中的静态方法不报异常,调用其类中的非静态方法会报空指针异常

理解

代码语言:javascript
复制
执行下面代码打印结果为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文件

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣学程序 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 面试题分享
  • 理解
    • 原因
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档