抽象
在编写一个类时,会为这个类定义一些方法,这些方法用以描述该类的行为方式,这些方法都有具体的方法体,是怎么实现的,但是在某些情况下,父类只知道其子类有怎样的方法,却不知道该怎么实现,就用抽象类和抽象方法实现。
抽象方法和抽象类
-
抽象类、抽象方法必须使用abstract修饰符来修饰,抽象方法不能有方法体;
-
抽象类不能被实例化,即使抽象类里不包含抽象方法,这个抽象类也不能被实例化
-
抽象类可以包含成员变量,方法(普通方法,抽象方法都可以)、构造器、初始代码块、内部类(接口,枚举)5种成分,抽象类的构造器不能用于创造实例,主要用于被其他子类调用。
-
含有抽象方法的类(包括直接定义了一个抽象方法;或者继承一个抽象类,但完全没有实现父类包含的抽象方法;或实现一个接口,但没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类。
-
抽象类中可以包含普通方法,但是普通类中不能包含普通方法;
-
抽象方法没有方法体,是用来子类具体实现的;
-
abstract不能用于修饰成员变量,不能用于修饰局部变量,也不能修饰构造器,抽象类里定义的构造器只能是普通构造器;
-
static和abstract不能同时出现修饰某个方法,但不是绝对的,可以同时修饰内部类
-
abstract只有被子类实现才会有意义,因此***abstract和private不能一起出现***
抽象类模版模式:
- 抽象类可以只定义,需要使用的某些方法,把不能实现的部分抽象成抽象方法,留给其子类去实现;
- 父类中kennel包含需要调用的其他系列方法的方法,这些调用方法既可以由父类实现,也可以由子类实现,父类里提供的放啊放只是定义了一个通用算法,其实现不能完全依赖自身实现,必须依赖其子类的辅助。
用static修饰的方法是属于类的,可以由类直接调用;
普通方法是由对象调用的。
接口
Java8中,重新定义了接口,接口里可以有抽象方法,也可以有默认的方法defau修饰的。
接口的基本语法:
修饰符 interface 接口名 extends 父接口1,父接口2…{
零到多个常量定义…
零到多个抽象方法定义
零到多个抽象方法定义
零到多个内部类、接口、枚举定义
零到多个默认方法或类方法定义
}
- 接口命名规则,首字母大写,通常使用形容词;
- 接口不能创建对象;
- 一个接口可以有多个父接口,但接口只能继承接口,不能继承类。
- 接口是定义的一种规范,因此不能包含构造器和初始块定义,接口里可包含成员变量(类里的变量,只能是静态常量),方法(只能是类方法,默认方法,抽象方法)、内部类(包括内部接口、枚举)定义
- 修饰符只能是public来修饰;
- 不管是否使用public static final 修饰符,接口里的成员变量总是用这三个来修饰,而且接口里没初始代码块和构造器,所以只能在一开始就指定默认值;
- 接口里定义的方法只能是抽象方法、类方法、默认方法,如果不是默认方法,程序会自动为普通方法增加abstract修饰符;接口里的普通方法不能有方法体,类方法和默认方法都必须有方法实现体;
接口的继承
接口的继承可以为多继承
子接口扩展某个父接口,将会获得父接口定义里的所有抽象方法、常量。
使用接口
接口不能用于创建实例,但接口可以用于声明引用类型变量,接口的主要用途就是被实现
主要用途:
- 定义变量(静态常量);
- 调用接口中定义的常量
- 被其他类实现;
类实现接口的语法格式:
修饰符 class 类名 extends 父类 implements 接口1,接口2…{
类体部分;
(可以获得所实现接口里定义的常量(成员静态常量);方法(抽象方法和默认方法))
}
类的继承和接口的继承一样,静态的方法可以拿来直接用,但是不能重写。
一个类实现了一个或者多个接口后,这个类必须完全实现这些抽象方法,否则将会保留从父类继承来的抽象方法,该类也必须得定义成抽象类。
接口和抽象类的不同点:(接口里不包含的抽象类里一般都可以有)
- 接口只能包含抽象方法,静态方法,默认方法;
- 抽象类里可以定义普通方法;
- 接口里能定义静态常量,不能定义普通常量;
- 抽象类里既可以定义静态常量也可以定义普通常量
- 接口里不包含构造器,初始化块;抽象类里可以包含构造器初始化块,抽象类的构造器不是为了创建对象,是为了子类可以调用这些构造器来完成属于抽象类的初始化操作;
- 一个类最多只有一个直接父类,但是一个类可以实现多个接口。
类与接口的关系:实现关系
注意:
- 非抽象类实现一个接口时,必须要把接口中的全部方法实现
- 抽象类实现一个接口时,可以实现也可以不实现接口中的方法
- 一个类可以实现多个接口
- 接口与接口之间的关系:继承关系
注意: - 一个接口可以继承多个接口