抽象类
1.抽象类是什么?
在了解抽象类之前,先来了解一下抽象的意义吧:
- 抽象:不具体,太笼统,细节不明确。
也就是说抽象的意思是指事物的具体细节不明确,只有笼统的概念
抽象类:只需在 class
关键字前添加abstract
关键字即可,但是抽象类不能实例化,一般会常作为某些类的父类使用。
关于抽象类不能实例化这点比较好理解
比方说:狼和羊,都是动物,它们都在动物的范畴内,而动物都会进食,但是不同种类的动物进食的对象是不一样的,羊吃素,狼吃荤,不能因为狼吃荤就代表所有的动物都吃荤,同理也不能因为羊吃素就代表所有动物吃素,所有没有哪个动物可以代替“动物”的吃法,它只能作为一个分类使用。
在程序里也同理
我定义一个动物类(父类)的抽象类,其中有一个吃的方法,但是我没办法定义方法内的方法体,因为我不知道接下来会是哪个子类会继承我吃的方法,如果我在吃的方法内加入吃肉的方法体,而羊子类继承了父类的吃肉方法,可是羊能吃肉吗?显然不能,所以只能定义一个抽象(笼统)的吃方法。
结论:抽象类不需要写方法体,也不能创建对象,子类继承父类时,必须要进行抽象方法重写,否则子类也必须定义为抽象类
2.为啥要用抽象类?
正如上面所讲,既然子类都需要重写,那么干脆不在父类定义了,在子类定义不行?在多态中,使用父类的引用,那么父类的引用实质上目前指向了子类的对象,所以说如果调用了父类的方法,实质上执行的是子类重写后的,但是如果父类没有这个方法,那么将无法执行对应子类的具体方法,所有父类中必须定义此方法。
3.抽象类的特点
- 被abstract关键字修饰
public abstract class 类名{}
- 抽象类无法创建对象,但是可以通过匿名内部类委婉创建。
- 抽象类无法创建对象,但是依然可以拥有构造方法,同样也可以作为子类对象的引用。
有抽象方法的类一定是抽象类,但是抽象类不一定有抽象方法
- 子类继承抽象父类之后,一定要重写父类的所以抽象方法,如果不重写子类也变为抽象类。
- 抽象类没有方法体。
- 构造方法不能抽象,静态方法不能抽象。
接口
1.为什么使用接口?
按照之前所学的知识无法合理解决问题,不能让防盗门继承们的同时又继承锁,原因有两点:1.防盗门不是锁,不符合继承中的is a 的逻辑关系,2.Java中只支持单根继承即只能继承一个父类(你只有一个亲爹)
2.接口的介绍
接口的含义过于广义,所以现在认识几个主要含义即可。
硬件接口:USB接口、电源接口、网线接口等。
第三方提供的接口:如果我们想开发一款天气app,不可能每天出去检测各地天气,但是又气象局专门检测天气,而且气象局的开发人员都将这些数据以接口(API)形式公开了,只需要按照接口的要求,传入合理的资质、地址和查询信息等即可。
Java中的接口:Java中接口和上方的接口含义很接近,但是又不太一样,它被interface
关键字修饰,属于引用数据类型,另外和抽象类一样没有办法实例化。
3.接口的使用场景
①:类与类之间需要特定的接口进行协调,而不在乎其如何实现。
②:作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
③:需要将一组类视为单一的类,而调用者只通过接口来与这组类发声联系。
④:需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。
4.接口的注意事项
接口里的方法都是被 public abstract 修饰(默认)的抽象方法。
属性都是 public final static 修饰(默认)的静态常量。(被final修饰的属性变为常量,无法二次赋值,被final修饰的方法无法被子类重写,而被final修饰的类无法被继承
)
Java里不允许多重继承,所以如果要实现多个类的功能,则可以同过实现多个接口来实现
5.抽象类和接口的区别
-
相同点
代表系统的抽象层
都不能被实例化
都不能包含抽象方法
用于描述系统提供的服务,不必提供具体实现
-
不同点
在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
抽象类便于复用,接口便于代码维护
-
使用原则
接口做系统与外界交互的窗口
接口提供服务
接口本身一旦制定,就不允许随意更改
抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点