继承是在一些比较一般的类(超类)的基础上构造、建立、扩充新类(子类)的一种手段。并且子类与超类之间一般存在is-a
关系,例如:在理论上来说,在Manager
与Employee之间存在着明显的is-a
关系。is-a
关系是继承的一个明显的特征。
3.注意点
- 继承简化了人们对事物的认识和描述,能清晰的体现相关类间的层次结构关系。
- 继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要在描述与超类(类A)不同的少量特征(数据成员和成员方法)即可。这种方法能减少代码量和数据冗余度,大大增加程序的重用性。
- 继承通过增强一致性来减少模块间的接口与界面,大大增加了程序的易维护性。
- 提供了多重继承机制。从理论上来说,一个类可以多个超类的 子类 ,它可以从多个 超类 中继承属性与方法,这便是多继承。 但java处于安全性和可靠性的考虑,仅支持单重继承,而通过接口机制来实现多重继承。
inheritance/ManagerTest.java
package inheritance;public class ManagerTest{public static void main(String[] args){//constrcut a Manager objectManager boss = new Manager("Cracker",80000,1988,12,15);boss.setBonus(5000);Employee[] staff = new Employee[3];//fill the staff arry with Manager and Employee objectstaff[0] = boss;staff[1] = new Employee("Harry",50000,1986,10,1);staff[2] = new Employee("Tommy",40000,1987,3,15);//PRint out information about all Employee objects//体现了多态与动态捆绑for(Employee e : staff)System.out.println("name:" + e.getName() + ",salary:" + e.getSalary());}}
inheritance/Employee.java
package inheritance;import java.util.Date;import java.util.GregorianCalendarpublic class Employee {private String name;private double salary;private Date hireDay;public Employee(String n,double s ,int year,int month,int day){name = n;salary = s;GregorianCalendar calendar = new GregorianCalendar(year, month-1, day);hireDay = calendar.getTime();}public String getName(){return name;}public double getSalary(){return salary;}public Date getHireDay(){return hireDay;}public void raiseSalary(double byPercent){double raise = salary * byPercent / 100;salary += raise;}}
inheritance/Manager.java
package inheritance;//Manager类继承了Employee类public class Manager extends Employee{private double bonus;public Manager(String n, double s, int year, int month, int day){//利用super关键词调用Employee类的构造器super(n, s, year, month, day);bonus = 0;}//覆盖了Employee类中的getSalary方法public double getSalary(){//用super关键字调用Employee类的方法double baseSalary = super.getSalary();return baseSalary + bonus;}public void setBonus(double b){bonus = b;}}
super
调用超类的方法
Manager
类中的getSalary
方法返回薪水和奖金的总和,由于Employee
类中的salary
为private
,所以在Manager
类中用使用超类的salary
时需使用super
来调用。super
调用超类的构造器
Manager
类的构造器不能访问Employee
类的私有域,所以必须利用Employee
类的构造器对这部分私有数据进行初始化。super
调用构造器的语句必须是子类构造器的第一条语句。新闻热点
疑难解答