抽象类
为什么要有抽象类?
子类继承父类的方法时,重写了父类的方法,父类的该方法有时候没有必要去实现,这时便用到抽象类。
一、抽象类具体介绍
(1)用abstract关键字修饰的类,就叫抽象类,修饰的方法就叫抽象方法。如
public abstract class A{
public abstract void ok();
}
(2)
抽象方法格式:访问修饰符 abstract 返回类型 方法名();
抽象方法没有方法体,即{}。
抽象类格式:访问修饰符 abstract 类名{}
(3)抽象类中可以没有抽象方法,但含有抽象方法的类必须是抽象类。
二、抽象类细节和注意事项
(1)抽象类不能被实例化。
(2)abstract只能用来修饰类和方法,不用修饰属性和其他的。
(3)抽象类可以有类的任意成员。因为本质还是类。(如静态,非静态成员,代码块,构造方法等)
(4)如果一个类继承了抽象类,就必须继承它的所有抽象方法(除非自己也声明为抽象类)。
(5)抽象类不能与private,final,static一起修饰。这些关键字都是与重写相违背。
三、抽象类模版设计模式
案例:
有多个类,要完成不同的工作job()
要求统计各自完成任务的时间。
代码如下:
public class AA {
/*
计算1到十万的和所用时间
统计当前时间,在java.lang包下System类中的currentTimeMillis()方法,
可以统计当前时间。
*/
public void job(){
int sum=0;
long start=System.currentTimeMillis();
for (int i = 1; i <= 100000; i++) {
sum+=i;
}
long end=System.currentTimeMillis();
System.out.println("程序执行时间为"+(end-start));
}
}
public class BB {
public void job(){
int sum=0;
long start=System.currentTimeMillis();
for (int i = 1; i <= 8000000; i++) {
sum*=i;
}
long end=System.currentTimeMillis();
System.out.println("程序执行时间为"+(end-start));
}
}
public class TestTemplate {
public static void main(String[] args) {
AA aa = new AA();
aa.job();
BB bb = new BB();
bb.job();
}
}
但这样当类比较多的时候,代码的复用性较差。
优化后:
public abstract class Template {
public abstract void job();
public void calculateTime(){
long start=System.currentTimeMillis();
job();
long end=System.currentTimeMillis();
System.out.println("程序执行时间为"+(end-start));
}
}
public class AA extends Template{
public void job(){
int sum=0;
for (int i = 1; i <= 100000; i++) {
sum+=i;
}
}
}
这样讲共有的部分到一个模版类里面,在子类中重写父类的方法即可。