Day33--super详解

Day33--super详解

本次目标:学会子类调用父类的属性和方法

我们在父类Person里面,写了受保护的属性name:liu

package com.liu.oop.demo05;

//Person      人
public class Person {

    protected String name="liu";
}

然后进行下面的操作:

我们在Student类里面,创建了私有的属性name:kun

​ 然后创建了方法test,参数是String name,方法体:name、this.name、super.name

那么,这“三个name”分别代表什么?

(将鼠标光标放在name上,就会有提示信息)

package com.liu.oop.demo05;

//学生 is 人.
//子类
public class Student extends Person{
    private String name="kun";
    public void test(String name){
        System.out.println(name);//输出传递的参数
        System.out.println(this.name);//输出这个类的参数
        System.out.println(super.name);//输出父类的参数
    }
}

我们在Application里面调用student类的方法test,运行,可以看见:

package com.liu.oop;

import com.liu.oop.demo05.Student;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.test("hahaha");
        
        /*
        hahaha
        kun
        liu
         */

    }
}

我们知道,每一个类都有默认的无参构造。

​ 写出Person类的无参构造

package com.liu.oop.demo05;

//Person      人
public class Person {

    //无参构造
    public Person() {
    }

    protected String name="liu";

    //私有的类无法继承
    public void print(){
        System.out.println("Person");
    }

}

我们对无参构造进行修改,能够输出:"Person无参构造了"

package com.liu.oop.demo05;

//Person      人
public class Person {

    //无参构造
    public Person() {
        System.out.println("Person无参构造了");
    }

    protected String name="liu";

    //私有的类无法继承
    public void print(){
        System.out.println("Person");
    }

}

同样,我们对Student类也进行无参构造,并让他能输出一句话:"Student子类无参构造了"

package com.liu.oop.demo05;

//学生 is 人.
//子类
public class Student extends Person{

    public Student() {
        System.out.println("Student子类无参构造了");
    }

    private String name="kun";

    public void test1(){
        print();
        this.print();
        super.print();
    }



    public void print(){
        System.out.println("Student");
    }
}

此时,Application只是创造了引用对象student,执行,得到

package com.liu.oop;

import com.liu.oop.demo05.Student;

public class Application {
    public static void main(String[] args) {
        
        
        Student student = new Student();
        /*
        Person父类无参构造了
        Student子类无参构造了

         */


    }
}

为什么是这样的结果呢?

创建Student类的对象。在创建对象的过程中,会先调用父类Person的无参构造函数,因为子类构造函数在默认情况下会先调用父类的无参构造函数(如果父类没有无参构造函数且子类构造函数没有显式调用父类其他构造函数,会导致编译错误)。所以会先输出"Person无参构造了"。

说明,在Student构造器里,调用了父类的构造器。

其实,Student构造器里隐藏了代码super();

package com.liu.oop.demo05;

//学生 is 人.
//子类
public class Student extends Person{

    public Student() {
        //super();   代码隐藏了
        System.out.println("Student子类无参构造了");
    }

    private String name="kun";

    public void test1(){
        print();
        this.print();
        super.print();
    }



    public void print(){
        System.out.println("Student");
    }
}

如果在Student构造器里面,将super(); 写了出来,并且放在了输出语句后面,就会报错

package com.liu.oop.demo05;

//学生 is 人.
//子类
public class Student extends Person{

    public Student() {
         
        System.out.println("Student子类无参构造了");
        super();            //报错
    }

    private String name="kun";

    public void test1(){
        print();
        this.print();
        super.print();
    }



    public void print(){
        System.out.println("Student");
    }
}

image-20241118175414140

调用父类的构造器,super();必须要在子类构造器的第一行!!!!!!!!!!!,或者不写super();

如果将父类Person的构造器改为有参构造,子类Student的构造器有影响吗?

有。

将父类Person的构造器改为有参构造:

package com.liu.oop.demo05;

//Person      人
public class Person {

    //有参构造
    public Person(String name) {
        System.out.println("Person父类有参构造了");
    }

    protected String name="liu";

    //私有的类无法继承
    public void print(){
        System.out.println("Person");
    }

}

此时,Student类立刻报错

package com.liu.oop.demo05;

//学生 is 人.
//子类
public class Student extends Person{

    public Student() {
        super();
        System.out.println("Student子类无参构造了");

    }

    private String name="kun";

    public void test1(){
        print();
        this.print();
        super.print();
    }



    public void print(){
        System.out.println("Student");
    }
}

![屏幕截图 2024-11-18 175943](C:\Users\Lenovo\OneDrive\图片\Screenshots\屏幕截图 2024-11-18 175943.png)

即使去掉super();也会报错

image-20241118180125721

由此可见,当父类没有无参构造的时候,子类无参构造无法调用父类的无参构造,就会报错。

解决方法:

​ 1.在父类构造无参构造

​ 2.将子类的无参构造,调用父类的有参构造 super();改为super(name);

package com.liu.oop.demo05;

//学生 is 人.
//子类
public class Student extends Person{

    private String name="kun";

    public Student() {
        super("name");
        System.out.println("Student子类有参构造了");

    }



    public void test1(){
        print();
        this.print();
        super.print();
    }



    public void print(){
        System.out.println("Student");
    }
}

注意点

super 注意点:

  1. super 调用父类的构造方法,必须在构造方法的第一个。
  2. super 必须只能出现在子类的方法或者构造方法中。
  3. super 和 this 不能同时调用构造方法。(super、this都是要在构造器的第一行)

Vs this:
代表的对象不同:
this:本身调用者这个对象;super:代表父类对象的引用。
this:没有继承也可以使用(前提)。
super:只能在继承条件才可以使用(构造方法)。
this();本类的构造;super():父类的构造。

posted @ 2024-11-18 18:11  1hahahahahahahaha  阅读(2)  评论(0编辑  收藏  举报