`
edr_
  • 浏览: 166200 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于类的加载顺序

    博客分类:
  • J2SE
阅读更多
关于类的加载顺序
最近瞎搞数据结构跟算法,今天把笔记上的这道题顺便理解理解。这是上周在广州阿里的一道笔试题,百度了一下发现很多人上传了代码,也做了一些总结,而我只是做一下笔记,以后回头可以看看复习;
package test.static_;
public class StaticTest {
    
    public static int k = 0;
    public static StaticTest t1 = new StaticTest("t1");
    public static StaticTest t2 = new StaticTest("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j = print("j");
     
    {
        print("构造块");
    }
    
    static{
        print("静态块");
    }
     
    public StaticTest(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
        ++n;
        ++i;
    }
     
    public static int print(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
        ++i;
        return ++n;
    }
    public static void main(String[] args) {
        StaticTest t = new StaticTest("init");
    }
}
结果:
1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102

先说说这道题结果的流程:
1.加载类的静态属性
  这里加载的是:public static int k = 0;
  然后加载:public static StaticTest t1 = new StaticTest("t1");
  因为此处进行了类的实例化所以
  1.1加载类的非静态属性;
  这里是:public int j = print("j"); 输出---1:j i=0 n=0 
  1.2顺序加载类中的非static代码块(构造块)
  这里是:print("构造快");            输出---2:构造块 i=1 n=1 
  1.3加载类的构造方法
  这里是:public StaticTest(String str) 输出---3:t1 i=2 n=2
  1.4重复第二个属性加载;
  输出---
   4:j i=3 n=3
   5:构造块 i=4 n=4
   6:t2 i=5 n=5
 
2.继续加载类的静态属性
  这里加载的是:public static int i = print("i");输出---7:i i=6 n=6
3.继续加载类的静态属性
  这里加载的是:public static int n = 99;
4.加载static代码块
  这里加载的是:static{ print("静态块");}输出---8:静态块 i=7 n=99
5.主函数main方法加载
  这里加载的是:StaticTest t = new StaticTest("init");
输出---9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102

结束---------

类的加载顺序(其实理解上面那道题就基本了解了类的加载顺序):
1.加载静态成员/静态代码块(同一个类里的静态成员/代码块,按写代码的顺序加载):
先递归地加载父类的静态成员/代码块(Object的最先);再依次加载到本类的静态成员。
如果其间调用静态方法,则调用时会先运行静态方法,再继续加载。同一个类里调用静态方法时,可以不理会写代码的顺序。
2.加载非静态成员/非静态代码块:(实例块在创建对象时才会被加载,同一个类里的非静态成员/代码块,按写代码的顺序加载)
先递归地加载父类的非静态成员/非静态代码块(Object的最先);再依次加载到本类的非静态成员。同一个类里调用方法时,可以不理会写代码的顺序。
但调用属性时,必须注意加载顺序。一般编译不通过,如果能在加载前调用,值为默认初始值(如:null 或者 0)。
3.调用构造方法:
先递归地调用父类的构造方法(Object的最先)也就是上溯下行;默认调用父类空参的,也可在第一行写明调用父类某个带参的。再依次到本类的构造方法;
------------------------------------------分割线-----------------------------------------------
PS:“天兔”登陆当天,下午中途翘课赶紧跑大学城,到了华工已经快六点,本来通知是六点开考,但是由于临时试卷不够,被迫等到七点,当时没水没吃晚饭,外面的风渐渐大了,考完9点。对于黑夜,我有一种恐惧感,我找不到方向,陌生的环境,台风天很少学生出来散步,而且很多人都已经走了。随口问了路人甲,BlaBla一堆,发现是一个外国友人(留学生),好吧,考验我的英语口语了,还好,没虚,沿所指方向直走公交站,同等候已久的广工同学(初中同学)一起去广工。考试期间,很多电话打了过来,后来才知道原台风登陆老家,原来姐姐宿舍被台风肆虐,电话还没信号,家里很担心,爸妈一直打电话确保所有人安全才放心,搞得睡觉都不安稳,晚点12点多的时候说联系上了,这才安心睡觉,亲人很重要!
第一次霸笔就这么落魄。 当时试题上讲阿里需要大量java工程师,做出来将会比较大面试机会,哎,基础还是太差了,连面试机会都不给。
分享到:
评论

相关推荐

    Java虚拟机类加载顺序

    Java虚拟机类加载顺序,Java虚拟机类加载顺序,Java虚拟机类加载顺序

    Tomcat启动时类加载顺序

    详细说明了tomcat启动过程中 加载资源的顺序

    java面试题静态加载顺序构造方法

    java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。 package extend; public class X { Y y=new Y(); static{ System.out.println("tttt"); } X(){ System....

    类,对象,成员加载的顺序

    java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序

    详解java中继承关系类加载顺序问题

    主要介绍了详解java中继承关系类加载顺序问题的相关资料,需要的朋友可以参考下

    类加载顺序的代码执行结果

    先静态代码块,然后构造代码块,再是构造方法,然后方法里面的代码块按顺序执行。 子类继承父类的时候,先执行父类的静态代码块,然后子类的静态代码块,然后父类的构造代码块和构造方法,再是子类的构造代码块和...

    Java中类的加载顺序

    不过我们可以换个直接的问法,如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序是什么?  当时我也是一头...

    tomcat详解与启动加载顺序

    tomcat详解与启动加载顺序 tomcat详解与启动加载顺序

    Java类加载器加载类顺序

    java ClassLoader的学习  java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class...  一个类如果要被JVM所调度执行,必须先把这个类加载到JVM内存里,java.lang下有个很重要的类ClassL

    Java中类的加载顺序剖析(常用于面试题)

    主要介绍了Java中类的加载顺序剖析(常用于面试题),本文直接给出代码实例和运行结果,给后给出了加载过程总结,需要的朋友可以参考下

    RAD类加载器序列

    有时在WebSphere Application Server喜欢的类加载器的顺序,防止旧版本的相似实例首先提到,因此,我们需要指定的顺序加载类

    详解Java中类的加载顺序

    Java中什么时候类加载,第一次需要使用类信息时加载。类加载的原则:延迟加载,能不加载就不加载。下面这篇文章主要介绍了Java中类的加载顺序,需要的朋友可以参考借鉴,下面来一起看看吧。

    Java类加载顺序笔试题-Nicobar:尼科巴

    Java类加载顺序笔试题 Nicobar:Java 的动态脚本和模块加载器框架 Nicobar 是一个 Java 动态脚本框架,由强大的基于 . 脚本可以是源代码,用 JVM 兼容语言(如 Groovy)编写,也可以是编译后的字节码,以 .class ...

    Java类加载机制.pdf

    java的类加载机制,类加载顺序,类加载的体系结构,类加载过程,双亲委派模型及机制等相关内容。做架构师或者高级开发,类加载是必须要掌握的内容。

    让spring解决控制springboot中bean的加载顺序的问题.docx

    1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题。在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功能。 在一般业务场景,可能你不大...

    websphere6,7上修改类装载顺序为应用程序优先

    NULL 博文链接:https://xiaoxinshome.iteye.com/blog/1688607

    Java类加载初始化的过程及顺序

    今天小编就为大家分享一篇关于Java类加载初始化的过程及顺序,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    Java中类的加载顺序执行结果

    主要介绍了Java中类的加载顺序执行结果的相关资料,需要的朋友可以参考下

    类加载器和双亲委派模型加载类、类的加载优先级的详解.docx

    类的生命周期包含了如上的7个阶段,其中 验证 、 准备 、 解析 统称为 连接,类的加载主要是前...那什么时候会触发类加载呢?这个在虚拟机规范中没有明确定义,只是规定了何时需要执行初始化(稍后详细分析)。

    css样式加载顺序及覆盖顺序深入理解

    查找一些教材中(w3schools等),只说css的顺序是“元素上的style” > “文件头上的style元素” >“外部样式文件”,但对于样式文件中的多个相同样式的优先级怎样排列,没有详细说明。经过测试和继续搜索,得知...

Global site tag (gtag.js) - Google Analytics