一.抽象类
定义一个类时,常常需要使用成员方法来描述对象的某些特征。有时,成员方法并不能准确描写对象的行为特征。例如,存在Animal类,类中存在一个shout()方法可以实现动物叫的行为。但是由于不同的动物叫声不同,shout()方法不能准确表现各种动物的叫声,因此产生了抽象方法和抽象类。
1.抽象方法的定义
访问修饰符 abstract 返回值类型 方法名 (参数);
注意:抽象方法不需要方法体
抽象方法是类中所有对象的共同行为
含有抽象方法的类一定是抽象类
2.抽象类的定义
访问修饰符 abstract class 类名{
访问修饰符 abstract 返回值类型 方法名 (参数);
}
3.抽象类的特征
(1)如果类中含有抽象方法,那么一定是抽象类
(2)抽象类不能实例化,即不能创建抽象类的对象
(3)要继承抽象类必须实现抽象类中的所有抽象方法
如果子类未能实现抽象类中的所有抽象方法则子类仍然是抽象类,依然不能实例化。
(4)抽象类虽然不能实例化,但可以有构造器
构造器的作用:子类继承抽象类后可以间接调用父类的构造器
4.关于abstract的拓展
(1)abstract不适用于属性,构造器和代码块。
原因:a.属性包括三部分 变量类型 属性名 和属性值三者缺一不可,因此不需要抽象
b.构造器 是创建和初始化对象的特殊方法 ,如果用abstract修饰构造方法那么该构造方法所在的类就必须是抽象类,而抽象类不能实例化,这与构造方法的目的相驳。
c.代码块 就是用{}括起来的一段代码 而abstract关键字的特点就在于它所修饰的对象没有具体实现,例如抽象方法没有{}方法体,因此,设想如果代码块没有了{}那还剩下什么呢?因此用abstract修饰代码块毫无意义。
(2)abstract不可以与static方法 ,final方法,final类和private方法共用
原因: a.静态方法可以通过类名.方法调用而抽象方法不能被调用,两者冲突。
b.final修饰的方法无法被重写,而抽象方法由于没有方法体,因此一定要重写,两者冲突。
c.final修饰的类为最终类无法再创建子类,而抽象类必须要创建子类进行实例化,两者冲突。
d.private修饰的方法为私有方法,只能本类中可以被访问。而抽象方法必须可以在所在类的子类中被重写,即可以被其他类访问,两者冲突。
总结:abstract之所以不适合它们的根本原因在于加入abstract后它们自身的逻辑功能无法实现。
二.接口
如果抽象类中的方法都是抽象方法,那么可以将该抽象类定义为接口。接口中可以存放全局常量和抽象方法以及其他方法。
1.接口的定义
public abstract interface 接口名{
public static final 数据类名 常量名=常量值;
publlic abstact void 方法名(参数);
代码如下:
2.接口与类的关系:实现
一个类可以实现多个接口弥补了Java类与类之间只能单继承的缺点
接口是一种规范,规定实现接口的实现类必须实现接口中的所有抽象方法
class 类名 implements 接口1,接口2{
public void method(){
}}
代码如下:
3.接口与接口的关系:继承
interface 接口名3 extends 接口名1,接口名2{
}
4.接口的多态性
引入:类的多态性指父类引用指向子类对象
父类 变量名=new 子类对象;
因为接口不能实例化,所以不存在接口的对象,但接口依靠类来实现,所以可以用接口指向实现类的对象。
接口名 变量名=new 实现类对象; //创建接口实现类的对象
接口名 变量名=new 接口名(){ //创建接口匿名实现类的匿名对象
//重写抽象方法
};