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

class ForDemo {
        public static void main(String[] args) {
                 Zi z = new Zi();
        }
}
class Fu {
        static {
                System.out.println("静态代码块Fu");
        }
        public Fu() {
                System.out.println("构造方法Fu");
        }
        {
                System.out.println("构造代码块Fu");
        }
}
       
class Zi extends Fu {
        static {
                System.out.println("静态代码块Zi");
        }
        public Zi() {
                System.out.println("构造方法Zi");
        }
        {
                System.out.println("构造代码块Zi");
        }
}

4 个回复

倒序浏览
1、因为创建对象必然要用到父类,所以首先加载Fu类,运行静态代码块,输出“静态代码块Fu”。
2、接着加载Zi类,运行Zi类的静态代码块,输出“静态代码块Zi”。
3、然后是Zi类的构造函数,但是Zi类的构造函数中默认的第一句是super(),所以跳到Fu类的构造函数,因为构造代码块优先于构造函数,所以执行Fu类的构造代码块,输出“构造代码块Fu”。
       注意:其实Fu类的构造函数的默认第一句还是super(),所以还得跑到Object执行一遍,因为没有输出语句,所以看不到在Object中执行了什么。Object中的代码执行完后才回到Fu类中去。
4、随后运行Fu类构造函数,输出“构造方法Fu”。
5、紧跟着Fu执行完后就执行Zi类的构造函数,但是Zi类有构造代码块,所以先执行Zi类的构造代码块,输出“构造代码块Zi”。
6、最后才是Zi类的构造函数中的输出语句,输出“构造方法Zi”。
静态代码块随着类的加载,而构造代码块是建立对象的时候加载的,所以先执行静态代码块,创建对象的时候再执行构造代码块,最后才轮到构造方法。
回复 使用道具 举报
类加载的过程。http://www.jb51.net/article/47913.htm
回复 使用道具 举报
创建一个类对象,类加载器会先加载这个类的父类。
回复 使用道具 举报
先加载父类的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马