18-面向对象-super关键字

发布时间 2023-08-18 11:22:57作者: 马铃薯1

super关键字

super代表父类的引用,用于访问父类的属性、方法、构造器

基本语法

1) 访问父类的属性,但不能访问父类的private属性

super.属性名

2) 访问父类的方法,但不能访问父类的private方法

super方法名

3) 访问父类的构造器,注意只能放在构造器的第一句

super(参数列表)

public class Super01 {
    public static void main(String[] args) {
        B b = new B();
        b.hi();
        b.ok();
    }
}

class A{
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;

    public A() {
        System.out.println("父类A的构造方法");
    }

    public void test100(){
        System.out.println("欢迎来到父类A的test100方法");
    }

    protected void test200(){}

    void test300(){}

    private void test400(){}
}

class B extends A{

    //访问父类的构造器,super(参数列表),注意只能放在构造器的第一句
    public B(){
        super();
        System.out.println("子类B的构造方法");
    }

    //访问父类的属性,但不能访问父类的private属性
    public void hi(){
        System.out.println("n1 = " + super.n1 + "\tn2 = " + super.n2 + "\tn3 = " + super.n3);
        //System.out.println("n4 = " + super.n4); 错误,n4可以在com.hspedu.super_.A中访问private
    }
    //访问父类的方法,但不能访问父类的private方法
    public void ok(){
        super.test100();
        //super.test400(); 错误,test400()可以在com.hspedu.super_.A中访问private
    }
}

super带来的好处 / 细节

1) 调用父类的构造器时,分工明确,父类属性由父类初始化,子类属性由子类初始化

2) 当子类中有和父类的属性和方法重名时,为了访问父类的属性和方法,必须要通过super关键字,如果没有重名,则使用super、this访问的效果时一样的。

public class Super02 {
    public static void main(String[] args) {
        Graduate graduate = new Graduate();
        graduate.hi();
        graduate.ok();
    }
}

class Student{
    public String name;

    public void show(){
        System.out.println("欢迎来到父类Student的show方法");
    }
}

class Graduate extends Student{
    public int age;
//当子类中有和父类的属性和方法重名时,为了访问父类的属性和方法,必须要通过super关键字 //如果没有重名,则使用super、this访问的效果时一样的 public void hi(){ System.out.println("直接调用父类的属性:name = " + name); System.out.println("使用this调用父类的属性:name = " + this.name); System.out.println("使用super调用父类的属性:name = " + super.name); } public void ok(){ show(); this.show(); super.show(); } }

这里需要注意:在类中调用show方法时,一般顺序是:

a) 先找本类中是否有show方法,如果有则调用

b) 如果没有,则在父类中查找是否有show方法(如果有,则进行调用)

c) 如果父类没有,则继续查找父类的父类,是否有show方法,以此类推直到Object类

提示:

如果在查找方法的过程中,找到了,但是不能访问,则报错

如果在查找方法的过程中,没有找到,则提示方法不存在