Java 抽象类和接口
抽象类
抽象类就是指在普通类的结构里面增加抽象方法的组成部分。
拥有抽象方法的类一定属于抽象类,抽象类要使用abstract声明。
抽象类不能实例化。
抽象类必须有子类,子类如果不是抽象类,那么必须覆写抽象类的全部抽象方法。
任何类中存在static方法的时候可以不需要实例化直接调用方法(类.static方法)
接口
如果一个类之中只是由抽象方法和全局常量所组成,那么在这种情况下不能定义为抽象类,只能定义为接口。
定义接口:
interface A
{
//全局常量
public static final String STR = "Hello World!";
//抽象方法
public abstract void fun();
}
接口存在抽象方法,不能直接实例化。
- 接口必须存在子类,此时一个子类可以使用implements关键字实现多个接口;
- 接口的子类如果不是抽象类,必须覆写接口中的全部抽象方法;
- 接口的对像可以利用子类对象的向上转型操作实现。
package com.testInterface;
interface A
{
public static final String STR = "Hello World";
public abstract void funA();
}
interface B
{
public abstract void funB();
}
class X implements A,B
{
//实现接口A的抽象方法
public void funA()
{
System.out.println("A接口的抽象方法");
}
//实现接口B的抽象方法
public void funB()
{
System.out.println("B接口的抽象方法");
}
}
public class TestDemo
{
public static void main(String[] args)
{
X x =new X();
System.out.println(x instanceof A);
System.out.println(x instanceof B);
System.out.println(x instanceof X);
}
}
结果
true
true
true
对象x即是X类,也是A、B接口。
如果子类除了接口之外,还要继承抽象类,语法先使用extends继承,而后使用implements实现。
class X extends C implements A,B
对于接口而言,只有抽象方法和全局常量,并且在方法上是否写public结果都一样,
全局常量也可以不写public static final
下面两种接口的定义完全相同。
interface A
{
public static final String STR = "Hello World";
public abstract void funA();
}
interface A
{
String STR = "Hello World";
void funA();
}
一个抽象类可以继承一个抽象类,一个接口却可以使用extends同时继承多个接口(但是接口不能继承抽象类,因为如果继承抽象类的话就必须实现其中的抽象方法,而接口中只能是抽象方法)。
- 接口的主要功能是解决单继承局限问题。
- 接口里面可以定义普通内部类,抽象内部类 ,内部接口。
- 在一个接口里面如果使用了static去定义一个内部接口表示是一个外部接口。
接口在实际的开发中的三大核心作用:
- 定义不同层之间的操作标准;
- 表示一种操作能力;
- 表示将服务器端的远程方法视图暴露给客户端。
抽象类和接口的区别
No. 区别 抽象类 接口
1 关键字 abstract class interface
2 组成 构造方法、普通方法、抽象方法、static方法、常量、变量 抽象方法、全局常量、default方法(1.8+)
3 子类使用 class 子类 extends 抽象类 class 子类 implements 接口,接口…
4 关系 抽象类可以实现多个接口 接口不能继承抽象类,却可以继承多个父接口
5 权限 可以使用各种权限 只能使用public权限
6 限制 一个子类只能继承一个抽象类(单继承局限) 没有单继承局限
7 子类 抽象类和接口必须有子类,子类必须实现所有抽象方法
8 实例化 依靠子类的向上转型进行对象的实例化
No. | 区别 | 抽象类 | 接口 |
---|---|---|---|
1 | 关键字 | abstract class | interface |
2 | 组成 | 构造方法、普通方法、抽象方法、static方法、常量、变量 | 抽象方法、全局常量、default方法(1.8+) |
3 | 子类使用 | class 子类 extends 抽象类 | class 子类 implements 接口,接口… |
4 | 关系 | 抽象类可以实现多个接口 | 接口不能继承抽象类,却可以继承多个父接口 |
5 | 权限 | 可以使用各种权限 | 只能使用public权限 |
6 | 限制 | 一个子类只能继承一个抽象类(单继承局限) | 没有单继承局限 |
7 | 子类 | 抽象类和接口必须有子类,子类必须实现所有抽象方法 | 相同 |
8 | 实例化 | 依靠子类的向上转型进行对象的实例化 | 相同 |
经过比较可以发现,抽象类中支持的功能绝对要比接口更多,但是抽象类不能多继承,这就掩盖里抽象类的所有优点,即:当抽象类和接口都可以使用的时候,优先使用接口。
不成文的参考:
- 在进行某些公共操作的时候一定要 定义接口;
- 有了接口就需要子类完善方法;
- 如果是自己写的接口,那么绝对不要使用关键字new实例化接口,利用工厂设计模式。