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实例化接口,利用工厂设计模式。
posted @ 2020-09-08 12:32  雨中遐想  阅读(107)  评论(0编辑  收藏  举报