接口
为了体现事物功能的扩展性,java中提供了接口来定义这些额外功能,但不给出具体实现,将来有要实现的地方在添加实现。
特点:接口用interface关键字表示
格式: interface 接口名{}
类实现接口用implements表示:
class 类名 implements 接口名{}
接口不能实例化。按照多态的方式,接口可以由具体的子类实例化。这也是多态的一种,接口多态。
所以多态有3种:
A. 具体类多态(几乎不用)
B. 抽象类多态(常用)
C. 接口多态(最常用)
接口的子类:要么是抽象类,要么重写接口中的所有抽象方法(推荐)。
接口成员特点:
成员变量:接口中的变量默认是常量,并且是静态的。默认修饰符public static final (所以建议自己手动给出)
构造方法:接口没有构造方法,因为接口主要是扩展功能的,没有具体存在
成员方法:只能是抽象方法。默认修饰符 public abstract(建议自己手动给出)
接口名+Impl这种格式是接口的实现类格式。
所有的类都默认继承自Object类。类 Object是类层次结构的根类,每个类都使用Object作为超类。因为Objec类只有无参构造,所以默认每个子类都会调用其父类的无参构造super();
类与类关系:继承关系,可以单继承,也可以多层继承
类与接口关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口与接口的关系:继承关系,可以单继承,也可以多继承(java中有多继承,只有接口有)
抽象类和接口的区别:
A. 成员区别:抽象类有变量、常量,有构造方法,有抽象方法和非抽象方法
接口中只有常量,抽象方法
B. 关系区别:类与类关系、类与接口关系、接口与接口的关系
C. 设计理念区别:
抽象类被继承体现的是“is a”的关系。共性功能
接口被实现体现的是“hava a”的关系。扩展功能(也有说like a的关系 谁像啥)
形式参数是引用类型:
类:类作为形参,其实需要的是该类的对象(匿名对象可以作为对象,只使用一次)
抽象类:需要的是该抽象类的子类对象。(因为它本身不能实例化,只有子类的对象)
接口:需要的是该接口的实现类对象。
返回值是引用类型:
类:返回的是该类的对象。
抽象类:返回的是该抽象类的子类对象。
接口:返回的是该接口的实现类对象。
链式编程:每次调用完毕方法后,返回的是一个对象。(适用于中间调用的返回值是类、接口、抽象类)
抽象类
在java中,一个没有方法体的方法应该定义为抽象方法。而类中如果有抽象方法,该类必须定义为抽象类。
抽象类和抽象方法必须使用abstract关键字修饰。
格式:抽象类: abstract class 类名{…}
抽象方法: public abstract void eat();
空方法体用 {} 没有方法体用 ;
抽象类不一定有抽象方法(没有抽象方法的抽象类的意义就是不让外界创建对象,只能通过子类访问),但是有抽象方法的类一定是抽象类。
抽象类有构造方法(这个构造方法的作用是用于子类访问父类数据的初始化),但是不能实例化。按照多态的方式,抽象类可以由具体的子类实例化,和多态的声明一样: 父 f=new 子(); 抽象类多态
抽象类的子类要么是抽象类,要么重写抽象类中的所有抽象方法成为一个具体的类。
抽象类的成员特点:
成员变量:既可以是变量,也可以是常量。
构造方法:有。用于子类访问父类数据的初始化。
成员方法:既可以是抽象的(强制要求子类做的事情),也可以是非抽象的(子类继承的事情,提高代码的复用性)。
如果测试的东西父类中都包含,可以使用多态。但如果要测试子类中特有的内容,我们无法用多态继续测试,所以要创建子类的对象来测试。
abstract不能共存的关键字:
private:冲突。加了就不让重写了。
final:冲突。不能被重写。
static:无意义。因为静态可以直接通过类名访问,而abstract没有方法体,访问一个没有方法体的方法是无意义的。