第六讲类、对象和接口(二)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六讲类、对象和接口(二)
1类的继承
继承是类的另一个特性。继承的意义在于:我们重复使用或更改现成的类的方法,也可以加入新的数据成员以及新的方法,以满足新环境的需要。这种技术是所有面向对象的编程语言的一个基本特征。
让我们来看一个例子:前面我们定义了一个Employee类,这只是普通员工,现在我们要定义一个经理类。经理也是员工的一种,所以Employee类中的数据和方法他也应该有;但经理又不同于普通员工,经理有秘书,而且涨工资的时候还要加上分红。怎么办?我们要不要从头开始写一个经理类?
有了继承的技术,我们可以在Employee类的基础上,编写我们的Manager类。程序如下:
package teach4;
import java.util.Date;
class Manager extends Employee
{
private String secretaryName;
public Manager(String n, double s, int d)
{ super(n, s, d);
secretaryName = "";
}
public void raiseSalary(double byPercent)
{ // add 1/2% bonus for every year of service
Date today = new Date(2001,1,1);
double bonus = 0.5 * (today.getYear()- getHireYear());
super.raiseSalary(byPercent + bonus);
}
public void setSecretaryName(String n)
{ secretaryName = n;
}
public String getSecretaryName()
{ return secretaryName;
}
}
我们以这个例子为例,学习继承的用法。
首先,请注意这个类的头部有些不同:class Manager extends Employee;其中,关键字extends是扩展的意思,表明Manager类是从Employee类继承而来。我们把Employee叫做父类或者超类,把Manager叫做子类或者衍生类。一般来说,子类比父类有更多的功能。
Manager的构造方法中有个语句:super(n, s, d),super是一个关键字,意思是调用父
类的方法,在这里是父类,也就是Employee的构造方法;类似地,super.raiseSalary(byPercent + bonus)表示调用父类Employee的raiseSalary方法。所以,如果要在子类中调用父类的方法,使用super。
Manage的构造方法调用了Employee的构造方法。事实上,一般要求子类用super语句调用父类的构造方法并附上恰当的参数。如果没有用super调用,将默认地调用父类的默认构造方法,这时,如果父类没有没有默认的构造方法,编译器将报错。在子类的构造方法中,如果有super语句,要求super语句在第一行。
子类自动拥有父类的标志为public的成员变量和方法,比如:虽然我们在Manager类中没有定义print()方法,但是boss.print()是合法的,因为print()是Employee类的一个方法。如果希望改变父类中的方法,使之适合子类,我们也可以覆盖它。比如,因为经理的提薪方式是:除了上涨百分比,还要加上工龄*0.5的奖金,与普通员工的提薪方式就有不同。所以,我们要覆盖掉这个方法。实际上,只要重写这个方法就可以了。boss.raiseSalary (1.0),将自动调用Manager类里定义的raiseSalary()方法,而不是Employeee里的方法。
但是,如果是私有的成员变量或者方法,也就是用private关键字修饰的那些,那么子类是不能访问的。如果希望子类能访问而别的类不能访问,我们可以用protected关键字,比如:protected String name;这样,name对于Manager来说是可以可见和可访问的,而对于不是Employee的子类的其他类,则是不能访问的。
总结一下访问权限关键字:
public:对全世界来说都是可见的;
private:仅对类来说是可见的;
protected:对所有子类和同一个包(package)来说是可见的;
不声明:如果这三个关键字都没有,那么默认为对整个包可见。
Manager类里定义的setSecretaryName()和getSecretaryName()方法,都只能为Manager 类的对象调用,Employee类的对象是不能调用这两个方法的。
继承可以是几层的。比如,我们可以以Manager为父类,再衍生出Executive类来。我们也可以从Employee类衍生出Programmer类来,它与Manager类没有什么关系。如果希望防止别人从自己编写的一个类中衍生出另一个类,可以加上关键字final,比如,不希望从Manager类中再衍生出别的类,我们可以把Manager类的声明改为:final class Manager extends Employee。这样可以提高程序的安全性,但可扩展性会受到影响。
我们可以画出类的继承结构如下:
2造型
也叫强制类型转换。回忆一下,我们在第二讲的Java的基本语法中,说到基本数据类型的强制类型转换,可以把一个浮点数强制转换为整型,比如:double x=3.14; int nx = (int)x;这样,x=3,把小数部分丢掉了。我们同样可以把类强制转换为另一个类。但不是什么时