面向对象的特征——继承
继承的出现减少了代码冗余,提高了代码的复用性;此外,也更有利于功能的扩展,让类与类之间产生了关系,提供了多态的前提。
父类 Employee
员工类Employee作为超类(父类、基类),经理类Manager作为子类(派生类)。
员工类代码如下:
package com.studyjava.demo;
public class Employee
{
private String name;
private int age;
private double salary;
public Employee (String name, int age, double salary)
{
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName ()
{
return this.name;
}
public int getAge ()
{
return this.age;
}
public double getSalary ()
{
return this.salary;
}
}
该类有三个字段:名字、年龄以及薪水。以及三个获取字段值的方法。
经理类继承自员工类,但经理比员工多了一个奖金字段。因为经理发的薪水除了工资外还有奖金。
子类
子类需要使用extends来继承父类。另外,多了一个奖金字段bonus;
package com.studyjava.demo;
class Manager extends Employee
{
private double bonus;
……
}
关于private
子类不能直接访问父类中私有的(private)属性和方法,但可以通过其它操作来访问。
instanceof及getClass
用instanceof可以用来判断一个对象是否是一个类的实例,对于父类,该操作符也返回true。
Manager m = new Manager("james", 36, 4000);
if (m instanceof Employee) {
System.out.println("m intanceof Employee");
}
而Object.getClass(),只能是当前类,即使是父类也不可以。
Employee e = new Employee("paul", 35, 3800);
Manager m = new Manager("james", 36, 4000);
if (m.getClass() == Employee.class) {
System.out.println("1"); // 不会输出1
}
继承设计技巧
- 将公共操作和字段放在超类中
- 不要使用protected字段。(protected方法对于指示那些,不提供一般用途而应在子类中重新定义的方法很有用)。
- 使用继承是为了实现"is-a"关系
- 除非所有继承的方法都有意义,否则不要使用继承。
- 在覆盖方法时,不要改变预期的行为。
- 不要滥用反射
- 使用多态,而不是使用类型信息。
if (x is of type) {
action1(x);
} else if (x is of type2) {
action2(x);
}
如上,对于此类的代码应该使用多态
x.action();