Java/抽象
外观
< Java
如果一个类没有包含足够的信息来描述一个具体的对象就是抽象类。
- 类名前加修饰符abstract;
- 可包含常规类能包含的任何成员,包括非抽象方法;
- 也可包含抽象方法:用abstract修饰,只有方法原型,没有方法的实现;
- 没有具体实例对象的类,不能使用new方法进行实例化只能用作超类;
- 只有当子类实现了抽象超类中的所有抽象方法,子类才不是抽象类,才能产生实例;
- 如果是子类有抽象方法未实现,则子类只能是抽象类。
//抽象类
/* File name : Employee.java */
public abstract class Employee{
private String name;
private String address;
private int number;
public Employee(String name, String address, int number){
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
public double computePay(){
System.out.println("Inside Employee computePay");
return 0.0;
}
public void mailCheck(){
System.out.println("Mailing a check to " + this.name
+ " " + this.address);
}
public String toString(){
return name + " " + address + " " + number;
}
public String getName(){
return name;
}
public String getAddress(){
return address;
}
public void setAddress(String newAddress){
address = newAddress;
}
public int getNumber(){
return number;
}
}
Employee 类现在是抽象的,但它仍然有三个变量,七个方法,一个构造方法。
抽象方法
如果你想一个提供特定方法的类,但是你想要在他的子类中实际实现这个方法,你可以在父类中声明这个方法为抽象的。
abstract 关键字也被用来定义抽象方法。 抽象方法只包含一个方法名而没有方法体。 方法名之后直接跟一个分号,而不是花括号。
public abstract class Employee
{
private String name;
private String address;
private int number;
public abstract double computePay();
//Remainder of class definition
}
声明一个抽象方法有两个结果:
- 如果一个类中含有一个抽象方法,类必须也是抽象的。
- 任何一个子类必须覆盖这个抽象方法,或者继续将它声明为抽象方法。
子类继承一个抽象方法,必须要去覆盖他。如果不这样做的话,它们必须将其继续声明为抽象,或在它们的子类中去覆盖它们。最终,后代类不得不去实现抽象方法;否则你会一直有一个不能被实例化的抽象类。
如果 Salary 继承 Employee 类,则他必须如下要去实现 computerPay() 方法:
/* File name : Salary.java */
public class Salary extends Employee
{
private double salary; // Annual salary
public double computePay()
{
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
//Remainder of class definition
}