zoukankan      html  css  js  c++  java
  • java静态代码块 类加载顺序问题。

    class B extends Object { 
    static {System.out.println("Load B");}
    public B(){
    System.out.println("Create B");} }
    class A extends B {
    static {System.out.println("Load A");}
    public A(){
    System.out.println("Create A");} }
    public class Test {
    public static void main(String[] args){ A a = new A();
    } }
    这是alibaba笔试题,求输出的顺序?
    答案为Load B-->Load A-->Create B-->Create A;

    原因就是一句话:先有了父亲,才会有儿子! 程序运行时,加载AB两类,因为A是B子类,所以先加载B类,Load B,再加在A类 LoadA,
    调用A a = new A()代码时,会先调用其父类B的构造方法 Create B 再调用A的构造方法 Create A
    追问:
    先有父亲后有儿子,这句话不是只针对“构建对象”而言的吗,他也针对“类的加载”吗?我的理解是:对于构建对象的话,
    的确是应该先构建父类对象,才能构建子类对象。但对于类的加载的话
    ,不应该是看到内存中缺少了哪个类就应该加载哪个类的吗?
    追答:
    加载的时候也是一样的,当加载类A的时候,发现有父类B,就去搜索并加载B了,
    这个时候还没有加载A中那些静态块,等B加载完了之后,才会返回来加载A,
    也只有这样,程序才知道A中到底会有些什么方法,因为A中存在着由B继承而来的方法。
    如果先加载了A,那么就会出现两种情况,一种是A中没有继承而来的方法,
    另一种是加载B后再一次加载A继承而来的方法,那这样的Java就太差劲了,你说呢?


    可参考:http://blog.csdn.net/qiyeliuli/article/details/54867055(写的很好)

    java之继承中的构造方法:继承构造器调用

    http://www.cnblogs.com/Gaojiecai/p/4004782.html

    java 重载、重写、构造函数详解

    https://www.cnblogs.com/0201zcr/p/4853283.html

  • 相关阅读:
    如何修改tomcat默认端口号8080的方法
    mybatis中的一对多
    mysql中left join设置条件在on与where时的用法区别分析
    登录不会走自定义的FormAuthenticationFilter及其onLoginSuccess原因
    (六)SpringIoc之延时加载
    (五)SpringIoc之Bean的作用域
    (三)SpringIoc之初了解
    (二)Spring容器
    (一)Spring之初了解
    值传递和引用传递
  • 原文地址:https://www.cnblogs.com/beijingstruggle/p/5377880.html
Copyright © 2011-2022 走看看