1、在没有静态块的情况下,子类的对象创建时,父类的无参构造器–>子类的构造器(产生对象的构造器,如果是无参则执行的是无参构造器,如果执行的是有参则执行的有参构造器)。现在的父类中只有两个构造器:
- Father.java Father{ publicFather(){ System.out.println(“我是父类的无参构造器”); } publicFather(Stringusername){ System.out.println(“我是父类有参构造器,传过来的参数是+”+username); } publicclassSonDemoextendsFather{ publicSonDemo(){ System.out.println(“我是–子类–的无参构造器”); } publicSonDemo(Stringusername){ System.out.println(“我是子类的有参构造器,参数是”+username); } publicvoidsys(){ System.out.println(“我是子类的sys方法”); } publicstaticvoidmain(String[]args){ //里面的内容在下面有说明} }
① 子类使用无参构造器创建对象:
在SonDemo 的main方法中加入创建对象的代码:
- SonDemoson=newSonDemo(); }
我是父类的无参构造器
我是–子类–的无参构造器
② 子类使用有参构造器创建对象:
SonDemo的main方法中加入
SonDemoson=newSonDemo(“thanyouma”);
那么控制台打印的结果是:
我是父类的无参构造器
我是子类的有参构造器,参数是than you ma
也就是说在子类调用无参构造器创建对象的时候,在执行它自己的有参构造器之前首先执行父类的无参构造器。
③ 在子类中创建父类的对象,使用无参
- SonDemoson=newSonDemo(“thanyouma”); Fatherff=newFather();
SonDemo的main方法中加入
我是父类的无参构造器
我是–子类–的无参构造器
我是父类的无参构造器
调用了父类的无参构造器,有参的创建对象调用的是有参构造器。
总结:在创建子类对象的时候,首先会调用父类的构造器,让后在调用子类相应的构造器创建对象,在子类创建父类对象时,就是直接调用父类自己相应的构造器。
2、如果在子类和父类中存在静态块;执行顺序有会是怎么样的了?
答,静态块会在构造器之前运行。不管是子类还是父类。创建一个对象的时候,会首先加载它的静态块。
- Father.java publicclassFather{ //静态块 static{ System.out.println(“fatherstatic”); } publicFather(){ System.out.println(“我是父类的无参构造器”); } publicFather(Stringusername){ System.out.println(“我是父类有参构造器,传过来的参数是+”+username); } } SonDemo.java publicclassSonDemoextendsFather{ //静态块 static{ System.out.println(“sonDemostatic”); } publicSonDemo(){ System.out.println(“我是–子类–的无参构造器”); } publicSonDemo(Stringusername){ System.out.println(“我是子类的有参构造器,参数是”+username); } publicvoidsys(){ System.out.println(“我是子类的sys方法”); } publicstaticvoidmain(String[]args){ SonDemoson=newSonDemo(); } }
① 程序的结果:
father static sonDemo static 我是父类的无参构造器 我是–子类–的无参构造器
因为在创建子类对象之前:会创建父类的一个对象,而静态块会在main之前被加载,所以两个类的静态块首先执行。
然后执行构造器。
② 如果在子类中的main中只创建父类的对象结果是怎么样的呢?
打印结果:
father static sonDemo static 我是父类的无参构造器
为什么子类的静态块会被加载了?是因为我们是在SonDemo中测试,如果在其他类中测试就不会打印。
总结:我们说了这么多就是重要的一点。静态块会在构造器器之前执行。
昨晚多几分钟的准备,今天少几小时的麻烦。