Java面试的一道static相关问题

static对于我们来说并不陌生,代码中随处可见。但说要掌握这个关键字还真谈不上。前段时间遇到了static相关的问题,然后最近在看《Head First Java》一书,对这个关键字又有了进一步的理解,现将其总结一下分享给大家。

先上题:

public class Parent {
    static{
        System.out.println("1");
    }
    public Parent(){
        System.out.println("2");
    }
}
public class Son extends Parent{
    static{
        System.out.println("3");
    }
    public Son(){
        System.out.println("4");
    }

    public static void main(String[] args) {
        System.out.println("5");
        Parent son = new Son();
    }

}

问程序运行后输出是多少?

该问题考察了继承和静态代码块等相关问题。我们先来看看当执行主函数发生了什么

程序运行的第一步先将类加载到方法区。我们用到的类有Son和Parent。那么先加载谁呢?当然是先有爸爸后有儿子,所以先加载Parent,加载同时执行静态代码执行输出“1”。然后加载Son,同时执行静态代码块输出“3”。

当类和常量方法都加载到方法区的时候,我们的准备工作也就做完了,接下来可以一步一步执行代码了。

接下来会输出“5”。

然后就是new一个新的Son实例给son引用(实际执行的动作是先创建Parent类型的引用,然后在堆中创建新的对象,最后将引用指向对象)。同样,在构造Son实例的时候需要先构造父类(试想如果子类用到了父类的属性或方法,此时如果父类没被创建出来,那么子类将无所适从)。所以先执行Parent的构造函数,输出“2”,再执行自身的构造函数,输出“4”。

总结:

至此,该题的结果已经出来了,输出是:“1” “3” “5” “2” “4”。

static方法块会在类加载到方法区期间执行

在new一个新对象的时候,可以理解为先创建父类再将子类包裹在父类上

顺便提一句,最后的那个Parent son = new Son() 前面的Parent换成Son结果也是一样的,它只是告诉JVM, son这个变量是个Parent(Parent结构此前已经塞进方法区了所以JVM知道它是什么),所以对构造的顺序上是没有影响的。,不要被误导。

以上是我对这道题的理解,如有错误还请多多指正。

接下来,还会继续分享一些有关static的用法以及static与final的组合用法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值