一.抽象类
在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:
abstract void fun();
抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象,但是抽象类中并不只能有抽象方法。抽象类和常规类很像,同样可以拥有成员变量和普通的成员方法,但不能使用new操作符创建他的实例。它的实现由子类提供。
抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。
下面是关于抽象类值得注意的几点:
- 抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。换句话说,在抽象类扩展的非抽象子类中,必须实现所有的抽象方法。还要注意到,抽象方法是非静态的。
- 抽象类是不能使用 new 操作符来初始化的。但是,仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中调用。例如,CeometricObject 类的构造方法在Circle 类和 Recfange 类中调用。
- 包含抽象方法的类必须是抽象的。但是,可以定义一个不包含抽象方法的抽象类。在这种情况下,不能使用 new 操作符创建该类的实例。这种类是用来定义新子类的基类的。
- 子类可以重写父类的方法并将它定义为 abstract。这是很少见的,但是它在当父类的方法实现在子类中变得无效时是很有用的。在这种情况下,子类必须定义为abstracto
- 即使子类的父类是具体的,这个子类也可以是抽象的。例如,Object 类是具体的,但是它的子类如 CeometricObject 可以是抽象的。
- 不能使用 new 操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。
下面是一个简单的抽象类的继承及实现
public class demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
door demo =new door();
demo.open();
demo.close();
//抽象类用作一种数据类型。
door1[] text =new door1[10];
text[0] =new door();
text[0].open();
text[0].close();
}
}
abstract class door1{
public abstract void open();
public abstract void close();
}
class door extends door1{
public void open() {
System.out.println("Please open");
}
public void close() {
System.out.println("Please close");
}
}
二.接口
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口是解决Java无法使用多继承的一种手段.
下面是一个简单的接口的继承及实现
public class demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
door demo =new door();
demo.open();
demo.close();
demo.warn();
}
}
interface door1{
public abstract void open();
public abstract void close();
}
interface door2{
public abstract void warn();
}
class door implements door1 , door2{
public void open() {
System.out.println("Please open");
}
public void close() {
System.out.println("Please close");
}
public void warn() {
System.out.println("!!!!!!!!");
}
}
三.抽象类与接口的操作实例
public class demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
door demo =new door();
demo.open();
demo.close();
demo.warn();
}
}
abstract class door1{
public abstract void open();
public abstract void close();
}
interface door2{
public abstract void warn();
}
class door extends door1 implements door2{
public void open() {
System.out.println("Please open");
}
public void close() {
System.out.println("Please close");
}
public void warn() {
System.out.println("!!!!!!!!");
}
}
四.抽象类和接口的对比
比较点 | 抽象类 | 接口 |
---|---|---|
关键字 | abstract class | interface |
字段 | 无限制 | 必须是public、static和final的 |
方法 | 既可以含普通方法也可以含抽象方法 | 只能含抽象方法,且必须是public的 |
继承/实现 | 只能被类或抽象类继承 | 既可以被接口继承,也能被类或抽象类继承 |
多重继承 | 不支持 | 可以继承多个父接口 |
五.什么时候使用抽象类和接口
- 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
- 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
- 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。