② 子类使用有参构造器创建对象:

  SonDemo的main方法中加入

SonDemo son = new SonDemo("than you ma");

  那么控制台打印的结果是:

  我是父类的无参构造器

  我是子类的有参构造器,参数是than you ma

  也是说在子类调用无参构造器创建对象的时候,在执行它自己的有参构造器之前首先执行父类的无参构造器。

  ③ 在子类中创建父类的对象,使用无参

SonDemo son = new SonDemo("than you ma"); 
Father ff = new Father();
 
  SonDemo的main方法中加入

  我是父类的无参构造器

  我是--子类--的无参构造器

  我是父类的无参构造器

  调用了父类的无参构造器,有参的创建对象调用的是有参构造器。

  总结:在创建子类对象的时候,首先会调用父类的构造器,让后在调用子类相应的构造器创建对象,在子类创建父类对象时,是直接调用父类自己相应的构造器。
  2、如果在子类和父类中存在静态块;执行顺序有会是怎么样的了?

  答,静态块会在构造器之前运行。不管是子类还是父类。创建一个对象的时候,会首先加载它的静态块。

Father.java  
public class Father {  
   
    //静态块  
    static{  
        System.out.println("father  static ");  
    }  
       
    public Father(){  
        System.out.println("我是父类的无参构造器");  
    }  
       
    public Father(String username){  
        System.out.println("我是父类有参构造器,传过来的参数是+"+username);  
    }  
}  
   
SonDemo.java  
public class SonDemo extends Father{  
    //静态块  
    static{  
        System.out.println("sonDemo static ");  
    }  
       
    public SonDemo(){  
        System.out.println("我是--子类--的无参构造器");  
    }  
    public SonDemo(String username){  
        System.out.println("我是子类的有参构造器,参数是"+username);  
    }  
       
    public void sys(){  
        System.out.println("我是子类的sys方法");  
    }  
       
    public static void main(String[] args) {  
        SonDemo son = new SonDemo();  
    }  
}
 
  ① 程序的结果:

father static
sonDemo static
我是父类的无参构造器
我是--子类--的无参构造器


  因为在创建子类对象之前:会创建父类的一个对象,而静态块会在main之前被加载,所以两个类的静态块首先执行。

  然后执行构造器。

  ② 如果在子类中的main中只创建父类的对象结果是怎么样的呢?

  打印结果:

father static
sonDemo static
我是父类的无参构造器
  为什么子类的静态块会被加载了?是因为我们是在SonDemo中测试,如果在其他类中测试不会打印。

  总结:我们说了这么多是重要的一点。静态块会在构造器器之前执行。