笔记来自2019求知讲堂零基础Java入门编程视频教程 https://www.bilibili.com/video/av76235341
抽象类
随着继承层次的加深,子类变得越来越具体,父类就会越来越通用。
类的设计应该保证父类和子类能过共享特征,所以有时候将一个父类设计的非常抽象,以至于它没有办法具体的实例化,这样的类就叫做抽象类。
举一个形象的例子,狗的移动方式是跑,鱼类的移动方式是游,鸟类的移动方式是飞,那他们如果有一个父类动物,动物类中也有一个移动方法,而这个方法没办法像子类一样具体描述出来。
用abstract关键字修饰的类就叫做抽象类。
用abstract也可以修饰方法,即为抽象方法。
- 抽象类不能被实例化,是用来被继承的。
- 抽象类可以有构造方法,但不能用来new实例,只能用来被子类调用
- 抽象方法只有声明,没有方法的实现(没有大括号,直接以分号结束)
- 含有抽象方法的类必须声明为抽象类
- 抽象类的子类必须重写父类中的抽象方法,如果没有重写全部抽象方法,仍为抽象类,需要用abstract修饰
- 不能用abstract修饰属性、私有方法、构造器、静态方法、final方法。
//抽象父类,有两个抽象方法
public abstract class Animal {
public abstract void test();
public abstract void move();
}
//子类只重写了一个抽象方法,还有一个没有重写,所以这个类也必须是抽象类
abstract class Dog extends Animal{
@Override
public void move() {
System.out.println("狗的移动方式是跑");
}
}
//父类层级上所有抽象方法全部重写,才可以写成非抽象类,当然根据需要也可以依然作为抽象类
class TestDog extends Dog{
@Override
public void test() {
System.out.println();
}
}
模板方法设计模式(TemplateMethod)
抽象类作为多个子类的通用模板
子类在抽象类的基础上进行扩展、改造
当功能内部一部分实现是确定的,但另一部分实现是不确定的,就可以把不确定的部分作为一个抽象方法,让子类去实现。
编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留个子类实现,这就是一种模板模式。
例如,父类中getTime()方法想要实现获取一段代码的运行时间,但不确定这段代码是什么,就可以作为抽象方法让子类去实现。
//父类
abstract public class Template {
//定义一个抽象方法,存放要计算的代码
public abstract void code();
//定义一个不能被子类重写的方法,用来计算时间
public final void getTime() {
long start = System.currentTimeMillis();
code();
long end = System.currentTimeMillis();
System.out.println("code方法执行的时间:" + (end -start));
}
}
class TestTmp extends Template{
//重写方法,提供代码
@Override
public void code() {
int k = 0;
for (int i = 0; i <5000000; i++) {
k+=i;
}
System.out.println(k);
}
}
public class Test2 {
public static void main(String[] args) {
TestTmp t = new TestTmp();
t.getTime();
}
}