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