一、抽象类的基本概念
当多个类中出现相同功能,但是功能主体不同。这时可以进行向上抽取。这时,只抽取功能定义。而不抽取功能主体
使用abstract关键字声明的类为抽象类
二、抽象类的特点
1、方法只有声明没有实现时,该方法就是抽象的,需要被abstract修饰
2、抽象方法一定在抽象类中。(就是说只要类中又抽象方法,这个类就是抽象的)
3、抽象方法和抽象类都必须被abstract关键字修饰
4、抽象类不可以用new创建对象,因为调用抽象方法没有意义。
5、抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用
6、如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类
三、抽象类中的一些问题
1、抽象类中有构造函数吗?
有,用于给子类对象进行初始化
2、抽象类可以不定义抽象方法吗
可以的,但是很少见,目的就是不让该类创建对象,通常该类中的方法有方法体,却没有内容
3、抽象类关键不可以和哪里关键字共存?
private:因为如果将抽象方法私有后,该方法就不能被子类复写了
final:因为被final修饰的方法不能被复写
static:因为如果将抽象方法被静态修饰后,可以直接用类名调用,但是没有意义
4、抽象类和一般类的区别
抽象类比一般类没有太大的不同
该如何描述事物就如何描述事物,只不过,该事物出现了一些看不懂得东西
这些不确定的部分,也是该事物的功能,需要明确出现,但是无法定义主体
通过抽象方法来表示。
抽象类比一般类多了个抽象函数,就是在类中可以定义抽象方法
抽象类不可以实例化
5、抽象类一定是个父类吗
是的。因为需要子类覆盖其抽象方法后才可以对子类实例化
1 public class AbstractDemo { 2 public static void main(String[] args) { 3 4 } 5 } 6 7 abstract class Student{ 8 abstract void study();//抽象方法必须存放在抽象类中,所以类也要抽象 9 10 } 11 class BaseStudent extends Student{ 12 void study(){ 13 System.out.println(" base study"); 14 } 15 } 16 class AdvStudent extends Student{ 17 void study(){ 18 System.out.println("adv study"); 19 } 20 }
四、抽象类的应用
假如我们在开发一个系通过时需要对员工进行建模,员工都有3个属性,姓名、工号以及工资。
经理也是员工,除了含有员工的属性外,另外还有一个奖金属性, 请使用继承的思想设计出员工类和经理类,要求类中提供必要的方法进行属性访问
员工类:name id pay
经理类:继承了员工,并有自己的特有的bonus。
1 public class AbstractTest { 2 public static void main(String[] args) { 3 4 } 5 } 6 abstract class Employee{ 7 private String name; 8 private String id; 9 private double pay; 10 11 Employee(String name,String id,double pay){ 12 this.name = name; 13 this.id = id; 14 this.pay = pay; 15 } 16 public abstract void work(); 17 } 18 class Pro extends Employee{ 19 Pro(String name,String id,double pay){ 20 super(name,id,pay); 21 } 22 public void work(){ 23 System.out.println("Pro work"); 24 } 25 } 26 class Manager extends Employee{ 27 private int bonus; 28 Manager(String name,String id,double pay,int bonus){ 29 super(name,id,pay); 30 this.bonus = bonus; 31 } 32 public void work(){ 33 System.out.println("Manager work"); 34 } 35 }