学习-Java继承和多态之super关键字
- 子类是调用父类构造方法,不意味着子类本身没有构造方法,而是在子类本身去调用父类的,而且必须是在子类构造方法的第一句话奥
- 所以可以使用构造方法给子类未继承父类中的私有变量哦
- 注意在子类中super无论无何都会调用父类的构造方法,子类构造方法若是没写就默认调用super(),即父类的无参数构造方法,此时若是父类中没有这个方法就会报错。
- 调用父类构造方法无需".",在调用父类的成员变量以及方法时才用!!!
100
- 任务要求
- 参考答案
- 评论1
任务描述
本关任务:根据要求补全 Salary 类,实现输出员工基本信息和薪水的功能。
相关知识
对于继承父类的子类而言,有时我们需要在子类中访问父类的方法,此时便可以使用 super 关键字。
在 Java 里面,对于 super 关键字的用法:
-
子父类存在着同名的成员(包括变量和方法)时,在子类中默认是访问子类的成员,可以通过 super 关键字指定访问父类的成员;
-
创建子类对象时,默认会先调用父类无参的构造方法,可以通过 super 关键字指定调用父类的构造方法。
- 如果在子类的构造方法上没有指定调用父类的构造方法,那么 Java 编译器会在子类的构造方法内加上 super() 语句;
- super 关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句;
- super 与 this 关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要是第一个语句。
super 关键字主要存在于子类方法中,用于指向子类对象中的父类对象;可以访问父类的属性、函数以及构造函数。
例子:使用 super 调用父类的构造方法。
class People{
int number; // 证号
String name; // 名称
// 无参构造
People(){
}
// 有参构造
People(int number,String name){
this.number=number;
this.name=name;
System.out.println("我的名字是"+name+",证号是:"+number);
}
}
// 继承 People 类
class Adult extends People{
boolean a; // 是否为成年人
Adult(int number,String name,boolean b){
// 调用父类的构造方法
super(number,name);
a=b;
System.out.println("是否成年="+a);
}
}
public class Test {
public static void main(String[] args) {
Adult adult = new Adult(9901, "张三", false);
}
}
执行结果:
我的名字是张三,证号是:9901
是否成年=false
例子:子类使用 super 访问和调用被子类隐藏的成员变量和方法。
class Sum {
int n;
// 计算 1+2+...+n 的值
float f() {
float sum=0;
for(int i=1;i<=n;i++){
sum=sum+i;
}
return sum;
}
}
// 继承 Sum 类
class Average extends Sum{
int n;
// 计算 1+2+...+n 的平均值
float f() {
float c;
super.n=n;
// 调用父类的计算 1+2+...+n 的方法
c=super.f();
return c/n;
}
// 计算 (1+2+...+n)/2 的值
float g() {
float c;
c=super.f();
return c/2;
}
}
public class Test {
public static void main(String[] args) {
Average aver=new Average();
aver.n=100;
float resultOne=aver.f();
float resultTwo=aver.g();
System.out.println("resultOne="+resultOne);
System.out.println("resultTwo="+resultTwo);
}
}
执行结果:
resultOne=50.5
resultTwo=2525.0
/* * 根据要求补全 Salary 类,实现输出员工基本信息和薪水的功能。 */ class Employee { private String name;// 员工姓名 private String birth;// 出生年月 private String position;// 职位 // 使用有参构造方法初始化Employee public Employee(String name, String birth, String position) { this.name = name; this.birth = birth; this.position = position; } // 定义 introduction 方法输出员工信息 public void introduction() { System.out.println("员工姓名:" + name + "\n出生年月:" + birth + "\n职位:" + position); } } public class Salary extends Employee { private double salary; // 薪水 // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码 /********* Begin *********/ // 定义Salary的有参构造方法,同时在子类中指代父类构造器 Salary(String name, String birth, String position,double sa){ super(name,birth,position); salary=sa; } // 重写introduction方法,使用super保留父类原有的功能,新添输出员工薪水的功能 public void introduction(){ super.introduction(); System.out.printf("薪水:%.1f",salary); } /********** End **********/ }