day10

Java.
“is a”关系是一个简单而强大的规则,用于判断父类和子类的继承关系是否正确。当使用继承时,我们必须能够说子类“ is a(是一个)” 父类。如果这个语句是真的,那么继承关系就是对的。例如,“一个拿年薪的员工是一个员工”是真的。同样,一个按小时付酬的员工是一个员工。因此,可以推断Salary类和Hourly类与Employee类之间的继承关系是正确的。
现在我们来看一个不应该使用继承的例子。假如有一个Date类来表示日历日期,我们想使用该类来跟踪员工入职的日期。
因为继承有如此多的好处,我们决定用Employee类继承Date类。当实例化Employee对象时,我们也将得到一个Date对象,以存储员工的入职日期。但是,“员工是一个日期”正确么?很显然,这里这种关系失败了。虽然结果可能是正确的,但是Employee类继承Date类不是一个好的设计方法,因此不能用。
对Employee和Date类不正确地使用继承的解决方案是认识到员工有一个入职日期,而不是员工是一个入职日期。如果对象有一个(has a)属性,这个属性就必须是类中的一个成员变量。Employee类必须添加一个Date类型的成员变量来代表员工的入职日期,而不是继承Date类。
我们已经知道为什么在面向对象编程中要使用继承。现在,让我们来看看Java中是如何实现继承的。
在Java中,一个类使用关键字extends继承其它类。关键字extends出现在类声明时的类名后,extends后面跟着的是要继承的类的名称。
例如,下面的语句用于声明Salary类是Employee类的子类:
public class Salary extends Employee
同样,Hourly类可以用如下的语句继承Employee类:
public class Hourly extends Employee
代码清单7.4中的Employee类可以用作Salary和Hourly类的父类。注意,我们不需要添加任何特殊的代码来说明Employee是一个父类。
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13: /*代码清单7.4 Employee.java
重新设计的Employee类,做为父类。共性的特征和行为放在Employee类中。
*/

public class Employee{
public String name;
public String address;
public int SSN;
public int number;
public void mailCheck(){
System.out.println(“邮寄支票给员工” + name + “的地址为” + address);
}
}
代码清单7.5中的Salary类使用extends关键字,来描述Salary类是Employee类的子类。
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11: /*代码清单7.5 Salary.java
重新设计的Salary类,做为Employee类的子类。
*/

public class Salary extends Employee{
public float salary; //年薪
public float computePay(){
System.out.println(“计算拿固定工资的员工” + name +”的工资”);
return salary/52;
}
}
同样,代码清单7.6中的Hourly类也使用extends关键字继承Employee类。
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18: /*代码清单7.6 Hourly.java
重新设计的Hourly类,做为Employee的子类。
*/
public class Hourly extends Employee{
public float hourlyRate; //每小时报酬
public float hoursWorked; //每周工作时间
public float computePay(){
System.out.println(“计算按时付酬员工” + name + “的薪水”);
float pay = 0.0F;
if(hoursWorked <= 40){
pay = hourlyRate * hoursWorked;
}
else { //需要计算加班
pay = (hourlyRate * 40) + (hourlyRate * (hoursWorked - 40) * 1.5F);
}
return pay;
}
}
子类是否可以访问父类中的成员变量和方法,取决于访问修饰符,我们将在后一章中讨论。
Salary类中的computePay()方法将输出员工的姓名,但是Salary类总没有name这个成员变量。成员变量name是在Salary类的父类Employee类中。在上例中,因为name的访问修饰符是public,所以,Salary类可以访问该成员变量,并且可以在Salary类内的任何地方使用它。
同样,Hourly类使用从Employee类中继承的name成员变量,在其computePay()方法内输出员工的名字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值