继承
1. “is-a”关系是继承的一个明显特征
2. java中所有的继承都是公有继承,而没有c++中的私有继承和保护继承
3. java不支持多继承,多继承功能的实现方式用接口来实现
4. 阻止继承:final修饰过的类或方法,不可继承
多态
1. java中,对象变量是多态的。如下:Manager is-a Employee
Employee m = new Manager("brain", 3000); //ok 对象变量是多态的
一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类的对象(Manager),但是这样做后就不可以再用继承子类特有的方法,只能看做是超类Employee的对象了
2. 动态绑定
弄清调用对象方法的执行过程十分重要,如下图所示
抽象类
1. 包含一个或多个抽象方法的类本身必须声明为抽象的;抽象类也可以包含具体数据和具体方法
abstract class Person //抽象类
{
private String name; //具体数据
public Person(String n) //构造器
{
name = n;
}
public abstract String getDescription(); //抽象方法
public String getName() //具体方法
{
return name;
}
}
抽象类的抽象方法具体在子类中实现,在接口中可以看到更多的抽象方法
抽象类不能被实例化。可以定义一个抽象类的对象变量,但是只能引用非抽象子类的对象,如下:
Person p = new Student("Brain", "Economics");
抽象类助理解示例程序:
package test;
import java.util.*;
public class Test
{
public static void main(String args[])
{
Person[] people = new Person[2];
people[0] = new Employee("Bob", 10000, 2017, 6, 28);
people[1] = new Student("brain", "Economics");
for(Person p: people)
{
System.out.println(p.getName() + ", " + p.getDescription());
}
}
}
abstract class Person
{
private String name;
public Person(String n)
{
name = n;
}
public abstract String getDescription();
public String getName()
{
return name;
}
}
class Student extends Person
{
private String major;
public Student(String n, String m)
{
super(n);
major = m;
}
public String getDescription()
{
return "a student majoring in" + major;
}
}
class Employee extends Person
{
private double salary;
private Date hireDay;
public Employee(String n, double s, int year, int month, int day)
{
super(n);
GregorianCalendar cal = new GregorianCalendar(year, month-1, day);
hireDay = cal.getTime();
}
public String getDescription()
{
return String.format("an employee with a salary of $%.2f", salary);
}
public void raiseSalary(double percent)
{
salary *= (1 + percent/100);
}
}
output:
Bob, an employee with a salary of $0.00
brain, a student majoring inEconomics