在AP CS A Exam中,常會出現一些關于接口(interface)和抽象類(abstract class)的題目,特別是在free response部分,時常會出一道大題,讓考生按照題目要求寫出一個接口,或者寫出一個實現接口的類(an implementing class);也可能會讓考生按照題目要求寫出一個抽象類,或者寫出一個抽象類的子類,等等。下面,我們分別來說一說抽象類和接口。
1. Abstract Class
抽象類(abstract class)在創建的時候必須帶有關鍵詞“abstract”作為修飾符。如果一個類不是抽象類,我們可以稱之為一個具體的類。抽象類不可以被用來創建對象(objects)。抽象類可以包含一般的方法,也可以包含抽象方法(abstract methods);抽象類中的抽象方法將在具體的子類中實現。我們舉一個抽象類的例子,比如:
public abstract class AbstractGeometry
{
public String toString()
{
return "This is an AbstractGeometry Type.";
}
public abstract double getArea();
}
在這個抽象類AbstractGeometry中,我們定義了兩個方法,其中,toString就是一般的方法,getArea就是一個抽象方法。注意,這個抽象方法的方法頭(method header)中,必須包含有關鍵詞abstract作為修飾符;另外,抽象類中的抽象方法只有方法頭,沒有方法體(method body);如何實現這個抽象方法,就需要一個具體的子類來完成,比如:
public class Circle extends AbstractGeometry
{
private double radius;
public Circle (double rad)
{
radius = rad;
}
public double getArea()
{
return Math.PI*radius*radius;
}
}
在這個具體的子類Circle中,我們必須實現AbstractGeometry中的抽象方法getArea。
此外,抽象類中也可以含有實例變量(instance variables)。一個子類只能夠繼承(extends)一個抽象類。雖然,抽象類不可以被用來創建對象(objects),但是,在Java中,我們可以創建一個子類的對象,并把這個對象賦值給抽象類的引用類型變量,比如:
AbstractGeometry circle = new Circle(1.0);
2. Interface
接口(interface)是一種與抽象類相似的結構;但是,接口只能夠包含常量和抽象方法(abstract methods)。在接口中,所有的數據域都是常量,所以都是public static final的;所有的方法都是public abtract的,所以在編寫接口的時候,可以忽略掉這些修飾符。比如:
public interface Edible
{
int k = 0; // public static final
boolean testEdible(); // public abstract
}
如果我們想要實現Edible這個接口中的抽象方法,就必須創建一個實現(implements)它的類,比如:
public class Apple implements Edible
{
public boolean testEdible()
{
return true;
}
}
注意,如果一個具體的類是用來實現一個接口的,那么在這個類中必須要實現接口中的抽象方法。一個類只能繼承一個父類,但是可以實現多個接口。類和接口之間的關系稱為接口繼承 (interface inheritance)。在Java中,不能使用new操作符來創建接口的實例,但是,可以使用接口作為引用變量的數據類型,比如:
Edible apple = new Apple();
在AP CS A Exam中會考察List interface,當然,在大綱中只涉及到ArrayList這唯一一個實現List interface的類。
接口和抽象類的區別如下:
最后給大家留一道小題,首先我們來看兩個類:
public abstract class AbstractGeometry
{
public AbstractGeometry()
{
System.out.println("AbstractGeometry");
}
}
public class Circle extends AbstractGeometry
{
public Circle ()
{
System.out.println("Circle");
}
}
請問,下面A) 和 B)兩個語句中哪個語句是正確的,以及輸出結果是什么?
A) AbstractGeometry c = new AbstractGeometry();
B) AbstractGeometry c = new Circle();

? 2025. All Rights Reserved. 滬ICP備2023009024號-1