JAVA 抽象类和接口
一、抽象类
定义
- 在继承的层次结构中,每个新子类都使类变得越来越明确和具体。如果从一个子类追溯到父类,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类(abstract class)
提示:抽象类不可以用于创建对象。抽象类可以包含抽象方法,这些方法将在具体的子类中实现
因为类的设计应该确保父类包含它的子类的共同特征,所以父类应该具有同一类型子类共有的一些方法,例如GeometricObject类 定义成 Circle 类和 Rectangle 类的父类。而Circle 类和 Rectangle 类分别包含计算圆和矩形的面积和周长的方法 getArea()和 getPerimeter(),所以最好在GeometricObject 类中定义 getArea() 和 getPerimeter() 方法 (如下图) 。但是,这些方法不能在 GeometricObject类中实现,因为它们的实现取决于几何对象的具体类型。这样的方法称为抽象方法(abstract method )
public abstract class GeometricObject {
public String color = "white";
private boolean filled;
private java.util.Date dateCreated;
protected GeometricObject() {
dateCreated = new java.util.Date();
}
protected GeometricObject(String color, boolean filled) {
dateCreated = new java.util.Date();
this.color = color;
this.filled = filled;
}
public abstract double getArea();
public abstract double getPerimeter();
}
创建一个抽象类的方法及注意点
- 从上图GeometricObject类可知,一个抽象类需要在方法头中用abstract修饰符表示。
- 抽象类和常规类很像,但是不能使用 new 操作符创建它的实例。一个包含抽象方法的类必须声明为抽象类。
- 抽象类的构造方法定义为 Protected, 因为它只被子类使用。创建一个具体子类的实例时,它的父类的构造方法被调用以初始化父类中定义的数据域。
二、接口
定义
- Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
- 接口在许多方面都与抽象类很相似,但是它的目的是指明相关或者不相关类的多个对象的共同行为。
- 同时,接口只包含常量和抽象方法(即只有方法标识符,而没有方法体)。
**
java之所以使用接口的最大原因:
Java不像C++一样支持多继承,而通过接口可以弥补这个局限。
创建接口
为了区分接口和类,Java 采用下面的语法来定义接口:
修饰符 interface 接口名{
/** 常数声明 */
/** 方法签名 */
}
举例:
1.创建一个Something接口:
public interface Something {
void doSomething();
}
2.创建一个ClassA类:
public class ClassA {
public void doSomething() {
System.out.println("A doSomething");
}
}
3.分别继承Something接口和ClassA类 :
public class TestSomething extends ClassA implements Something{
public void doSomething() {
System.out.println("B doSomething");
}
public static void main(String[] args) {
ClassA a1 = new TestSomething();
a1.doSomething();
a1 = new ClassA();
a1.doSomething();
}
}
提示:这需要使用 implements 关键字让对象的类实现这个接口来完成。
类和接口之间的关系称为接口继承( interface inheritance)。因为接口继承和类继承本质上是相同的,所以我们将它们都简称为继承。