Java面向对象——抽象类
abstract:抽象的;在实际开发中,当多个类中出现相同的功能时,但是功能的主体不同,这时可以对功能向上进行抽取,但只抽取功能的定义,并不抽取功能的主体,这样的类和方法,都用abstract来修饰。
abstract只能抽象类和方法,不可以抽象变量。
抽象的特点:
1、抽象方法一定在抽象类中;
2、抽象方法和抽象类必须被abstract修饰;
3、抽象类不可以被new创建对象,因为调用抽象方法是没有意义的,抽象方法没有函数体;
4、抽象类中的抽象方法想要被使用,必须由子类复写其所有的抽象方法后,才能建立子类对象调用,如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类,无法创建对象。
抽象类和一般类没有太大的区别和不同,在对事物的描述中,该如何描述事物,就如何描述事物,只不过该事物出现了一些不确定的东西。
这些不确定的部分,也是该事物的功能,需要明确出来,但是无法定义主体,通过抽象方法来表示。
抽象类比一般类多了个抽象函数,就是在类中可以定义抽象方法,抽象类不可以实例化。
特殊情况:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
课堂练习:
创建父类:
1.员工和经理同样具备姓名,工号,工资这三个属性,所以抽取出来定义在父类中。
2.员工和经理的工作内容不同,但是同样都是要工作的,所以在父类中定义一个抽象的工作方法,让子类根据自己的工作内容进行复写实现。
3.当类中定义了抽象方法后,抽象方法所在的类也必须是抽象类,所以父类也应该定义为抽象类。
abstract class Employee
{
private String name; //定义员工姓名;
private String id; //定义员工工号;
private double pay; //定义员工工资;
//使用构造函数初始化姓名,工号,工资属性。
Employee(String name,String id,double pay)
{
this.name =name;
this.id = id;
this.pay = pay;
}
//抽象出一个工作方法,以便于子类继承后复写适合自己的工作方法;
public abstract void work();
}
//创建普通员工类,继承Employee的所有属性及方法。
class ProEmployee extends Employee
{
ProEmployee(String name,String id,double pay) //使用构造构函数初始化ProEmployee;
{
//调用父类的属性初始化方法,对普通员工类的属性进行初始化。
super(name,id,pay);
}
//复写了适合普通员工的工作方法,覆盖了父类的抽象工作方法;
public void work()
{
System.out.println("普通员工");
}
}
class Mauager extends Employee //创建经理类,继承Emplyee的所有属性及方法;
{
private double bounes;
//在构造函数初始化时,增加了经理类的特有奖金属性。
Mauager(String name,String id,double pay,double bounes)
{
//调用父类的属性初始化方法,对经理类的属性进行初始化
super(name,id,pay);
this.bounes = bounes;
}
//复写了适合经理的工作方法,覆盖了父类的抽象工作方法。
public void work()
{
System.out.println("经理");
}
}
class employeeDemo
{
public static void main(String[] args)
{
//创建普通员工对像;
ProEmployee p = new ProEmployee("张小三","技术01",9000.00);
//创建经理对像;
Mauager m = new Mauager("王小五","管理01",15000.00,5000.00);
p.work(); //调用普通员工的工作方法;
m.work(); //调用经理的管理方法;
}
}