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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 臧立洋 中级黑马   /  2012-12-3 22:12  /  1209 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  class Person
{
       
        {
                System.out.println("构造代码块=a");
       
        }

        static
        {
                System.out.println("静态代码块=a");
        }

        Person(){

                System.out.println("构造方法=a");
        }


        void show()
        {
                System.out.println("Person");
        }
}


class Student extends Person
{
        String name = "aaa";
       
       
       
        {
                System.out.println("构造代码块=b");
       
        }

        static
        {
                System.out.println("静态代码块=b");
        }

        Student(){

                System.out.println("构造方法=b");
        }

       
       
        void show()
        {
                System.out.println("Student");
        }
}


public class Test
{

        public static void main(String[] args)
        {
                Student p = new Student();
               

        }
}
请问下输出的顺序是什么?为什么

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
输出顺序:
静态代码块=a
静态代码块=b
构造代码块=a
构造方法=a
构造代码块=b
构造方法=b
当创建对象p时,会加载Student类,而Student类又继承了Person类,所以Person应该是先于子类加载。
静态代码块随类加载而执行,用于对类的初始化,并且只执行一次,因为类只加载一次。所以先执行父类静态代码块,在执行子类的静态代码块。
创建对象时,会先对继承自父类的属性初始化,构造代码块是对所有对象初始化的,构造方法对特定的对象初始化,
所以先执行父类中的构造代码块,在执行父类的构造方法,
然后在执行子类的构造代码块,最后执行子类的构造方法,完成对对象的初始化操作。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马