面向对象的特征——继承

继承的出现减少了代码冗余,提高了代码的复用性;此外,也更有利于功能的扩展,让类与类之间产生了关系,提供了多态的前提。

父类 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();