动手动脑(类与对象作业再次提交)

Java字段初始化的规律:

1有实际参数值的,按实际参数值进行初始化例如obj=new Init(300);

       System.out.println(obj.field);

2没有给出实际参数值时,找默认的构造函数例如Init obj=new Init();

       System.out.println(obj.field);

2当多个类之间有继承关系时,创建子类对象导致父类初始化快的执行的程序:

package com;

class Father {

static

{

     System.out.println("父类静态块");

}

   public Father() {

   

        System.out.println("父类构造方法");

    }

}

 

class Child extends Father {

static

    {

     System.out.println("子类静态块");

    }

public Child() {

     

        System.out.println("子类构造方法");

    }

}

public class Duo {

public static void main(String []args) {

    new Father();

        System.out.println("--------------");

        new Child();

    }

}

3总结静态初始化块的执行顺序:

代码如下:package com;

 

class Root

{

    static{

       System.out.println("Root的静态初始化块");

    }

    {

       System.out.println("Root的普通初始化块");

    }

    public Root()

    {

       System.out.println("Root的无参数的构造器");

    }

}

class Mid extends Root

{

    static{

       System.out.println("Mid的静态初始化块");

    }

    {

       System.out.println("Mid的普通初始化块");

    }

    public Mid()

    {

       System.out.println("Mid的无参数的构造器");

    }

    public Mid(String msg)

    {

       //通过this调用同一类中重载的构造器

       this();

       System.out.println("Mid的带参数构造器,其参数值:" + msg);

    }

}

class Leaf extends Mid

{

    static{

       System.out.println("Leaf的静态初始化块");

    }

    {

       System.out.println("Leaf的普通初始化块");

    }  

    public Leaf()

    {

       //通过super调用父类中有一个字符串参数的构造器

       super("Java初始化顺序演示");

       System.out.println("执行Leaf的构造器");

    }

 

}

 

public class Q

{

    public static void main(String[] args)

    {

       new Leaf();

      

 

    }

}

分析如下:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕后再去看父类有没有非静态代码块。如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕后接着看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕执行构造方法。总之静态代码块内容优先,然后是父类的非静态代码块和构造方法,做后是子类的非静态代码块和构造方法。

原文地址:https://www.cnblogs.com/19950216z/p/4915491.html