目录
抽象类的概念
1.什么是抽象(与具体类相对)
Java专门提供了一种机制,名为“抽象方法”。它属于一种不完整的方法,只含有一个声明,没有方法主体。下面是抽象方法声明时采用的语法:
abstract void X();
包含了抽象方法的一个类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。否则,编译器会向我们报告一条出错消息。
若一个抽象类是不完整的,那么一旦有人试图生成那个类的一个对象,由于不能安全地为一个抽象类创建属于它的对象,所以会从编译器那里获得一条出错提示。通过这种方法,编译器可保证抽象类的“纯洁性”,我们不必担心会误用它。
2.为什么要抽象
抽象方法和抽象类看上去是多余的,对于抽象方法,不知道如何实现,定义一个空方法体不就行了吗,而抽象类不让创建对象,看上去只是增加了一个不必要的限制。
引入抽象方法和抽象类,是Java提供的一种语法工具,对于一些类和方法,引导使用者正确使用它们,减少被误用。
使用抽象方法,而非空方法体,子类就知道他必须要实现该方法,而不可能忽略。
使用抽象类,类的使用者创建对象的时候,就知道他必须要使用某个具体子类,而不可能误用不完整的父类。
无论是写程序,还是平时做任何别的事情的时候,每个人都可能会犯错,减少错误不能只依赖人的优秀素质,还需要一些机制,使得一个普通人都容易把事情做对,而难以把事情做错。抽象类就是Java提供的这样一种机制。
抽象类的好处
父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去实现重写,我们设计这样的抽象类,就是为了更好的支持多态
抽象类和接口的区别
参数 | 抽象类 | 接口 |
---|---|---|
默认的方法和实现 | 可以有默认的方法实现 | 完全抽象,根本不存在方法的实现 |
实现方式 | 子类用extends关键字来继承抽象类,如果子类不是抽象类的话,它需要实现父级抽象类中所有抽象方法,父类中非抽象方法可重写也可不重写 | 子类用implements去实现接口,需要实现接口中所有方法 |
构造器 | 抽象类可以有构造器(构造器不能用abstract修饰) | 无 |
与正常java类的区别 | 不能被实例化 | 接口和正常java类是不同的类型 |
访问修饰符 | 抽象方法可以用public、protected、default修饰 | 默认public,不能用其他修饰符 |
main方法 | 可以有并运行 | 没有 |
多继承 | 继承一个类和实现多个接口 | 接口只能继承一个或者多个接口 |
添加新方法 | 如果在抽象类中添加新非abstrac的方法,可以直接添加,因为非abstract方法无需在子类中实现,如果是abstact方法,则需要改变子类的代码,也要实现这个方法 | 只要在接口中添加方法,实现它的类就要改变,去实现这个新添加的方法 |
速度 | 比接口快 | 稍微慢点,因为需要寻找类中实现他的方法 |