对于Java面向对象编程来说,抽象也是它的一个重要特征。在 Java 中,可以通过两种形式来体现 面向对象(OOP)的抽象:接口和抽象类。这篇文章就为大家介绍这两个的相似与区别之处。
在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:
abstract void fun();
抽象方法必须用 abstract 关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用 abstract 关键字修饰。
抽象类的声明格式:
[public] abstract class ClassName {
abstract void fun();
}
对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为 abstract 方法,此时这个类也就成为 abstract 类了。
(1)有抽象方法的类,一定是抽象类;抽象类不一定有抽象方法。
(2)当子类继承抽象类时,必须要将抽象类中的抽象方法全部实现(或者称为重写),否则子类依然是抽象类。
(3)因为子类是继承父类全部内容,所以也就相当于子类中也有了抽象方法,通过重写,可以将抽象方法覆盖。
(1)抽象类中可以有抽象方法,也可以没有抽象方法
(2)抽象类中可以有普通方法,也可以没有普通方法
(3)抽象类不能实例化(不能通过new来创建对象)
(4)没有抽象构造方法,也没有抽象静态方法
示例:
public abstract class A {public abstract void testA();}
接口,英文称作 interface,在软件工程中,接口泛指供别人调用的方法或者函数。接口是常量和抽象方法的集合。接口的声明格式:
public interface InterfaceName {
}
接口中可以含有变量和方法。
接口的实现需要通过implements关键字,一个实现类可以实现多个接口,多个接口使用逗号隔开,声明格式如下:
class ClassName implements Interface1,Interface2,[....]{
}
注意:一个类实现某一个接口,在这个类中,要重写接口中的所有方法,如果不重写,那么这个类要声明为抽象类。
(1)接口是一个特殊的抽象类,也不能实例化
(2)接口中的方法都是抽象方法,默认访问修饰 public abstract
(3)一个类实现某一个接口,在这个类中,要重写接口中的所有方法,如果不重写,那么这个类要声明为抽象类
(4)接口中的变量都是静态常量,默认修饰符为 public static final
(5)无构造方法
(1)接口做系统与外界交互的窗口 :接口提供服务
(2)接口本身一旦制定,就不允许随意修改
(1)代表系统的抽象层
(2)都不能被实例化
(3)都能包含抽象方法
(4)用于描述系统提供的服务,不必提供具体实现
(1)在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
(2)抽象类便于复用,接口便于代码维护
(3)一个类只能继承一个直接的父类,但可以实现多个接口
一个类只能有一个直接父类,防盗门只能继承门或者继承锁,如何实现防盗门即有门的功能又有锁的功能,这时候就可以用到接口。
主类:Door类
public abstract class Door{//开门public abstract void openDoor();//关门public abstract void closeDoor();}
接口:Lock
public interface Lock {// 开锁void openLock();// 上锁public abstract void closeLock();}
子类:FangDaoDoor类
public class FangDaoDoor extends Door implements Lock {@Overridepublic void openDoor() {System.out.println("轻轻一推,门开了");}@Overridepublic void closeDoor() {System.out.println("轻轻一拉,门关了");}@Overridepublic void openLock() {System.out.println("插入钥匙,左转三圈,锁开了");}@Overridepublic void closeLock() {System.out.println("插入钥匙,右转三圈,上锁了");}}
测试类:Test类
public class Test {public static void main(String[] args) {FangDaoDoor fdd = new FangDaoDoor();fdd.closeDoor();fdd.closeLock();System.out.println("出去玩了2个小时,回家");fdd.openLock();fdd.openDoor();}}
结果: