一、抽象类
1、概念
- 抽象类不可以用于创建对象。柚象可以包含抽象方法,这些方法在具体 的子类中实现。
- 在继承的层次结构中,每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追溯,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例,这样的类称为抽象类(abstract class)。
- 在类的头部使用abstract修饰符表示该类为抽象类(ps:关键字 abstract 出现在方法头中,方法头以分号结尾)。在UML图形记号中,抽象类和方法的名字使用斜体表示。
- 抽象类和常规类很像,但是不能使用 new操作符创建它的实例。抽象方法只有定义而没有实现。它的实现由子类提供。一个包含抽象方法的类必须声明为抽象类。
- 抽象类的构造方法定义为 protected ,因为它只被子类使用。创建一个具体子类的实例时,其父类的构造方法被调用以初始化父类中定义的数据域。
2、注意事项
下面是关于抽象类值得注意的几点:
- 抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。换句话说,在继承自抽象类的非抽象子类中,必须实现所有的抽象方法。还要注意到,抽象方法是非静态的。
- 抽象类不能使用 new 操作符来初始化。但是,仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中调用。例如,GeometricObject 类的构造方法在 Circle 类和 Rectange 类中调用。
- 包含抽象方法的类必须是抽象的。然而,可以定义一个不包含抽象方法的抽象类。这个抽象类用于作为定义新子类的基类。
- 子类可以重写父类的方法并将它定义为抽象的。这很少见,但是它在当父类的方法实现在子类中变得无效时是很有用的。在这种情况下,子类必须定义为抽象的。
- 即使子类的父类是具体的,这个子类也可以是抽象的。例如,0bject类是具体的,但是它的子类如 GeometricObject可以是抽象的。
- 不能使用 new 操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。
3、为什么要使用抽象类
通过下面这个例子你将有所了解抽象类使用所带来的便捷。
pub1ic class TestGeometricObject {
/** Main method*/
pub1ic class TestGeometricObject {
/** Main method */
public static void main ( String [] args ){
//Create two geometric objects
GeometrcObjectgeoObject1= new Circle (5);
GeometricObject geoObject2= new Rectangle (5,3);
System . out .println(" The twO objects have the same агеа?"+equalArea(geoObject1,geoObject2));
//Display circle
displayGeometricObject(geoObject1);
// Display rectangle
displayGeometricObject(geoObject2);
}
/** A method for displaying a geometric objectI*/
public static void displayGeometricObject (GeometricObject object ){
System . out .println();
System . out .println(" The area is "+ object . getArea ());
System . out .print1n(" The perimeter is "+ object . getPerimeter ());
}
}
二、接口
1、概念
- 接口是一种与类相似的结构,用于为对象定义共同的操作。
- 接口在许多方面都与抽象类很相似,但是它的目的是指明相关或者不相关类的对象的共同行为。例如,使用适当的接口,可以指明这些对象是可比较的、可食用的或者可克隆的。
- 在 Java 中,接口被看作是一种特殊的类。就像常规类一样,每个接口都被编译为独立的字节码文件。使用接口或多或少有点像使用抽象类。例如,可以使用接口作为引用变量的数据类型或类型转换的结果等。与抽象类相似,不能使用 new 操作符创建接口的实例。
- 可以使用 Edible 接口来指定一个对象是否是可食用的。这需要使用 implements 关键字让对象所属的类实现这个接口。
- 类和接口之间的关系称为接口继承( interface inheritance )。因为接口继承和类继承本质上是相同的,所以我们将它们都简称为继承。
- 接口定义的通用格式:
public interface 接口名称
{
(方法头...)
}
2、注意事项
- 接口中的所有方法都是public,抽象方法
- 在Java中一个类可以实现一个或多个接口
- 接口中所列的方法必须在别处被重写
- 在接口中的所有属性都为 public、final 和 static
三、抽象类与接口的比较
语法方面的区别
区别 | 抽象类 | 抽象类 |
---|---|---|
关键字 | abstract class | interface |
字段 | 无限制 | 必须是public、static、final的 |
方法 | 可以含有普通方法,也和含有抽象方法 | 只能含有抽象方法,且必须是public的 |
继承/实现 | 只能被类或者抽象类继承 | 既可以被接口继承,也能被类或者抽象类实现 |
多重继承 | 不支持 | 可继承多个父接口 |