Java学习笔记60——继承与构造方法的关系

继承与构造方法的关系

先记住一句话,要想初始化子类,就必须初始化父类,而初始化调用的是构造方法

子类中所有的构造方法中都会默认含有一个访问父类的无参构造方法super()

class Father{

}

class Son extends Father{
    int a=30;
    Son(){
        super();//默认会有一个访问父类的无参构造方法的super();
    }

    public void fun(){
        System.out.println(a);
    }
}

public class ExtendsDemo2 {
    public static void main(String[] args) {
        //初始化子类的时候得调用子类的构造方法,但是初始化子类,必须先初始化父类
        Son son = new Son();

        son.fun();
    }
}
class Father{
    Father(){
        System.out.println("这是父类的无参构造方法");
    }
    //有无参就有有参
    Father(String s){
        System.out.println("这是父类的带参构造方法——"+s);
    }
}

class Son extends Father{
    int a=30;
    Son(){
      //super() JVM虚拟机会默认在调用子类构造方法的时候,这里会默认一个默认访问父类无参构造方法的super()
        System.out.println("这是子类中的无参构造方法");
    }
    Son(String s){
        System.out.println("这是子类中的带参构造方法——"+s);
    }

    public void fun(){
        System.out.println(a);
    }
}

public class ExtendsDemo2 {
    public static void main(String[] args) {
        //初始化子类的时候得调用子类的构造方法,但是初始化子类,必须先初始化父类
        Son s = new Son();

        s.fun();
    }


}

new的时候会先访问字了中的无参构造方法,但是子类无参构造方法中会默认有一个父类无参构造方法的super()

当父类没有提供无参构造方法的时候,如何解决?

​ 1、父类提供一个无参构造方法
​ 2、在子类的构造方法中第一句话上使用super访问父类中其他的构造方法,完成父类的初始化
​ 3、在无参构造方法中使用this关键字调用本类的其他含有super(...)的访问父类的有参构造方法

class Father{
    /*Father(){
        System.out.println("这是父类的无参构造方法");
    }*/
    //有无参就有有参
    Father(String s){
        System.out.println("这是父类的带参构造方法——"+s);//1
    }
}


class Son extends Father{
    int a=30;
    Son(){
     // super("hello");
        this("world");
        System.out.println("这是子类中的无参构造方法");//3
    }
    Son(String s){
        super("hello");
        System.out.println("这是子类中的带参构造方法——"+s);//2
    }

    public void fun(){
        System.out.println(a);
    }
}

public class ExtendsDemo2 {
    public static void main(String[] args) {
        //初始化子类的时候得调用子类的构造方法,但是初始化子类,必须先初始化父类
        Son s = new Son();

        s.fun();
    }
}

1、new调用Son类的无参方法,通过this找到Son类的有参构造方法中的super(),访问父类有参构造方法

2、再调用Son类有参构造方法

3、最后调用Son类中的无参构造方法

注意事项:

​ 1、对构造方法的调用必须是构造器中的第一个语句
​ 2、同一个只能被初始化一次

class Son extends Father {


    Son(){
        //super() JVM虚拟机会默认在调用子类构造方法的时候,
        // 这里会默认有一个访问父类无参构造方法的super()
//        super("hello");
        //Error:(41, 13) java: 对this的调用必须是构造器中的第一个语句
        super("a");
//        this("world");
        System.out.println("这是子类中无参构造方法"); // 3
    }

    Son(String s){
        super("hello");
        System.out.println("这是子类中带参数的构造方法---"+s);  // 2
    }

    public void fun() {
        System.out.println(a);
    }
}
posted @ 2021-12-10 19:58  欧朋  阅读(106)  评论(0)    收藏  举报