接口和抽象类的区别与联系

文章目录

  • 一、抽象类的基础语法
  • 二、接口的基础语法
  • 三、接口在开发中的作用
  • 四、接口和抽象类的联系
    • 4.1 都不能被实例化
    • 4.2 都可以包含抽象方法
  • 五、接口和抽象类的区别
    • 5.1 二者设计目的上的差异
      • 5.1.1 接口体现的是一种规范
      • 5.1.2 抽象类体现的是一种模板类设计
    • 5.2 二者在用法上的差异
      • 5.2.1 是否可以包含普通方法
      • 5.2.2 是否可以包含静态方法
      • 5.2.3 是否可以定义普通成员变量
      • 5.2.4 是否可以包含构造器
      • 5.2.5 是否可以包含初始化块
      • 5.2.6 是否可以多继承
  • 六、何时用接口或抽象类
  • 总结



一、抽象类的基础语法

	1、定义:在class前添加abstract关键字
	2、抽象类无法实例化,无法创建对象,所以抽象类是用来被子类继承的
	3、final和abstract不能联合使用,这两个关键字是对立的
	4、抽象类的子类可以是抽象类,也可以是非抽象类
	5、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的
	6、抽象类不一定有抽象方法,抽象方法必须出现在抽象类中
	7、抽象方法怎么定义:public abstract void doSome();【用abstract修饰;不带大括号。】
	8、(*****五颗星):一个非抽象的类,继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现。

拓展:
面试判断题:
java语言中凡是没有方法体的方法都是抽象方法。

错误的。Object类中就有很多方法都没有方法体,都是以“;”结尾的,但他们都不是抽象方法
例如:public native int hashCode();这个方法底层调用了C++写的动态链接库程序。前面修饰符列表中没有:abstract。有一个native。表示调用JVM本地程序。

二、接口的基础语法

	1、接口是一种“引用数据类型”。
	2、接口是完全抽象的。
	3、接口怎么定义:[修饰符列表] interface 接口名{}
	4、接口支持多继承。
	5、接口中只有常量+抽象方法。
	6、接口中所有的元素都是public修饰的
	7、接口中抽象方法的public abstract可以省略。
	8、接口中常量的public static final可以省略。
	9、接口中方法不能有方法体。
	10、一个非抽象的类,实现接口的时候,必须将接口中所有方法加以实现。
	11、一个类可以实现多个接口。
	12、extends和implements可以共存,extends在前,implements在后。
	13、使用接口,写代码的时候,可以使用多态(父类型引用指向子类型对象)。

三、接口在开发中的作用

接口在开发中的作用,类似于多态在开发中的作用。
多态:面向抽象编程,不要面向具体编程。降低程序的耦合度。提高程序的扩展力。

public class Master{
	public void feed(Dog d){}
	public void feed(Cat c){}
	//假设又要养其它的宠物,那么这个时候需要再加1个方法。(需要修改代码了)
	//这样扩展力太差了,违背了OCP原则(对扩展开放,对修改关闭。)
}

public class Master{
	public void feed(Animal a){
		// 面向Animal父类编程,父类是比子类更抽象的。
		//所以我们叫做面向抽象编程,不要面向具体编程。
		//这样程序的扩展力就强。
	}
}

面向抽象编程这句话以后可以修改为:面向接口编程。
有了接口就有了可插拔。可插拔表示扩展力很强。不是焊接死的。
主板和内存条之间有插槽,这个插槽就是接口,内存条坏了,可以重新买一个换下来。这叫做高扩展性。(低耦合度。)

接口在现实世界中的例子:

螺栓和螺母之间有接口
灯泡和灯口之间有接口
笔记本电脑和键盘之间有接口(usb接口,usb接口是不是某个计算机协会制定的协议/规范。)

接口有什么用?扩展性好。可插拔。
接口是一个抽象的概念。

另外举一个去饭馆吃饭的例子:

	接口是抽象的。菜单是一个接口。(菜单上有一个抽象的照片:西红柿炒鸡蛋)
	谁面向接口调用?(顾客面向菜单点菜,调用接口。)
	谁负责实现这个接口?(后台的厨师负责把西红柿鸡蛋做好!是接口的实现者。)
	这个接口有什么用呢?
		这个饭馆的“菜单”,让“顾客”和“后厨”解耦合了。
		顾客不用找后厨,后厨不用找顾客。他们之间完全依靠这个抽象的菜单沟通。

总结接口的作用:三个字“解耦合
面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。
接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度。)
接口可以解耦合,解开的是谁和谁的耦合!!!
任何一个接口都有调用者和实现者。
接口可以将调用者和实现者解耦合,
调用者面向接口调用,
实现者面向接口编写实现。

以后进行大项目的开发,一般都是将项目分离成一个个模块,模块和模块之间采用接口衔接,降低耦合度。

四、接口和抽象类的联系

接口和抽象类很像,它们都有如下特征:

4.1 都不能被实例化

接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承

4.2 都可以包含抽象方法

接口和抽象类都可以包含抽象方法,实现接口或者继承抽象类的普通子类都必须实现这些抽象方法

五、接口和抽象类的区别

5.1 二者设计目的上的差异

5.1.1 接口体现的是一种规范

接口作为系统与外界交互的窗口,体现的是一种规范,接口规定了实现者必须向外提供哪些服务(以方法的形式来提供服务);
对于接口的实现者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务(就是如何来调用方法);
当在一个程序中使用接口时,接口是多个模块间的耦合标准;
当在多个应用程序之间使用接口时,接口时多个程序之间的通信标准;
从某种程度上来看,接口类似于整个系统的“总纲”,它制定了系统各模块应遵循的标准,因此一个系统中的接口不应该经常改变。一旦接口改变将会导致系统中的大部分类都需要改写。

5.1.2 抽象类体现的是一种模板类设计

抽象类作为系统中多个子类的共同父类,它所体现的是一种模板式设计。
作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能(哪些已经提供实现类的方法),但这个产品依然不能当成最终产品,必须有更进一步的完善,这种完善可能有几种不同方式。

5.2 二者在用法上的差异

5.2.1 是否可以包含普通方法

接口里只能包含抽象方法,不包含已经提供实现的方法;抽象类则完全可以包含普通方法。

5.2.2 是否可以包含静态方法

接口里不能定义静态方法;抽象类可以定义静态方法。

5.2.3 是否可以定义普通成员变量

接口里只能定义静态常量Field(成员变量),不能定义普通Field;抽象类里既可以定义普通Filed,也可以定义静态常量Field。

5.2.4 是否可以包含构造器

接口里不包含构造器;抽象类里可以包含构造器,但构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。

5.2.5 是否可以包含初始化块

接口里不能包含初始化块;但抽象类完全可以包含初始化块。

5.2.6 是否可以多继承

一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。

六、何时用接口或抽象类

is a(继承)、has a(关联)、like a(实现)

		is a:
			Cat is a Animal(猫是一个动物)
			凡是能够满足is a的表示“继承关系”
			A extends B

		has a:
			I has a Pen(我有一支笔)
			凡是能够满足has a关系的表示“关联关系”
			关联关系通常以“属性”的形式存在。
			A{
				B b;
			}
		
		like a:
			Cooker like a FoodMenu(厨师像一个菜单一样)
			凡是能够满足like a关系的表示“实现关系”
			实现关系通常是:类实现接口。
			A implements B

总结

接口使用的比抽象类多,一般抽象类使用的少。
接口一般都是对“行为”的抽象。

你可能感兴趣的:(java基础,java开发,java,jvm,开发语言)