V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
uselessVisitor
V2EX  ›  Java

关于类初始化加载问题

  •  
  •   uselessVisitor · 2021-02-08 15:58:31 +08:00 · 792 次点击
    这是一个创建于 1144 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在复习基础知识,做题时遇到一些关于类加载的问题。以下是我的理解,也不知道对不对,请教一下。。

    public class Foo {
    
        private static int count = 1;
        private static Foo foo = new Foo();
        static {
            System.out.println("执行静态块");
        }
        public Foo(){
            System.out.println("执行了构造函数");
            count++;
        }
    
        public static void main(String[] args) {
            /*
             * 这里的加载顺序
             * 调用 Foo 类--->Foo 类需要初始化--->加载静态(static)修饰的语句  [ static 修饰的语句 执行按从上到下的顺序] 只执行一次
             * -->从`private static int count`开始执行先加载到内存,然后赋予初值 0 然后赋值为 1
             * -->执行 `private static Foo foo` 先加载到内存 并赋予初值 null 然后赋值 new Foo()
             *  [我的理解:为什么不先执行 static 块,因为按顺序由上到下执行,当执行到第二行;
             *  对于类来说已经加载过了前两行 static,所以不再加载;
             *  执行 new Foo()的时候,也就只执行了构造函数]
             * -->执行 new Foo() 即 构造函数
             * -->执行 static {} 块
             */
            /*
             * output
             * 执行了构造函数
             * 执行静态块
             * 2
             * 执行了构造函数
             * 3
             */
            System.out.println(Foo.count);
            new Foo();
            System.out.println(Foo.count);
        }
    }
    
    uselessVisitor
        1
    uselessVisitor  
    OP
       2021-02-08 16:59:50 +08:00
    我知道了。。我理解的还是有问题,真正的答案在这里
    https://honeypps.com/java/java-class-loading-3-case-analysis/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3198 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:38 · PVG 08:38 · LAX 17:38 · JFK 20:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.