A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这道题的运行结果是什么来着,其中的原理是神马?????
class HelloA {

    public HelloA() {
        System.out.println("HelloA");
    }
   
    { System.out.println("I'm A class"); }
   
    static { System.out.println("static A"); }

}

public class HelloB extends HelloA {
    public HelloB() {
        System.out.println("HelloB");
    }
   
    { System.out.println("I'm B class"); }
   
    static { System.out.println("static B"); }
   
    public static void main(String[] args) {
     new HelloB();
   }

}

9 个回复

倒序浏览
package com.heima.test;

public class Demo7 {
        /*
*
*/
        public static void main(String[] args) {
                new HelloB();

        }

}

class HelloA {

        public HelloA() {
                System.out.println("HelloA");//构造方法        最后才会执行构造方法
        }

        {
                System.out.println("I'm A class");//构造代码块        PS:创建对象,需要初始化类,会先执行类中的构造代码块
        }

        static {
                System.out.println("static A");//静态代码块 PS不管他在哪个位置,都是一加载字节码文件,进栈内存中,就会执行静态代码块
        }

}

class HelloB extends HelloA {
        public HelloB() {
                System.out.println("HelloB");
        }

        {
                System.out.println("I'm B class");
        }

        static {
                System.out.println("static B");
        }
}

/*
static A
static B
I'm A class
HelloA
I'm B class
HelloB
以上就是运行结果,运行的时候是先走主方法,主方法里有创建B对象,而此时B继承了A,所以在加载B的字节码文件之前,要去加载他的父类,也就是A的字节码文件
A里有静态代码块,所以先输出 1.static A
然后加载字节码文件B,看到B也有字节码文件,那么就输出 2.static B
A和B的字节码文件都加载完了,那么需要初始化了,要给B初始化,就要先给他的父类,也就是A进行初始化,就输出A里面的构造代码块 3.I'm A class
然后运行4.构造方法 里的 HelloA
接下来才是给子类B进行初始化,依次就是:5.I'm B class  6.HelloB
PS:你记住,静态很早就执行,是加载字节码文件进栈,就执行了的.而且先后顺序必须是先父类,再子类
构造方法创建对象的顺序也是一样,必须是父类初始化完成,才会对子类进行初始化
因为,如果父类都没有加载,继承他的子类,怎么只能能不能使用父类的属性和方法呢

放在Eclipse里面手麻的,希望你能够理解
*/

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
柳柳桑 + 1 + 2 赞一个!

查看全部评分

回复 使用道具 举报
楼主看懂了么?不懂的可以继续问
回复 使用道具 举报
Ryan_Println 发表于 2016-9-6 14:54
楼主看懂了么?不懂的可以继续问

灰常给力,3q
回复 使用道具 举报

这道题的运行结果是什么来着,其中的原理是神马?????
class HelloA {

    public HelloA() {
        System.out.println("HelloA");
    }
   
    { System.out.println("I'm A class"); }
   
    static { System.out.println("static A"); }

}

public class HelloB extends HelloA {
    public HelloB() {
        System.out.println("HelloB");
    }
   
    { System.out.println("I'm B class"); }
   
    static { System.out.println("static B"); }
   
    public static void main(String[] args) {
     new HelloB();
   }

}

首先明确静态代码块,构造代码块和局部代码块三者之间的执行顺序:
        静态代码块随着累的加载而执行,只执行一次;
        构造代码块随着对象的创建的执行,每次创建对象都会执行,并且优先于构造方法执行;
        局部代码块只有程序执行到了对象的位置才会执行

接下来分析程序执行的顺序:
        程序开始首先加载HelloB类的字节码(.class)文件到内存中的方法区,但是程序发现HelloB是HelloA的子类,所以会先将HelloA字节码文件(。class)加载到内存中的方法区,再将HelloB的字节码文件加载到方法区。因此HelloA的静态代码块执行,控制台输出“static A”,然后HelloB的静态代码块执行,控制台输出“static B”;
        接着HelloB的主方法进栈,执行new HelloB()方法。这个步骤会默认先调用父类的构造方法,即会先执行HelloA的构造方法。
        执行HelloA的构造方法是发现HelloA有个构造代码块,因此先执行HelloA的构造代码块,再执行HelloA的构造方法。因此控制台输出“I'm A class”,再输出“HelloA”;
        程序回到HelloB的构造方法,发现HelloB也有一个构造代码块,与HelloA相似,控制台会输出“I'm B class”,再输出“HelloB”;
        回到HelloB的主方法,发现程序没有语句了,主方法弹栈,程序结束。

程序的最终结果是:
        static A
        static B
        I'm A class
        HelloA
        I'm B class
        HelloB
回复 使用道具 举报
Ryan_Println 发表于 2016-9-6 14:54
楼主看懂了么?不懂的可以继续问

哥们学得挺6啊?   什么时候进黑马就业班?
回复 使用道具 举报
cjc147 发表于 2016-9-6 21:16
这道题的运行结果是什么来着,其中的原理是神马?????
class HelloA {

我想问一下 技术论坛里的加精华是什么意思?
回复 使用道具 举报
写代码的蜗牛 发表于 2016-9-6 22:14
哥们学得挺6啊?   什么时候进黑马就业班?

昨天刚刚过了点招,一星期后交钱上就业班
回复 使用道具 举报
写代码的蜗牛 发表于 2016-9-6 22:15
我想问一下 技术论坛里的加精华是什么意思?

高质量帖子可以向吧主申请加精 以后可以在精品区看到你帖子。。。
就是人家认为你的帖子是精华,就给个跟置顶,热门等差不多的标签,方便更多的人看到
回复 使用道具 举报
执行顺序:父类静态代码块>子类静态代码块>父类构造代码块>父类构造方法>子类构造代码块>子类构造方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马