一、抽象类
1、抽象类和抽象方法
抽象方法只有方法签名,没有方法的具体实现。
抽象方法和抽象类使用abstract关键字进行定义。
抽象类和抽象方法的规则如下:
A、抽象方法和抽象类使用abstract关键字修饰,抽象方法中不能有方法体。
B、抽象类不能被new实例化。(即使抽象类里不包含抽象方法,也不能创建实例。)
C、抽象类可以包含属性、方法(普通方法和抽象方法均可)、构造函数、初始化块、内部类、枚举类。抽象类的构造函数不能创建实例,主要是用于被其子类调用。
D、含有抽象方法的类必须被定义为抽象类。
注意:(1)、抽象类一定是一个父类。
(2)、abstract不能用于修饰属性和局部变量。(即没有抽象变量和抽象属性的说法)
(3)、abstract不能用于修饰构造函数。
(4)、abstract关键字不能与private、static、final进行组合。
(5)、子类需要覆写抽象类的所有抽象方法后才能创建对象,否则子类也是一个抽象类。
2、抽象类的作用
抽象类体现的是一种模板模式的设计,抽象类可以作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大体保留抽象类的行为方式。
二、接口
1、接口的定义
接口(interface)是一种特殊的抽象类。
定义接口的基本语法:
[修饰符] interface 接口名 [extends 父接口1,父接口2...]
{
零到多个常量定义…
零到多个抽象方法定义...
}
接口的特点:
(1)、接口是对外暴露的规则,即所有成员的访问权限都是public的。
(2)、接口是程序的功能扩展。
(3)、接口可以用来多实现。
(4)、类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。
(5)、接口与接口之间可以有继承关系。
注意:(1)、接口里不能包含普通方法,接口里所有方法都是抽象方法。
(2)、接口里不能包含构造函数和初始化语句块。
(3)、接口中的成员都是public访问权限。定义接口时,可以省略public修饰符。接口中的常量属性默认为public static final修饰;接口中的方法总是使用public abstract修饰;接口中的内部类和枚举类总是采用public static修饰。
(4)、接口支持多继承。(注意其与一般类的区别。)
2、接口的实现
接口的主要作用就是被实现类实现。
一个类可以实现多个接口,实现时使用implements关键字。
实现的语法:
[修饰符] class 类名 implements 接口1,接口2...
{
类体
}
一个类实现多个(含一个)接口后,需要完全实现这些接口中所定义的方法;
注意:(1)、实现接口的方法时,必须使用public访问权限修饰符。
注意接口和抽象类的区别:
(1)、接口中只能包含抽象方法;
(2)、接口中不能定义静态方法;
(3)、接口里只能定义静态常量属性,不能定义普通属性;
(4)、接口不能包含构造器;
(5)、接口中不能包含初始化块;
三、多态
1、多态性
Java应用变量有两个类型:一个是编译时类型,一个是运行时类型。如果编译时类型和运行时类型不一致,这种现象就称为多态。也可以简单理解为某类事物存在多种形态。
编译时的类型是由声明该变量时所使用的类型决定,运行时类型是由实际赋给该变量的对象决定。
多态的特点:
(1)、成员函数:编译时要查看引用变量所属的类中是否有所调用的成员;在运行时要查看对象所属类中是否有所调用的成员。
(2)、成员变量:只看引用变量所属的类。也可以说对象的属性不具备多态性。
2、instanceof运算符
instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类或接口。它用于判断前面的对象是否是后面的类、或者其子类、实现类的实例。如果是,则返回ture,否则返回fasle。
instanceof运算符的作用:在执行强制类型转换之前,首先判断前一个对象是否是后一个类的实例,是否可以成功转换,从而保证代码的健壮性。
注意:instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么是后面类的父类,否则会引起编译错误。