跳转到内容

Java/抽象

维基教科书,自由的教学读本

如果一个类没有包含足够的信息来描述一个具体的对象就是抽象类。

  1. 类名前加修饰符abstract;
  2. 可包含常规类能包含的任何成员,包括非抽象方法;
  3. 也可包含抽象方法:用abstract修饰,只有方法原型,没有方法的实现;
  4. 没有具体实例对象的类,不能使用new方法进行实例化只能用作超类;
  5. 只有当子类实现了抽象超类中的所有抽象方法,子类才不是抽象类,才能产生实例;
  6. 如果是子类有抽象方法未实现,则子类只能是抽象类。
//抽象类
/* 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
}

声明一个抽象方法有两个结果:

  1. 如果一个类中含有一个抽象方法,类必须也是抽象的。
  2. 任何一个子类必须覆盖这个抽象方法,或者继续将它声明为抽象方法。

子类继承一个抽象方法,必须要去覆盖他。如果不这样做的话,它们必须将其继续声明为抽象,或在它们的子类中去覆盖它们。最终,后代类不得不去实现抽象方法;否则你会一直有一个不能被实例化的抽象类。

如果 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
}