创建Employee的子类

任务要求
掌握类的继承的概念,能够使用继承定义新类,掌握关键字 super 的使用。根据项目描述,总理、部门主管和员工除具有 Employee 类中姓名、工号、职位、工资、人职时间 5 个属性外,每个角色还具有自己额外的属性,比如总经理还有分红属性,部门主管有部门、奖金属性;员工有部门、奖金、加班天数了个属性。因此均使用 Employee 类,或者在 Employee 类中把增加的属性均添加到 Employee 类中都不合适。计算工资总额的方法也不一样,因此均使用 Employee 类getSalary()方法的话,显然不能满足要求。此时要创建 Employee 类的子类。
知识准备

1)继承
继承(iheritance)是面向对象程序设计的又一重要特性,是面向对象编程技术的一块基石,因为它允许创建分 等级层次的类。采用继承的机制可以有效地组织程序的结构,设计系统中的类,明确类间关系,充分利用己有的类来完成更复杂、深人的开发,大大提高程序开发的效率,降低维护的工作量。Java 的继承具有单继承的特点,即每个子类只能有一个父类。
(1)继承的概念
继承是一种由已有类创建新类的机制。在Java 语言中,被继承的类称为基类或者父类,由继承形成的类称为派生类或者子类。因此,子类继承了父类定义的变量和方法,同时也可以修改父类的属性或重写父类的方法,并且添加了自己特有的变量和方法。Java 中规定,一个父类可以同时拥有多个子类,但一个子类只能有一个父类,即单重继承Java 允许多层继承,即子类还可以有它自己的子类,在下一层的继承关系中原先的子类就变成了父类。这样的继承关系就形成了继承树。几个父类和子类的例子如表3.7所示。
2)类继承的实现
类的继承是通过关键字 extends 来实现的,其格式为:
[访问权限〕class 子类名extends 父类名
其中,extends 是继承关键字,后面跟着父类的类名。如果没有 extends 子句,则这个类直接 继承 Dbject。 需要注意的是,父类名所指定的类必须是在当前编译单元中可以访问的类,否
则会产生编译错误。
举例如下:
publie Manager extends Employee{

...

}

(3)继承成员变量和方法 
如果一个类是另一类的子类,则子类就会拥有父类中的部分成员变量和方法。子类拥有
父类的成员变量和方法有以下几种情况。
①子类利父类在同一个包中:子类可继承父类中的publie 、protected 和 default 类型的成员
变量和方法,不能继承 private 型的成员变量和方法。
②子类和父类不在同—个包:子类可继承父类的 public protected 的成员变量和方法,不
能能继承 default 和 private 型的成员变量和方法
③子类不能继承父类的构造方法。

因此,若父类不允许其子类访问它的某些成员,那么这些成员变量和成员方法必须以
pivate方式声明该成员;若父类只允许其子类访问和同一包中其他类访问的成员变量和成员
方法,那么这些成员必须以 protected 修饰符修饰。这正好是类封装的信息隐蔽原则的充分体
现。继承后的成员变量和成员方法的访问权限保持不变。
在Employee 类的子类 Manager 类中添加分红属性(double bonus) 和获取每月;总收人方法
double getMonthlySalary()。
publie double getMonthlySalary()号的林兩开人
      retum getSalary() +bonus://调用继承自父类 Employee 类中 public 方法 getSalary()

}

4)子类的构造方法
子类不能继承父类的构造方法,当用子类的构造方法创建一个子类对象时,子类的构造方
法总是先调用父类的某个构造方法。
在重载中一个构造方法调用另一个构造方法使用 this 关键字来调用,在子类构造方法中
调用父类构造方法,使用 super 调用来实现。
调用父类的构造方法可以显式地在子类构造方法的第一条语句使用 super 关键宇调用父
类的构造方法,也可以隐式地调用父类的构造方法,主要有以下几种情况:
①若父类中没有定义构造方法,系统自动为父类添加一个无参的方法体为空的构造方法
那么对父类对象的初始化将采用系统默认的构造函数。也就是说,般基本类型的实例变量
值为0,boolean 类型的变量值为false,对象为 null。此时,子类可以不显式地调用父类构造方
法,则系统创建子类对象时自动调用父类无参构造方法。
②若父类定义了无参构造方法,那么子类构造方法中不显式地调用父类无参构造方法,则
系统创建子类对象时自动调用系统为父类添加的无参构造方法。
③若父类中定义的构造方法都是带有参数的,那么子类构造方法中第一条语句必须使用
super 语句调用父类有参构造方法。
举例:定义总经理类(类名:Manager)。
public class Manager extends Employee
private double bonus;//分红属性
public Manager ( String name, String ID, String position, double salary, Calendar Employment-
Date, double bonus) t
super (name, ID, position, salary, EmploymentDate);
this. bonus = bonus;

}

5)覆盖
子类除了可以继承父类中的成员变量和成员方法,还可以增加自己的成员变量和成员方
法,也可以根据需要重写父类的方法。当一个父类成员不适合该子类时,子类会以恰当的方式
重新定义它,此时父类中被重写的成员变量和成员方法在子类终究被隐藏了。
覆盖是指子类拥有父类相同成员,包括以下两种情况:
①成员变量的覆盖:子类中定义的成品变量和父类中的成员变量同名,不管其类型是否相
同,父类中同名成员变量都要被隐藏,子类就无法继承该变量了。
②成员方法的覆盖:子类中定义的成员方法和父类中的成员方法在方法名、返回类型、参
数个数及类型方面都相同。
覆盖虽然可以实现方法功能的扩展,但覆盖方法要遵循一定的规则:
①覆盖方法的返回类型必须与它所覆盖的方法相同。
②覆盖方法的参数类型和参数个数与它所覆盖的方法相同。
③覆盖方法不能比其所覆盖的方法访问权限小。
④覆盖方法不能比它所覆盖的方法拋出更多的异常(后面会介绍异常方面的知识)。
子类如果想使用父类中被隐藏的成员变量和被隐藏的成员方法,必须使用关键字 super,
格式为:
super •数据成员
super • 成员方法(参数)
举例:在父类 Employee 中添加了输出各个属性值的 toSting()方法。
public String toString(){
                return"Employee 类属性:ID="+ ID
                            +",name ="  + name +",  "position =" + position  +", salary="

                            + salary +", EmploymentDate=" +  EmploymentDate ;
在子类(Manager 类)中对该方法进行重写。
public class Manager extends Employee l
private double bonus;
public Manager ( String name, String ID, String position, double salary, int year, int month, int
day, double bonus)  {
        super( name, ID , position, salary, year, month,day);1/调用父类有参构造方法
        this. bonus = bonus;

}
public double getBonus() {
        return bonus;
public void setBonus ( double bonus) {
         this. bonus=bonus;

}
public String toString() {
;/* 调用父类被覆盖的同名方法*/
    retum " Manager 类属性:bonug ="+ bonus +"继承自父类" + super: toSting()+ "]";

}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值