抽象类与接口
抽象类:
父类某些方法需要声明,但又不确定如何实现,可将其声明抽象方法,
【抽象类主要是为了防止创建父类对象】
抽象类与抽象方法
抽象方法没有方法体
类中有抽象方法,类必须声明为抽象类
一般来说,抽象类会被继承,其子类实现抽象方法
抽象类在框架与设计模式用的多
注意:【面试】
1 抽象类不能创建对象/不能被实例化
2 抽象类可以没有抽象方法,抽象类还是类
3 抽象方法必须在抽象类中,抽象方法不能有方法体
3 abstract只能修饰类与方法,不能修饰属性或其他
4 继承抽象类,其子类必须实现所有抽象方法,否则其也要是抽象类了
5 【抽象方法/抽象类 不能被private,final,static修饰,因为这些关键字与是与重写违背的】
接口:
interface 接口名{
属性
方法
}
jdk7之前接口中所有方法都没有方法体,都是抽象方法
jdk7及之后接口可以有静态方法,默认方法(default) (实现后的方法)
1 接口中抽象方法可以省略abstract
2 实现一个接口必须重写所有抽象方法
3 抽象类只能单继承,但是不重写还有此方法
4 接口多实现,实现一个接口必须重写所有抽象方法
抽象类与接口 像是 代码块与构造方法
【抽象类主要是为了防止创建父类对象】
【接口主要是为了规范,还是多实现的,没有限制】
【实现与继承一样,子类也可以用父类的所有东西】
应用:
编写3个类,分别完成对数据库mysql,Oracle,db2的连接 里面的方法名不一样
调用时非常麻烦
用接口规范其方法名就行
【接口主要是为了规范,还是多实现的,没有限制】
注意:
1 接口不能被实例化
2 接口中所有方法都是public的?【不对的,default】,抽象方法可以不用abstract修饰(证明不能是默认,可以看子类实现的方法,子类实现方法是默认会报错)
3 类实现接口要实现所有抽象方法
4 抽象类实现接口,可以不实现所有抽象方法
5 一个类可实现多接口(方法重名无所谓,反正我实现一个就行)(方法调用继承优先于接口实现)
6 接口的属性只能是public static fianl的,而且必须要初始化(public static fianl写法上可省略) 接口名.属性名访问
证明:static:接口名称直接点属性就能用 final 不能再次赋值 protected/private直接报错,默认用不同包访问证明
7 接口不能继承类,但可以【继承】多接口
8 接口修饰符只能是public或默认,与类一样
9 接口中可以没有抽象方法
【理解】继承与实现区别 【实现这种机制是对于Java单继承机制的一种补充】
老猴子与小猴子是继承关系
小猴子想要飞翔,就要实现/学习鸟的功能
小猴子想要游泳,就要实现/学习鱼的功能
只要继承了类,自然就会使用父类方法(即使不重写)(很自然的行为)(猴子会爬树,小猴子会爬树)【父亲】
实现是要重写接口方法的(有一个学习的过程) 【师傅】
【继承主要是解决代码复用性与可维护性问题】 【严谨,需要is-a】
【接口主要是解决 设计规范问题】 【灵活,like-a就行】 【接口一定程度上解耦:接口规范性+动态绑定机制】
(集合的源码常用)
接口的多态特性:
1 接口类型可以指向 实现类的对象 向上转型
2 多态参数 向上转型
3 多态数组 接口数组 调用特有要向下转型
【4 多态传递特性】
接口可以继承接口,继承后,本接口实现类不仅仅可以向上转型为直接实现的接口,还可以向上转型为父接口
类继承类同时实现接口
调用的变量在继承的类与接口中都有,会报错(区分:继承类的变量用super,接口的变量用接口名点)this用本类,没有用局部变量