一、抽象类
1.什么是抽象类?
让我们先来看看百度是怎么解释的:
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
其实,类本身就是一种抽象概念,但它又是具体的事物,所以就被称为具体类,抽象类似乎就是将本身我们人为划分的类中有共性的再进一步的进行提取划分,进一步抽象化,这样它就不具备实例化对象的特性,它是无法初始化的类。
2.为什么要有抽象类呢?它的意义何在?
我们来看这样一幅图。
我们可以创建出一个猫的对象,也可以创建出一个狗的对象,但是假如我们创建一个猫科动物的对象或是犬科动物的对象,那我们具体应该创建哪种动物呢?
是要创建猫呢还是狮子呢?是创建狗呢还是创建狼呢?再大一点,如果我们创建动物对象,那完了,这么多动物,到底是创建那个呢?难不成创建一个杂交物种?
所以,我们从这里可能会有点感觉到什么是抽象类和为什么要有抽象类的概念,因为无论是猫科动物类还是犬科动物类,都是不应该可以创建对象的,它们不应该被初始化。
但是我们一定要有他们来构建树,来继承和产生多态,这体现了java的面向对象的思想,那应该怎么办呢?
那我们就只要有限制它们,只有它们的子类,具体的类才能创建对象不就可以了吗,这也是抽象类的目的,防止不应该创建对象的类创建对象。
3.抽象类和方法的定义
抽象类和方法用 abstract 关键字来定义。
定义格式如下:
抽象类:
abstract class 类名 {
}
抽象方法:public abstract 返回值类型 方法名(参数);
public abstract class Employee { //abstract关键字修饰的抽象类 private String name; private int number; private String job; private double salary; private double bounes; //抽象方法,没有方法体! public abstract void work(); public abstract void welfare(); }
注意:
①抽象方法必须写在抽象类中,但是抽象类中不一定要写抽象方法。
②任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
③构造方法,类方法(用static修饰的方法)不能声明为抽象方法。
public abstract class MaintainDepartment extends Employee{ //这是一个Employee的子抽象类 String CheckIn; //既可以重写父类中的抽象方法,写成实现类 public void work() { System.out.println("维护工作"); } public void welfare() { System.out.println("撸猫"); } //也可以不重写抽象方法,由MaintainDepartment的子类去实现这个方法 public abstract void skill(); }
4.抽象方法的意义和好处
抽象方法的意义在于,我们将可继承的方法体放在父类中,但父类没有办法做出任何子类都有意义的共同程序代码,这时我们用抽象方法,就算无法实现出方法的内容,还是可以定义出一种子类共同的协议。
抽象方法的好处就是多态。我们可以加入新的子类到程序中,也不必重写或修改处理这些类型的程序。
二、接口
1.什么是接口?
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。
比如说:电脑的电源插头就是一个接口,它就是为了实现充电的功能,让我们不必去关心怎么充电的(电流,电压...),只要将电源线插入这个接口就可以实现充电的功能能。
2.为什么要有接口?
先来看一个问题,类只能单继承,因为多重继承可能会出现“致命方块(形状看起来像扑克牌的方块)”的问题
所以,为了解决多继承的问题,又不会产生致命方块的问题,接口就华丽的出现在了我们的舞台。
接口是怎么解决这个问题的呢?
它把全部方法都设为了抽象的!这样子类就必须要实现此方法,因此虚拟机执行时就不会搞不懂用哪个继承的版本了。
3.接口的定义
接口定义时需要使用interface关键字。
注意:定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件。这点可以让我们将接口看做是一种只包含了功能声明的特殊类。
public interface 接口名 {
抽象方法1;
抽象方法2;
抽象方法3;
}
public interface HighPoint { public void autoPark(); public void autoRun(); }
4.类实现接口
类与接口的关系为实现关系,即类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements。
在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑。
public class NewPhone extends Phone implements IPlay{ public void Call() { System.out.println("键盘"); } public void SendMessage() { System.out.println("按键"); } public void PlayGame() { System.out.println("王者荣耀"); } }
5.接口和抽象类的异同点
相同点:
- 都位于继承的顶端,用于被其他类实现或继承;
- 都不能直接实例化对象;
- 都包含抽象方法,其子类都必须覆写这些抽象方法;
区别:
- 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;
- 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
- 抽象类是这个事物中应该具备的你内容, 继承体系是一种 is..a关系
- 接口是这个事物中的额外内容,继承体系是一种 like..a关系
二者的选用:
优先选用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;
6.接口的成员特点
- 接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变。后面我们会讲解static与final关键字
- 接口中可以定义方法,方法也有固定的修饰符,public abstract
- 接口不可以创建对象。
- 子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。
原文地址:https://www.cnblogs.com/LuckyGJX/p/8948332.html