1.接口(interface)
引入:抽象类是从多个类中抽象出来的模板,若要将抽象进行得更彻底,就得用到一种特殊的“抽象类”-接口
我的总结:
接口只定义了类应当遵循的规范,却不关心这些类的内部数据和其他方法内的实现细节
接口只规定了这些类里必须提供的方法,从而分离了规范和实现,增强了系统的可拓展性和维护性
使用接口的好处,拓展性,维护性更好,所有我们在开发中经常会用到接口(相当于定义了一种标准)
interface定义
接口定义一种规范,规定一个类必须做什么,但不管如何具体去做
{修饰符} interface 接口名 extends 父接口1,父接口2、、
没有构造方法,不能实例化:
接口只能继承接口,不能继承类
接口里没有普通方法 ,方法是抽象的
接口里的方法默认是 public abstract
接口里的字段全是全局常量 默认修饰符是 public static final
接口里的成员包括(主要是前两个)
全局常量
公共的抽象犯法
内部类(包括内部类,内部接口,内部枚举类)
我的总结:
接口没有构造方法,不能实例化
接口里的方法全部是抽象的,没有普通方法,有默认的修饰符,必须全部重写
2.接口的使用
实现接口(支持多实现)
{修饰符} class 类名 implements 接口1 ,接口2
接口的实现必须在 extends之后,
实现接口的方法必须是public类型
接口不能创建实例,但是可以声明引用类型的变量。
此时,引用类型的变量必须指向到其实现类对象。
Student s = new StudentImpl();
接口与类之间的关系:
实现关系或者说是继承关系。
可以说类实现了接口的方法,也可以说类继承了接口的方法,不同情况下不同的理解。
3.面向接口编程之制定标准和简单工厂模式
制定一个标准,让别人去实现,或者说满足它
interface USB{
void useUSB();
}
简单工厂模式
构建一个工厂出来,在里面进行生产,用的时候直接拿
我的总结:
好处:屏蔽不同子类实现的差异,提高代码的可拓展性和可维护性
4.面向接口编程之适配器模式
使用一个现成的类,但是它的接口不完全符合你的需求,我只想要它其中的一个办法,不想重写其他的方法
比如,窗口有变大,变小,关闭的行为,但是我现在只需要关闭行为。
5.接口和抽象类的比较
相同点:
都位于继承的顶端,用于被其他实现或继承;
都不能实例化;
都包含抽象方法,其子类都必须重写这些抽象方法;
区别:
抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性;接口只能包含抽象方法;
一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口()解决了java的单继承问题
二者的选用:
优先使用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类
我的总结:
接口不能有构造函数,抽象类是可以有构造函数的,
abstract 可以定义构造函数,(包括带函数的构造函数) 因为要保证子类在创建的时候能够进行正确的初始化
,但是Abstract 类不能被实例化
知识点 :
如果不可以或者没有创建对象,那么我们必须加上static修饰,不能对象调用,只好用类去调用
6.匿名内部类
适合只使用一次的类
不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建匿名内部类的对象。
匿名内部类不能定义构造器,因为没有类名
格式 :
new 父类构造器(【实参列表】) 或接口(){
//匿名内部类的类体部分
}
7、枚举类
使用enum 声明,默认直接继承了 java.lang.Enum类,而不是Object类
枚举类的对象是固定的,实例个数有限,不可以再new() 枚举对象后可以跟()
枚举元素必须位于枚举类体中最开始部分,枚举元素后要有分号,与其他成员分隔。
枚举类的构造方法权限默认是private
一旦枚举对象后面加上{} 那么该对象实际是枚举匿名内部类对象;
所有枚举类都提供一个静态的values()方法(返回该枚举类所有对象组成的数组)便于遍历所有枚举对象
所有枚举类都提供一个静态的valueOf(String name)方法,返回枚举类中对象名等于name的对象
我的总结 :
枚举不可以 new(); 即便是反射也不可以 !
备注 : 一个类如果没有构造方法 ,那么一定有相对应的某个方法可以获取对象