关于抽象类、抽象方法的说明:
1、在自下而上的类的继承层次结构中,上层的类更具通用性,甚至可能更加抽象;
2、抽象类是类的抽象概述,仅提供类的定义,而不提供类的具体实现细节。抽象类的实现交由派生类(子类)来完成。
3、抽象类的声明中包括abstract关键字,抽象类的存在是为了给派生类提供一种约定;
4、为了提高程序的清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的;
5、抽象方法充当着占位的角色,它们的具体实现在子类中;
6、类即使不含抽象方法,也可以将类声明为抽象类;
7、抽象类不能被实例化。也就是说,如果将一个类声明为抽象类(abstract),就不能创建这个类的对象。
8、可以定义一个抽象类的对象变量,但是它只能引用非抽象子类的对象。
9、扩展抽象类可以有两种选择:
(1)在子类中定义部分抽象方法或抽象方法不定义,这样就必须将子类也标记为抽象类;
(2)定义全部的抽象方法,这样子类就不是抽象的了。
下面通过具体的示例做以阐述;
import java.util.*;
public class PersonTest {
/**
* 本示例演示抽象类的继承
* @author cruise 2013-3-23 16:10
*
*/
public static void main(String[] args) {
Person[] person = new Person[2];
person[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
person[1] = new Student("Tommy Jonson", "computer science");
for (Person p : person) {
System.out.println(p.getName() + " , " + p.getDescription());
}
}
}
abstract class Person {
Person(String n) {
name = n;
}
public String getName() {
return name;
}
public abstract String getDescription();//注意抽象方法的使用
private String name;
}
class Employee extends Person {
public Employee(String n, double s, int year, int month, int day) {
super(n);
salary = s;
GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
hireDay = calendar.getTime();
}
public double getSalary() {
return salary;
}
public Date getHireDay() {
return hireDay;
}
public double raiseSalary(int byPercent) {
double raise = salary * byPercent / 100;
return salary += raise;
}
public String getDescription() {
return String.format("an employee with a salary of $%.2f", salary);
}
private double salary;
private Date hireDay;
}
class Student extends Person {
Student(String n, String m) {
super(n);
major = m;
}
public String getDescription() {
return "a student majoring in " + major;
}
private String major;
}