黑马程序员技术交流社区

标题: 各类型代码块执行流程的疑问!大大们速进啊 [打印本页]

作者: 15863453752    时间: 2015-8-31 14:55
标题: 各类型代码块执行流程的疑问!大大们速进啊
class DemoCodeBlock {
        static        {
                                System.out.println("这是主函数的静态代码块");
                        }
        public static void main(String[] args) {
               
                Student s = new Student();
        }
}

class Person {
        private String name;
        private  int   age ;

        public Person() {
                System.out.println("这是父类构造方法");
        }

        public Person(String name,int age) {
                this.name = name;
                this.age = age ;
                System.out.println("这是父类构造方法");
        }
        static        {
                        System.out.println("这是父类的静态代码块");
                        }


        {
                System.out.println("这是父类动态代码块");
        }


}

class Student extends Person {
        public Student() {
                System.out.println("这是子类构造方法");
        }

        public Student(String name, int age) {
                super(name,age);
                System.out.println("这是子类构造方法");
        }

        static {
                System.out.println("这是子类静态代码块");
        }

        {
                System.out.println("这是子类动态代码块");
        }
}

作者: 15863453752    时间: 2015-8-31 15:00
输出结果执行流程是:1.这是主函数的静态代码块 2.这是父类的静态代码块   3.这是子类的静态代码块  4这是父类的构造代码块  5  这是父类的构造方法    6这是子类的构造代码块  7这是子类的构造方法          为什么父类的构造代码块会优先于子类的构造代码块执行呢?new Student的时候不应该先去执行Student的构造方法,一执行Student的构造方法,Student类中的构造方法不是应该优先执行吗?
作者: 王盟    时间: 2015-8-31 17:48
为什么父类的构造代码块会优先于子类的构造代码块执行呢?
个人理解(水平有限):因为子类继承了父类,也就相当于拥有了父类的非私有成员变量和成员方法的使用权,必须要先加载父类,创建父类对象,然后再创建子类对象的,这样保证子类对象创建的时候是已经拥有父类的变量和方法的。
静态构造代码块优先与构造代码块是因为,静态的是属于类的,在创建对象之前,当方法区中存入父类和子类的时候就依据继承关系先加载了父类,然后是子类,也就执行了父类和子类的静态构造代码块,接下来才是创建对象的过程。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2