4.super关键字

关键字 super 可被用来引用该类的父类,它被用来引用父类的成员变量或方法。 父类行为被调用,就好象该行为是本类的行为一样,而且调用行为不必发生在父类中,它能自动向上层类追溯。

super 关键字的功能:
  • 点取父类中被子类隐藏了的数据成员。
  • 点取已经覆盖了的方法。
  • 作为方法名表示父类构造方法。

点取父类中被子类隐藏了的数据成员或方法
public class Employee {
    private String name;
    private int salary;
    public String getDetails() {
        return "Name: " + name + "\nSalary: " + salary;
    }
}
public class Manager extends Employee {
    private String department;
    public String getDetails() {
        return super.getDetails() + // 调用父类的方法
            "\nDepartment: " + department;
    }
}
请注意,super.method()格式的调用,如果对象已经具有父类类型,那么它的方法的整个行为都将被调用,也包括其所有负面效果。该方法不必在父类中定义,它也可以从某些祖先类中继承。也就是说可以从父类的父类去获取,具有追溯性,一直向上去找,直到找到为止,这是一个很重要的特点。

调用父类构造方法
在许多情况下,使用默认构造方法来对父类对象进行初始化。当然也可以使用 super 来显示调用父类的构造方法。

public class Employee {
    String name;
    public Employee(String n) {
        name = n;
    }
}
public class Manager extends Employee {
    String department;
    public Manager(String s, String d) {
        super(s);
        department = d;
    }
}
注意:无论是 super 还是 this,都必须放在构造方法的第一行。

通常要定义一个带参数的构造方法,并要使用这些参数来控制一个对象的父类部分的构造。

可能通过从子类构造方法的第一行调用关键字 super 的手段调用一个特殊的父类构造方法作为子类初始化的一部分。要控制具体的构造方法的调用,必须给 super()提供合适的参数。当不调用带参数的 super 时,缺省的父类构造方法(即,不带参数的构造方法)被隐含地调用。 在这种情况下,如果没有缺省的父类构造方法,将导致编译错误。
public class Employee {
    String name;
    public Employee(String n) {
        name = n;
    }
}
public class Manager extends Employee {
    String department;
    public Manager(String s, String d) {
        super(s); // 调用父类参数为 String 类型的构造方法,没有这句话,编译会出错
        department = d;
    }
}

当被使用时,super 或 this 必须被放在构造方法的第一行。显然,两者不能被放在一个单独行中,但这种情况事实上不是一个问题 。如果写一个构造方法,它既没有调用 super(…)也没有调用 this(…),编译器自动插入一个调用到父类构造方法中,而不带参数。 其它构造方法也能调用 super(…)或 this(…),调用一个 static 方法和构造方法的数据链。 最终发生的是父类构造方法(可能几个)将在链中的任何子类构造方法前执行。m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值