抽象类
抽象类即使用abstract修饰的类
- 抽象类和抽象方法必须使用abstract来修饰。抽象方法不能够有方法体
- 抽象类不能够被实例化。即使抽象类中没有抽象方法,其也不能够创建实例。
- 抽象类和普通类的组成部分大致相同,可以有普通方法,成员变量,构造器,区别在于抽象类中有抽象方法来被子类实现,抽象类中的构造器不是用来创建实例的,而是用来在子类中调用的。
- 含有抽象方法的类(包括继承了抽象类但是没有实现,实现了接口,但是没有完全实现其中的抽象方法)只能够被定义成抽象类。
- 抽象类是可以没有方法和属性的
- 当使用abstract修饰方法时,这个方法一定要被子类或者子类的子类实现,而final修饰的方法是不能够被修改的,因此final与abstract是不能够同时使用的。
- abstract不能够修饰成员变量,也不能够修饰局部变量和构造器。
- 使用abstract修饰方法时,这个方法是没有方法体的,如果这个方法也同时用static修饰,这个方法理论上能够通过抽象类调用,但是这个方法时没有方法体。调用出错,所以static也不能够与abstract公用。
- abstract修饰的方法必须在子类中实现才有意义,所以abstract不能够与private共同使用。
作用
抽象类是从多个具有相似特征的类中提取出其中共同的部分,然后把这些部分组成一个抽象类。抽象类大多数是作为一个模板,避免子类在设计上的随意性。同时在抽象类中普通方法也能够起到代码复用的作用。
abstract class Person{
public void everyNeedToDo() {
System.out.println("吃喝玩乐");
}
abstract void work();
}
public class Student extends Person{
@Override
void work() {
System.out.println("上课听讲,回家复习,周末考试");
}
}
class Colder extends Person{
@Override
void work() {
System.out.println("与产品斗智斗勇,撸代码");
}
}
学生与程序员共同的部分是都要吃喝拉撒,这是每个人类都要做的事情,因此把它提取出来作为抽象类的普通方法,然而每个人要完成的工作都是不一样的。这不一样的部分就在抽象类中定义成抽象方法,最终在子类中根据实际情况进行实现。
抽象类与接口的最大不同之处在于他们与子类的关系上。
对于抽象类来说,子类是其模板的实现,是抽象类的继承,是“is a”的关系。也可以说子类就是抽象类,子类和抽象类的本质是一样的,不同的只是不同子类对于抽象方法的实现。比如学生,程序员就是Person一样,但是它们的工作任务是不一样的。
然而对于接口来说,实现类与其之间并没有继承的关系。接口更多的是作为一种扩展规范,其与子类的关系并没有那么密切。下面介绍接口的相关知识。
接口
接口定义了某一批类所需要实现的规范,接口不关系这些类的内部实现细节,只要其实现接口中定义的抽象方法。接口定义的是多个类共同的公共行为规范,这些行为是与外界沟通的渠道。
- 接口使用interface关键字
- 一个类可以有多个接口, 但是接口只能够继承接口,不能够继承类
- 接口中不能够有构造器和初始化块定义。接口可以有静态常量和静态方法、抽象方法、默认方法。
- 默认方法使用default来修饰,不能够使用static修饰。
- 静态方法使用接口来调用,默认方法使用接口的实现类的对象来调用。
- 接口内的成员变量默认使用public static final来修饰
- 接口支持多继承
abstract class Person{
public void everyNeedToDo() {
System.out.println("吃喝拉撒");
}
abstract void work();
}
interface drive{
void driveCar();
default void own() {
System.out.println("拥有驾驶证"); //默认方法
}
}
public class Student extends Person implements drive{
@Override
void work() {
System.out.println("上课听讲,回家复习,周末考试");
}
@Override
public void driveCar() {
System.out.println("驾驶电动车");
}
}
class Colder extends Person implements drive{
@Override
void work() {
System.out.println("与产品斗智斗勇,撸代码");
}
@Override
public void driveCar() {
System.out.println("驾驶小汽车");
}
}
如上述代码所示,Student和Colder都实现了drive这个接口,也就代表了他们都拥有驾驶这个技能,通过对于接口中抽象方法的不同实现,他们的技能也是不一样的,学生骑电动车,程序员开车。
这里也能一定程度上看出接口与抽象类的区别。
接口是对象增加某种技能的方法,这种技能可以是很多个,有或者没有都没关系。
网友评论