抽象类
java中,对象都是用类表示的,但是有的类却不能表示描述对象;比如,动物,这个本身不是一个具体的事物,猫是动物,狗也是动物,所以动物不是对象,他是抽象的,那动物在java中怎么表示,这时候就用到抽象类了
我们可以将动物定义为抽象的,将所有是动物的行为给一个声明,而不给出具体实现,这时动物类就可以被定义为一个抽象类
java中,将不是具体的对象定义为抽象类,不是具体功能的方法定义成抽象方法
抽象类定义
使用关键字 abstract 定义抽象类和抽象方法
1 | public abstract class{ |
抽象类是特殊的类,一般是为了被继承,只声明方法,不实现,方法的具体实现由子类实现
抽象类特点
- 抽象类和抽象方法必须被 abstract 修饰
- 抽象类中可以有抽象方法和非抽象方法,但是如果一个类中有抽象方法,这个类必须定义为抽象类
- 自己不能被实例化,不能创建对象,但是可以通过多态方式用子类实例化
- 抽象类中有构造方法,但是不能用于实例化,是为了子类访问父类数据的初始化
- 抽象方法只声明,没有实现,没有方法体;只能由子类重写实现
- 抽象的子类
- 如果不想重写抽象类的抽象方法,将子类定义为抽象类
- 子类是一个普通的类,必须重写抽象类的所有抽象方法
- 抽象方法中的构造方法和 static 类方法不能声明为抽象方法
抽象类的方法,抽象方法,是要求子类必须做的事情,非抽象方法,是提高代码复用性,子类可以使用也可以不使用
抽象类的注意事项
abstract 不能和关键字 private、final、static组合
- 被 private和final 修饰的方法,不能被子类重写,但是被 abstract 修饰的方法必须被子类重写,会冲突
- 被 static 修饰的方法,能被类直接调用,但是 abstract 修饰的方法只是声明,而没有实现,不能调用执行
抽象类例子
1 | package test; |
接口
抽象类,是将不是具体的事物定义为抽象类,但是有共有的特性,比如动物,都有吃,叫等行为,而后天形成的一些行为,有的动物有,有的动物没有,这时用到接口
接口是所有抽象方法的集合
接口的定义
使用关键字 interface 定义,代替类关键字 class
1 | public interface InterfaceName{} |
接口是抽象类的扩展但不是抽象类;从定义方式可以看出,接口没有关键字 class,说明接口并不是一个类
接口的特点
- 接口访问权限默认 public ,如果显示指为 private 或 protected
- 接口中的成员变量会被默认指定为 “public static final”,所以接口中的方法都是常量
- 接口中的所有方法都是抽象的,必须是声明,不能有实现的方法
- 接口不能被实例化,也没有构造方法
- 接口的实现类使用 implements 关键字实现接口,并且必须实现接口中的所有方法
类和接口的关系
类与类:单继承,多层继承
类与接口:类实现接口,可以多实现 (可以再一个类中实现多个)
接口和接口:可以单继承和多继承
抽象类和接口的区别
- 成员区别
- 抽象类
- 成员变量:常量、变量
- 构造方法:有
- 成员方法:可以有抽象和非抽象成员方法实现
- 接口
- 成员变量:仅可以有常量
- 构造方法:无
- 成员方法:只能存在抽象方法,不能存在方法的实现
- 抽象类
- 修饰符区别
- 抽象类:成员方法可以有public、protected和default修饰符
- 接口:默认修饰符是public。不可以使用其它修饰符
- 实现类区别
- 抽象类:被继承 - 一个类只能继承一个抽象类
- 接口:被实现 - 一个类可以实现多个接口
- 设计目的
- 抽象类:被继承时是
is a
的关系,抽象类是对继承体系的共性功能,是对类根源的抽象;如:男人女人的抽象类 - 人,男人很女人都是人,只能单独继承人抽象类,而不可能继承机器人抽象类 - 接口:被实现时是
hive a
的关系,接口是对动作的抽象,是对某个具体的类扩展类功能
- 抽象类:被继承时是