2020年8月13日 实例初始化方法 父子类实例初始化方法 (面试重点)

package com.atguigu.test01.block;

public class TestInit {
    public static void main(String[] args) {
        /*
        Father f = new Father();
        //父类的无参构造
        */
        
        /*
         * Son s = new Son();
         * 父类的无参构造
            子类的无参构造
         */
        
        //Son s2 = new Son("atguigu");
        /*
         * 父类的无参构造
        子类的有参构造
         */
        
        Son s3 = new Son("atguigu", 10);
        /*
         * 父类的无参构造
            子类的有参构造1
            子类的有参构造2
         */
    }
}
class Father{
    public Father(){
        System.out.println("父类的无参构造");
    }
}
class Son extends Father{
    private String str;
    private int num;
    
    public Son(){
        //隐含了super();  子类的构造器中一定会调用父类的构造器,默认调用父类的无参构造
        System.out.println("子类的无参构造");
    }
    
    public Son(String str){
        //隐含了super()
        this.str = str;
        System.out.println("子类的有参构造1");
    }
    
    public Son(String str,int num){
        this(str);
        this.num = num;
        System.out.println("子类的有参构造2");
    }
}

package com.atguigu.test01.block;

/*
 * (1)先执行父类的实例初始化方法
 * 它由三部分:
 * ①成员变量的显式赋值
 * ②非静态代码块
 * ③构造器
 * (2)再执行子类的实例初始化方法
 * 它由三部分:
 * ①成员变量的显式赋值
 * ②非静态代码块
 * ③构造器
 * 
 * super()或super(实参列表)之前说的是调用父类的构造器,其实是调用父类对应的实例初始化方法
 * super()或super(实例列表)之前说的是在子类构造器的首行,其实是在子类实例初始化方法的首行
 */
public class TestInit2 {
    public static void main(String[] args) {
        Zi z = new Zi();//312645
    }
}
class Fu{
    private String strFu = assignFu();
    {
        System.out.println("(1)父类的非静态代码块");
    }
    public Fu(){
        System.out.println("(2)父类的无参构造");
    }
    public String assignFu(){
        System.out.println("(3)父类的assignFu()");
        return "fu";
    }
}
class Zi extends Fu{
    private String strZi = assignZi();
    {
        System.out.println("(4)子类的非静态代码块");
    }
    public Zi(){
        //super()  ==>调用父类的实例初始化方法,而且它在子类实例初始化方法的首行
        System.out.println("(5)子类的无参构造");
    }
    
    public  String assignZi(){
        System.out.println("(6)子类的assignZi()");
        return "zi";
    }
}

 

图片中蓝色字体的部分重要,this在构造器,实例初始化方法中,代表的是正在创建的对象,现在正在创建子类的对象,因为子类重写的assign(),那么执行时子类重写的assign().

 

posted @ 2020-08-13 11:04  窦云鹏  阅读(157)  评论(0编辑  收藏  举报