前边已经知道了怎么定义和使用一个Java类,今天继续类继承的学习。
利用继承(inheritance),人们可以基于一个已存在的类构造一个新的类。继承一个类,就是复用这个类的方法和实例域。
简单设计一个实例:雇员(工资)、经理(工资+提成)、老板(工资+提成+股份)。
首先定义一个雇员:
package mypackage;
/**
* @author wenji
* 这是一个基类、父类、super class
*
*/
//this指示隐式参数,即被构造的对象
//this可以调用类的其它构造器
//super调用父类的方法
//super调用父类的构造器
public class Employee
{
private String m_sName = "";
private double m_dSalary = 0.0;
// 实例域在定义时,可以直接初始化;也可以在构造器、初始化块中初始化;但一般不建议在初始化块中操作。
// private,类可见
// 若忘了写访问修饰符private,则变量默认,对包内可见
// public,外部可见
public Employee()
{
m_sName = "未命名";
m_dSalary = -1000;
}
public Employee(String sName)
{
this.m_sName = sName;//this指示隐式参数,即对象本身
}
public Employee(double dSalary)
{
this.m_dSalary = dSalary;//this指示隐式参数,即对象本身
}
public Employee(String sName,double dSalary)
{
this(sName);//this调用类的其它构造器
// this(dSalary);//this调用类的其它构造器,但构造器的调用必须是第一条语句
//也就是说,一个构造器中不可能出现两个构造器。构造器+调用构造器=最多两个构造器
// m_sName = sName;
m_dSalary = dSalary;
}
//切记一定要记住写上访问修饰符
public String getName()
{
return m_sName;
}
public double getSalary()
{
return m_dSalary;
}
public void setSalary(double dSalary)
{
m_dSalary = dSalary;
}
}
其次定义一个经理类:
package mypackage;
/**
* @author wenji
* 这是一个子类、sub class、继承类、derived class
* 类继承自Employee
*
*/
//使用extends关键字,表示继承关系
public class Manager extends Employee
{
//定义了一个实例域之后,若没有方法使用,则会报出未使用的警告(构造器都不算)
private double m_dBonus = 0.0;
//若父类未提供默认构造器,则子类必须也不能定义,否则报错
//且若父类未提供默认构造器,则子类继承会有问题,必须显示的定义默认构造器
//但通常构造器都会根据实际需要来定义,一般不会用默认的
// public Manager() {}
//如果子类没有显示的调用父类的构造器,则会默认调用父类的默认构造器(没有参数的构造),若此时父类没有默认构造器,则会报错
public Manager(String sName,double dSalary,double dBonus)
{
//super关键字按照构造器的格式写,即调用父类构造器
//且调用父类构造器必须在本构造器的第一行
super(sName,dSalary);
m_dBonus = dBonus;
}
public double getSalary()
{
//可以使用super关键字调用父类的方法
//但private域通常不能直接访问的,所以要使用方法访问
double dSalary = super.getSalary()+m_dBonus;
return dSalary;
}
}
//this指示隐式参数,即被构造的对象
//this可以调用类的其它构造器
//super调用父类的方法
//super调用父类的构造器
最后是老板:
package mypackage;
public class Boss extends Manager
{
private double m_dStock;//股份
public Boss(String sName,double dSalary,double dBonus,double dStock)
{
super(sName,dSalary,dBonus);
m_dStock = dStock;
}
public double getSalary()
{
double dSalary = super.getSalary()+m_dStock;
return dSalary;
}
}