初学java ,请问java对象初始化的过程是怎样的,包括子类父类构造器 实例变量的初始化的顺序

解决方案 »

  1.   

    class Test{
          static{
                System.out.println("父类static 块 1  执行");
                }
          static Sample staticSam1=new Sample("父类 静态成员staticSam1初始化");
          Sample sam1=new Sample("父类 sam1成员初始化");
          static Sample staticSam2=new Sample("父类 静态成员staticSam2初始化");
          static{
                System.out.println("父类 static 块 2  执行");
                }
          Test()
          {
                System.out.println("父类 Test默认构造函数被调用");
          }
          Sample sam2=new Sample("父类 sam2成员初始化");}class TestSub extends Test
    {
          static Sample staticSamSub=new Sample("子类 静态成员staticSamSub初始化");
          TestSub()
          {
                System.out.println("子类 TestSub 默认构造函数被调用");
          }
          Sample sam1=new Sample("子类 sam1成员初始化");
          static Sample staticSamSub1=new Sample("子类 静态成员staticSamSub1初始化");
          
          static{System.out.println("子类 static 块  执行");}
          Sample sam2=new Sample("子类 sam2成员初始化");
    }执行结果:
    父类 static 块 1  执行
    父类 静态成员staticSam1初始化
    父类 静态成员staticSam2初始化
    父类 static 块 2  执行
                            --------父类静态成员初始化
    子类 静态成员staticSamSub初始化
    子类 静态成员staticSamSub1初始化
    子类 static 块  执行
                            -------子类静态成员初始化
    父类 sam1成员初始化
    父类 sam2成员初始化
    父类 Test默认构造函数被调用       
                            -------父类普通成员初始化和构造函数执行
    子类 sam1成员初始化
    子类 sam2成员初始化
    子类 TestSub 默认构造函数被调用
                            -------父类普通成员初始化和构造函数执行
    由此得出Java初始化顺序结论:
    1 继承体系的所有静态成员初始化(先父类,后子类)
    2 父类初始化完成(普通成员的初始化-->构造函数的调用)
    3 子类初始化(普通成员-->构造函数)
      

  2.   

    我也是初学者:
    提点自己的理解:
    举例:Person p1 = new Person()//创建父类对象
          Child p2 = new Child()//创建子类对象 
    在上述情况下:
        如果先创建父类对象:new Person()的话,在堆中开辟一个空间(内存),Person p意思于,在栈中存放变量p,用于在堆中找到Person对象的属性(也可以理解成p引用Person对象的地址)。
        如果是先创建子类对象:new Child()的话,程序默认先调用父类的构造器,之后再调用子类的。如果是无参的话,子类的构造器首行自动添加super()调用父类构造器,构造器一般是用于初始化成员变量=全局变量的。再如果不考虑权限修饰符,通过对象调用方法和变量的过程是:p1.方法 或 p1.变量名 
      

  3.   

    Person p=new Person(“zhangsan”,20);
    该句话都做了什么事情?
    1、因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中。
    2、执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
    3、在堆内存中开辟空间,分配内存地址。
    4、在堆内存中建立对象的特有属性,并进行默认初始化。
    5、对属性进行显示初始化
    6、对对象进行构造代码块初始化
    7、对对象进行对应的构造函数初始化
    8、将内存地址付给栈内存中的变量。
      

  4.   

    1.在当前对象初始化之前会去检查其父类是否初始化。
    2.对象初始化先会加载static的变量以及static块。其顺序为从上到下。
    3.实例变量的初始化,包括初始化当前实例。其顺序也是从上到下。
      

  5.   

    前段时间回到过别人的一个问题class A {
        public A(){System.out.println("我是父类构造方法`");}
    }public class Test extends A {
        public Test() {
            System.out.println("我是构造方法9");  //构造方法在对象实例化时非静态初始化块执行结束以后被执行
            System.out.println("我是构造方法10"); //同级别的安先后顺序执行
        }    {System.out.println("我是非静态初始化块5");} //非静态初始化块在对象实例化时构造方法被调用之前被执行
        {System.out.println("我是非静态初始化块6");} //同级别的按先后顺序执行
        String str2 = "我是非静态初始化代码块7";
        {
            System.out.println(str2);
            str2 = "我是非静态初始化代码块8"; //这里重新赋值
            System.out.println(str2); //可见 String str2=xxx 相当于
                                      //String str; {str=xxx;}//在非静态初始化块赋值
                                      //非静态初始化块同级别按先后顺序执行
        }    static {System.out.println("我是静态代码块1");} //静态块在类加载的时候被执行
        static {System.out.println("我是静态代码块2");} //同级别的按先后顺序执行
        static String str = "我是静态代码块3";
        static {
            System.out.println(str);
            str = "我是静态代码块4"; //这里重新赋值
            System.out.println(str); //可见 static String str=xxx 相当于
                                      //static String str; static {str=xxx;}//在静态块赋值
                                  //静态块同级别按先后顺序执行
        }    public static void main(String[] args) {
            new Test(); //LZ自己理解一下例子的执行顺序
        }
      

  6.   

    被依赖对象先初始化,比如类A里面有一个类B的实例,也就是类A依赖类B,则类B先初始化,如果类B中有静态变量S,则类B依赖S,这时S的初始化会在B初始化之前