抽象类
父类方法的不确定性
当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类。
- 用abstract关键字来修饰一个类时,这个类就叫抽象类。
- 用abstract关键字来修饰一个方法时,这个方法就是抽象方法。
- 抽象类的价值更多作用在于设计,是设计者设计好后,让子类继承并实现抽象类()。
- 抽象类不能被实例化
- 抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract方法。
- 一旦类包含了abstract方法,这个类必须声明为abstract。
- abstract只能修饰类和方法,不能修饰属性和其他的。
- 抽象类可以有任意成员。比如:非抽象方法、构造器、静态属性等。
- 抽象方法不能有主体,即不能实现。
- 如果一个类继承了抽象类,则它必须实现抽象类中的所有抽象方法,除非他自己也声明为abstract类。
- 抽象方法不能使用private、final和static来修饰,因为这些关键字都是和重写相违背的。
概念
接口是一个特殊的“抽象类”,接口里不能包含普通方法,接口中的所有方法都是抽象方法。(JDK7.0前)
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来。
=小结=
Jdk7.0之前,接口中的所有方法都是抽象方法,不能有方法体。
Jdk8.0后接口可以有静态方法,默认方法,也就是说接口中可以有具体方法的实现。
接口的定义
和类定义不同,定义接口不再使用class关键字,而是使用interface关键字。接口定义的的基本语法如下:
[修饰符] interface 接口名 extends 父接口1,父接口2...
{
零个到多个常量定义...
零个到多个抽象方法定义...
零个到多个内部类、接口、枚举定义...
零个到多个默认方法或类方法定义...
}
修饰符可以是public或者省略,如果省略了public访问控制符,则默认采用包权限访问控制符。
接口名应与类名采用相同的命名规则。
一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。‘
接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义。接口里可以包含成员变量(只能是静态常量)、方法(只能是抽象实例方法、类方法或默认方法)、内部类(包括内部接口、枚举)定义。
接口可被当作是一个特殊的类,因此一个Java源文件里最多只能有一个public接口,如果一个Java源文件里定义了一个public接口,则该源文件的主文件名必须与该接口名相同。
接口的继承
接口的继承和类继承不一样,接口完全支持多继承,即一个接口可以有多个直接父接口。
和类继承相似,子接口扩展某个父接口,将会获得父接口里定义的所有抽象方法、常量。
使用接口
-
接口不能用于创建实例,但接口可以用于声明引用类型变量。当使用接口来声明引用类型变量时,这个引用类型变量必须引用到其实现类的对象。
-
接口中所有方法都是public修饰
-
一个普通类实现接口,就必须把接口类中的抽象方法都实现。
-
抽象类实现接口,可以不用实现接口中的方法。
-
一个类同时可以实现多个接口。
-
接口中的属性,只能是final的,而且是public static final修饰符。
-
接口中的属性访问形式:接口名.属性名
-
一个接口不能继承其他的类, 但是可以继承多个别的接口。
-
接口的修饰符,之恩那个是public和默认,这点和类的修饰符一样。
10.当子类继承了父类,就自动的拥有父类的功能。
如果子类需要扩展功能,可以通过实现接口的方式去扩展。
接口的主要用途: -
定义变量,也可用于进行强制类型转换。
-
调用接口中定义的常量。
-
被其它类实现。
一个类可以实现一个或多个接口,继承使用extends关键字,实现则使用implements关键字。类实现接口语法格式如下:
[修饰符] class 类名 extends 父类 implements 接口1,接口2...
{
类体部分
}
一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法,该类也必须定义成抽象类。
一个类实现某个接口时,该类将会获得接口中定义的常量(成员常量)、方法等。
实现接口方法时,必须使用public访问控制修饰符,因为接口中的方法都是public的,而子类(相当于实现类)重写父类方法时访问权限只能更大或者相等。
接口的多态参数
- 多态参数,接口引用可以指向实现了接口的类的对象。
- 多态数组,
- 接口存在多态传递现象。
实现接口VS继承类
接口和继承解决的问题不同
继承的价值在于:解决代码的复用性和可维护性。
接口的价值在于:设计、设计好各种规范(方法),让其它类去实现这些方法。
接口比继承更加灵活
继承是满足is - a 的关系,接口是满足like - a的关系。
接口在一定程度上实现代码解耦。【即接口的规范性+动态绑定机制】
接口和抽象类
相同点:
-
接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其它类实现和继承。
-
接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
不同点: -
接口里只能包含抽象方法、静态方法、默认方法,不能为普通方法提供方法实现;抽象类则完全可以包含普通方法。
-
接口中只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。
-
接口中不包括构造器;抽象类中可以包含构造器,抽象类中的构造不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
-
接口中不能包含初始化块,但抽象类中完全可以包含初始化块。
-
一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java中单继承的不足。
面向接口编程
接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极好的降低程序各模块之间的耦合,从而提高系统的可扩展性和可维护性。