面向对象-抽象类实战案例
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.抽象类概述
1>.抽象定义
抽象就是从多个事物中将共性的,本质的内容抽取出来。例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。
2>.抽象类
Java中可以定义没有函数体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
3>.抽象方法的由来
多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体。那么只有功能生命,没有功能主体的方法称为抽象方法。
例如,狼和狗都有吼叫的方法,可以吼叫内容是不一样的,所以首相出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节。
4>.抽象类的特点
抽象类和抽象方法必须用abstract关键字来修饰;
抽象方法只有方法声明,没有方法体,定义在抽象类中,语法格式如下:
修饰符 abstract 返回值类型 函数名(参数列表);
抽象类不可用被实例化,也就是不可用用new创建对象,原因如下:
抽象类是具体事物抽取出来的,本身是不具备的,没有对应的实例,例如:犬科是一个抽象的概念,真正存在的是狗和狼。
而且抽象类即使创建了对象,调用抽象方法也没有任何意义,因为抽象方法的抽象方法函数体为空。
抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。
5>.定义抽象类案例
package cn.org.yinzhengjie.abstraPackage; /** * * @author 尹正杰 * */ public abstract class Animal { /* * 没有函数体的方法需要用abstract关键字来修饰,这个方法就被称为抽象方法; * * 当类中出现了抽象方法后,该类也必须使用abstract关键字修饰 */ abstract void sayHello(); }
package cn.org.yinzhengjie.abstraPackage; /** * * @author 尹正杰 * */ public class Dog extends Animal{ /* * 定义狗叫的方法 */ void sayHello() { System.out.println("汪~汪~汪汪汪..."); } }
package cn.org.yinzhengjie.abstraPackage; /** * * @author 尹正杰 * */ public class Cat extends Animal{ /* * 定义猫叫的方法 */ void sayHello() { System.out.println("喵~喵~喵..."); } }
package cn.org.yinzhengjie.abstraPackage; public class Demo { public static void main(String[] args) { //抽象类通过其子类实例化 Cat cat = new Cat(); Dog dog = new Dog(); cat.sayHello(); dog.sayHello(); } }
二.抽象类案例分析
员工案例:
具体事物:
运维工程师,运维项目经理(有奖金(bonus))
共性:
姓名(name),工号(id),工资(salary),工作(work)。
package cn.org.yinzhengjie.staff; /** * 定义员工类 * @author 尹正杰 * */ public abstract class Employee { /* * 定义姓名 */ private String name; /* * 定义员工工号 */ private String id; /* * 定义工资 */ private double salary; Employee(String name,String id,double salary) { this.name = name; this.id = id; this.salary = salary; } public abstract void work(); }
package cn.org.yinzhengjie.staff; /** * 定义运维项目经理 * @author 尹正杰 * */ public class OperationManager extends Employee { /* * 定义奖金 */ private double bonus; OperationManager(String name, String id, double salary,double bonus) { super(name, id, salary); this.bonus = bonus; } @Override public void work() { System.out.println("运维项目经理正在分配工作..."); } }
package cn.org.yinzhengjie.staff; /** * 定义运维工程师 * @author 尹正杰 * */ public class operation extends Employee{ operation(String name, String id, double salary) { super(name, id, salary); } @Override public void work() { System.out.println("运维人员正在协助开发解决问题并进行集群调优..."); } }
三.抽象类的细节问题
1>.抽象类中是否有构造函数?
参考答案:
抽象类中是有构造函数的,虽然抽象类本身不可用实例化,但是继承抽象类的子类是可以实例化的。换句话说,只要是class定义的类,里面肯定有构造函数,只不过抽象类的构造函数是用于给予子类提供实例化的。
其实抽象类和一般类没什么区别,该怎么描述就怎么描述,只不过有些功能在该类中无法确定内容,所以比普通类多了抽象方法。
2>.抽象类中是否可以不定义抽象方法?
参考答案:
这个是可以的,没有抽象方法的抽象类存在的意义就是不想让该类被实例化。换句话说,没有抽象方法的抽象类存在的意义是不让该类创建对象,因为创建对象是没有意义的。
3>.抽象关键字(abstract)和哪些关键字不可用共存?
参考答案:
final:
如果方法被抽象,就需要被覆盖,但是final是不可以被覆盖,所以冲突。
private:
如果函数被私有化了,子类无法直接访问,怎么覆盖呢?这个时候就会提示非法的修饰符组合。
static:
不需要对象就可以通过类名 直接调用抽象方法,但是在这里调用抽象方法是没有意义的,这个时候会提示非法的修饰符组合。