Java面向对象:super 关键字


super 关键字

  • 创建子类对象时,先调用了父类的构造方法,再调用子类构造方法。相当于在子类方法的第一行先执行了隐藏代码: super(); 父类构造方法。

  • super注意点:
    1. super调用父类的构造方法,必须在构造方法的第一行
    2. super必须只能出现在子类的方法或者构造方法中
    3. super和this不能同时调用构造器

  • VS this:

    • 代表的对象不同:
      - this:本身调用者这个对象(当前对象)
      - super:代表父类对象的引用

    • 前提:
      - this:没有继承也可以使用
      - super:只能宅继承条件成立后才可以使用

    • 构造方法:
      - this():本类的构造
      - super():父类的构造

  • 测试:

//测试
package com.oop;

import com.oop.demo05.Student;
import com.oop.demo05.Teacher;

//项目应该只存在一个 main 方法
//启动类
public class Application {

    public static void main(String[] args) {

        Student student = new Student();
        student.test("张三");
        student.test1();

    }
}
//==========================================
//输出结果如下:
/*
Person无参执行了
Student无参执行了
张三
zhongguoren
wanggenji
Student
Student
Person
*/
//父类
package com.oop.demo05;

public class Person {

    protected String name = "wanggenji";

    public Person(){
        System.out.println("Person无参执行了");
    }

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

}
//子类
package com.oop.demo05;

public class Student extends Person {

    private String name = "zhongguoren";

    public Student() {
        //隐藏代码:调用了父类的无参构造
        //显示地调用父类的构造器,必须要在之类构造器的第一行.this()也必须在第一行
        //this() 与 super() 都必须只能在第一行定义,所有只能有一个,不能在一个方法中共存。
        super();
        System.out.println("Student无参执行了");
    }

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

    public void test1(){

        print();    //Student
        this.print();//Student
        super.print();//Person
    }

    public void test(String name){
        System.out.println(name); // 传进来的参数name
        System.out.println(this.name);//zhongguoren
        System.out.println(super.name);//wanggenji
    }

}

相关