17.抽象类引出
当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类
abstract class Animal { private String name; public Animal(String name){ this.name = name; } //这里eat实现了,没什么意义,即:父类方法不确定性的问题 //考虑 ==》将该方法设计为抽象方法 //抽象方法==》没有实现的方法 //没有实现==》没有方法体 //当类中存在抽象方法时,需要将该类声明为abstract类 //一般来说,抽象类会被继承,由其子类来实现抽象方法 // public void eat(){ // System.out.println("这是一个动物,但不知道吃什么"); // } public abstract void eat(); }
18.抽象类细节
-
抽象类不能被实例化(不可new)
-
抽象类不一定要包含abstract方法,也就是说抽象类可以没有abstract方法
-
一旦类包含了abstract方法,则这个类必须声明为abstract
-
abstract只能修饰类和方法,不能修饰属性和其他的
-
抽象类可以由任意成员(因为其本质还是类),比如非抽象方法,构造器,静态属性等
-
抽象方法不能有主体,即不能实现
-
如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract
-
抽象方法不能使用private、final 和 static 来修饰,因为这些关键字都是和Override相违背的
19.抽象类练习
//编写一个Employee类,声明为抽象类,包含以下三个属性:name,id,salary提供必要的构造器和抽象方法:work()。对于Manager来说,他即是员工,还具有奖金(bonus)的属性。请用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问,实现work(),提示“经理/普通员工 名字 工作中...” public class HelloJava { public static void main(String[] args) { CommonEmployee commonEmployee = new CommonEmployee("小明",1,2000); commonEmployee.work(); Manager manager = new Manager("王总",2,10000); manager.work(); } } abstract class Employee{ private String name; private int id; private double salary; abstract public void work(); public Employee(String name,int id,double salary){ this.name = name; this.id = id; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } } class CommonEmployee extends Employee{ public CommonEmployee(String name, int id, double salary) { super(name, id, salary); } @Override public void work() { System.out.println("普通工人" + getName() + "在工作..."); } } class Manager extends Employee{ private double bonus; public Manager(String name, int id, double salary) { super(name, id, salary); } public double getBonus(){ return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } @Override public void work() { System.out.println("经理" + getName() + "在工作..."); } }
20.抽象类最佳实践-模板设计模式
需求:1.有多个类,完成不同的任务job;2.能够得到各自完成任务的时间;
//普通方法 public class HelloJava { public static void main(String[] args) { AA aa = new AA(); aa.job(); BB bb = new BB(); bb.job(); } } class AA{ //计算任务 //1+...+10000 public void job(){ //得到开始时间 long start = System.currentTimeMillis(); long num = 0; for (long i = 1; i <= 80000; i++) { num += i; } //得到结束时间 long end = System.currentTimeMillis(); System.out.println("AA 执行时间:" + (end-start)); } } class BB{ public void job(){ //得到开始时间 long start = System.currentTimeMillis(); long num = 0; for (long i = 1; i <= 8000; i++) { num *= i; } //得到结束时间 long end = System.currentTimeMillis(); System.out.println("BB 执行时间:" + (end-start)); } } =============================================================================== //模板设计模式 public class HelloJava { public static void main(String[] args) { AA aa = new AA(); aa.calculateTime(); BB bb = new BB(); bb.calculateTime(); } } //抽象类-模板设计模式 abstract class Template{ public abstract void job();//抽象方法 //实现方法,调用job方法 public void calculateTime(){ //得到开始时间 long start = System.currentTimeMillis(); job(); //得到结束时间 long end = System.currentTimeMillis(); System.out.println("任务执行时间:" + (end-start)); } } class AA extends Template{ //实现Template的抽象方法 public void job(){ long num = 0; for (long i = 1; i <= 80000; i++) { num += i; } } } class BB extends Template{ //这里也去重写了Template的job方法 public void job(){ long num = 0; for (long i = 1; i <= 8000; i++) { num *= i; } } }