抽象类关键字 abstract
抽象类不和那些关键字类共存 private static final
抽象类 被子类继承 如果子类不是抽象类 那么强制子类必须覆写父类的方法
抽象类 不能被final 所修饰 因为被final所修饰的类 无法继承的
抽象类 之模板设计 (Template Method)
题目
/* 需求: 计算1000个整数和1000个字符串相连接的耗时时间. */
所有的子类都具有一个共同的操作 为了代码复用 我把共有的代码写成一个方法 提取到父类去 让其他的子类所继承于该父类
但是 该共同操作方法中 有一部分功能是父类不知所措如何写的 那么就必须定义一个抽象方法 让子类自己去实现自己想做的事情 而只在这个父类共性方法当中调用这个抽象方法即可--------->引出了一个模板设计
模板方法模式(TemplateMethod):在父类的一个方法中定义一个总体框架的骨架(模板方法),而将某一些步骤延迟到子类中,因为不同的子类实现细节不同。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
-------------------------------------------------------------------------------------------------------------
抽象父类负责定义操作中的业务骨架,而把某些具体的实现步骤延迟到子类中去实现。
模板方法 一种通用的处理方法 由模板去完成
抽象方法 一种业务功能的实现 由子类去实现
原始代码
class StringDemo{
public void doWork(){
//开始时间
long start=System.currentTimeMillis();
String str="";
for (int i = 0; i < 10000; i++) {
str+=i;
}
//结束时间
long end=System.currentTimeMillis();
System.out.println("总耗时间"+(end-start));
System.out.println(str);
}
}
class IntDemo{
public void doWork(){
//开始时间
long start=System.currentTimeMillis();
int j=0;
for (int i = 0; i < 10000; i++) {
j+=i;
}
//结束时间
long end=System.currentTimeMillis();
System.out.println("总耗时"+(end-start));
System.out.println(j);
}
}
public class MyDemo7 {
public static void main(String[] args) {
/* 需求: 计算1000个整数和1000个字符串相连接的耗时时间. */
System.out.println("int 耗时");
new IntDemo().doWork();
System.out.println("String 耗时");
new StringDemo().doWork();
}
}
模板代码如下
abstract class MyDemo6{
//被final修饰方法是不能被覆写的
public final long getSuanfa(){
//开始时间记录一下 因为这个2个子类都需要这个所以提供一个最终的方法 整体框架
long start =System.currentTimeMillis();
//这里每个子类做不同的事情 那么我就交给子类去实现
//而这个方法的具体实现交给子类去做
doWork();
//结束时间记录一下
long end=System.currentTimeMillis();
return end-start;//返回所用的时间
}
//强制子类重写我这个方法 而我不需要知道子类这个方法里面做了哪些操作
public abstract void doWork();
}
//那么我把它们2个类共同的代码提起出来
class IntOperate extends MyDemo6 {
//这个子类继承了父类 那么必须重写父类的抽象方法
public void doWork() {
long j = 0;
for (int i = 0; i < 10000; i++) {
j+=i;
}
System.out.println(j);
}
}
class StringOperate extends MyDemo6{
//子类继承于父类 那么就强制重写父类抽象方法
public void doWork() {
String str="";
for (int i = 1; i < 10000; i++) {
str+=i;
}
System.out.println(str+"sss");
}
}
public class OperateDemo {
/* 需求: 计算1000个整数和1000个字符串相连接的耗时时间. */
public static void main(String[] args) {
//而我调用子类所继承父类 最终方法 就行了
System.out.println(new StringOperate().getSuanfa());
System.out.println(new IntOperate().getSuanfa());
}
}