抽象类与抽象方法
abstract
关键字
abstract
抽象的,可以用来修饰:类和方法abstract
修饰类(抽象类):- 此类不能实例化
- 抽象类中也含有构造器,便于子类实例化调用
- 一般会提供抽象类的子类,让其子类进行实例化,来实现相关功能
abstract
修饰方法(抽象方法):- 抽象方法只有方法的申明,没有方法体
- 含有抽象方法的类一定是抽象类;抽象类中不一定含有抽象方法
- 若子类重写了父类中所有抽象方法,则子类方可实例化;若子类没有重写父类中所有抽象方法,则此子类也为抽象类
- 抽象类的应用场景:
- 抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类
- 如:计算车辆的燃料与里程的关系时,不同类型车辆,两者之间的关系不同
- 抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类
abstract
使用的注意点:abstarct
不能修饰私有方法、静态方法、final
修饰的方法- 因为只有静态方法才能被重写
- 抽象类可以存在多态的情形
- 抽象类的匿名子类对象:
- 匿名对象:
new 类名()
,没有给实例化的对象赋给变量 - 抽象类的匿名子类:
new 匿名父类名(){抽象父类中匿名方法的重写代码}
- 匿名对象:
模板方法的设计模式
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模 板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象 类的行为方式
具体应用:
在软件开发中实现一个算法时,整体步骤很固定、通用, 这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式
接口(interface)
为什么引入接口:
- 一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方 法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果
- 另一方面,有时必须从几个类中抽取出一些共同的行为特征,而它们之间又 没有is-a的关系,仅仅是具有相同的行为特征而已。例如:鼠标、键盘、打 印机、扫描仪、摄像头、充电器、MP3机、手机、数码相机、移动硬盘等都 支持USB连接
接口的使用和说明:
- 接口使用
interface
来定义 - 在
java
中,接口和类是并列的两个结构 - 定义接口:定义接口中的成员
JDK7及以前
:只能定义全局常量和抽象方法- 全局常量的申明:
public static final
,在接口中也可以省略,默认所有量为全局常量
- 全局常量的申明:
JDK8及以后
:除了定义全局常量和抽象方法外,还可以定义静态方法,默认方法
- 接口中不能定义构造器–>>接口不能实例化
- 在
Java
中,接口通过类去实现(implements
)的方式来使用- 若实现类实现了接口中的所有抽象方法,则此实现类可以实例化;否则,此实现类仍为一个抽象类
java
类可以实现多个接口,弥补了类的单继承性- 格式:
class 类名 extends 父类名 implements 接口1,接口2...
- 格式:
- 接口与接口之间可以继承,而且存在多继承
- 格式:
interface 接口1 extends 接口2,接口2,...
- 格式:
- 接口也体现了多态性
- 接口也是一种规范
- 接口也可以实现匿名实现类的匿名对象
关于接口的面试题:
No.1
问题:编译不通过
问题解决:如何指定调用父类还是引用中的变量:
No.2
java8
中接口的新特性:
- 接口成员含有:全局常量,抽象方法,静态方法,默认方法
- 静态方法在接口的实现类中不可见
- 实现类的对象可以调用接口中的默认方法,并且实现类可以重写接口中的默认方法
- 若子类(或实现类)继承的父类与实现的接口中含有同名同参数的方法,则默认调用的是父类中同名同参数的方法
- 若实现类实现多个接口,这多个接口中定义了同名同参数方法,则实现类没有对此方法进行重写的情况下,会出现编译报错(冲突)
- 直接在实现类中调用接口中的定义的默认方法:
接口名.super.默认方法
- 默认方法:
default
关键字修饰的方法
内部类的使用
在Java
中,允许一个类的定义位于另一个类的内部,前者称为内部类(Inner class
),后者 称为外部类
内部类的分类:
- 成员内部类(类内):静态成员内部类 vs 非静态成员内部类
- 作为一个类:
- 类内可以定义属性,方法 ,构造器等
- 可以被
final
等关键字修饰
- 作为外部类成员:
- 可以调用外部类的结构:
外部类名.this.成员
- 可以被
static
和四种权限修饰符修饰
- 可以调用外部类的结构:
- 实例化成员内部类:
new 外部类名.内部成员类名
- 调用内部类的属性:
this.属性
- 调用外部类属性:
外部类名.this.属性
- 作为一个类:
- 局部内部类(方法内,代码块内,构造器):
- 应用场景:返回一个实现了某个接口的实现类
- 注意点:在局部内部类中的方法中,如果调用外部类类所申明的方法中的局部变量,要求此局部变量为
final