抽象类
1.抽象类和抽象方法必须用abstract关键字修饰
2.抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
3.抽象类不能实例化,按多态的方式,由具体的子类实例化。(不能实例化即 Animal a=new Animal 会报错,因为抽象类里没有具体方法的实现,调用它没有意义)
4.抽象类的子类要么是抽象类,要么重写抽象类中的所有抽象方法
抽象类的成员特点
1.成员变量:既可以是变量,也可以是常量。abstract不能修饰成员变量
2.构造方法:有,用于子类访问父类数据的初始化
3.成员方法:既可以是抽象的,也可以是非抽象的
成员方法特性:抽象方法 --> 强制要求重写
非抽象方法 --> 子类继承的事情,提高代码复用性
PS:小问题:一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
答:可以,这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成
abstract不能和哪些关键字共存?
1.abstract 和 static:被abstract修饰的方法没有方法体
被static修饰的可以用类名. 调用,但是类名. 调用抽象方法是没有意义的
2.abstract和final:被abstract修饰的方法强制子类重写
被final修饰的不让子类重写,所以它俩是矛盾的
3.abstract和private:被abstract修饰的是为了让子类看到并强制重写
被private修饰不让子类访问,所以它俩是矛盾的
abstract class Demo {
public static abstract void print(); //错误:非法的修饰符组合:abstract和static
public final abstract void print(); //错误:非法的修饰符组合:abstract和final
private abstract void print();} //错误:非法的修饰符组合:abstract和private
接口
如果一个抽象类里全是抽象方法的话可以直接写成一个接口,接口中不能定义非抽象方法
接口特点
1:接口用关键字interface表示 ----> interface 接口名{ }
2:类实现接口用implements表示 -----> class类名 implements 接口名
3:接口不能实例化(因为调用抽象方法没有意义,若需实例化则按照多态的方式来实例化)
4:接口的子类 :可以是抽象类,但是意义不大。
可以是具体类,要重写接口中的所有抽象方法。(推荐方案)
接口的成员变量
只能是常量,并且是静态的公共的
默认修饰符:public static final(顺序可以调换)
构造方法:接口没有构造方法
成员方法:只能是抽象方法,
默认修饰符:public abstract(接口是暴露的,所以是public )
类与类、类与接口、接口与接口的关系
类与类:继承关系,只能单继承,可以多层继承
类与接口:实现关系,可以单实现,也可以多实现,并且可以在继承一个类的同时实现多个接口
接口与接口:继承关系,可以单继承,也可以多继承
多实现写法:
Class Demo implements InterA,InterB{ } --> 正确
Class Demo implements InterA,implements InterB{ } --> 错误
多继承写法:
Class Demo extends InterA,InterB{ } --> 正确
Class Demo extends InterA,extends InterB{ } --> 错误
接口与抽象类的区别
A: 成员区别
抽象类:成员变量:可以变量,也可以常量
构造方法:有
成员方法:可以抽象,也可以非抽象
接口: 成员变量:只可以常量
成员方法:只可以抽象
B:关系区别
类与类:继承,单继承
类与接口:实现,单实现,多实现
接口与接口:继承,单继承,多继承
C:设计理念区别
抽象类被继承体现的是:“is a”"的关系。抽象类中定义的是该继承体系的共性功能。
接口被实现体现的是:"like a"的关系。按口中定义的是该继承体系的扩展功能。
一个类不写任何继承类默认继承object类
PS:抽象类是用来继承的,接口是用来实现的,抽象类可以实现接口(方法体中为空),再由其子类对接口进行具体的实现。