在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();
© 2024. All Rights Reserved. 沪ICP备2023009024号-1