(java基础学习)abstract关键字和模板设计模式

(java基础学习)abstract关键字和模板设计模式

一、abstract(抽象)

1.问题解决:当父类的某些方法需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类。

当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,这个方法就是抽象方法,用abstract来修饰该类就是抽象类。

例如 :把Animal做成抽象类,并让子类cat类实现

1
2
3
4
5
6
7
8
9
abstract class Animal{

String name;

int age;

abstract public void cry();

}

2.抽象类介绍

(1)用abstract关键字来修饰一个类时,这个类就叫抽象类

(2)用abstract关键字来修饰一个方法,这个方法就是抽象方法

3.抽象类细节

(1)抽象类不能被实例化

(2)抽象类不一定要包含abstract方法,也就是说,抽象类可能没有抽象方法

(3)一旦类包含了abstract方法,则这个类必须声明为abstract。

(4)abstract只能修饰类和方法,不能修饰属性和其他的。

(5)抽象类本质还是类,可以拥有任意成员(非抽象方法、静态属性等等)

(6)抽象方法不能有方法体。

(7)如果一个类继承了抽象类,那么它必须实现类的所有抽象方法,除非它自己也声明为abstract类。

(8)抽象方法不能使用private、final、static来修饰,因为这些关键字与重写相违背。

二、模板设计模式。

1.基本介绍

抽象类体现的就是一种模板设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

2.抽象设计能解决的问题

(1)当功能内部一部分实现是确定的,一部分是不确定的,这时可以把不确定的那部分暴露出去,让子类去实现。

(2)编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其他子类实现,就是一种模板模式。

例子:要求:(1)有多个类(2)要求统计各自完成任务的时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.hspedu.abstract_.Template;

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));//end-start为job(执行时间
}
}
package com.hspedu.abstract_.Template;

public class AA extends Template{
@Override
public void job() {
int num = 0;
for (int i = 1; i <= 900000; i++) {
num+=i;
}
}
}
package com.hspedu.abstract_.Template;

public class BB extends Template{
@Override
public void job() {
int num = 0;
for (int i = 1; i <= 500000; i++) {
num*=i;
}
}
}
package com.hspedu.abstract_.Template;

public class TestTemplate {
public static void main(String[] args) {
new AA().calculateTime();
new BB().calculateTime();
}
}

我的理解:当很多类有一个类似的方法,例如AA类要计算1+到900000的时间,BB类要计算1*到500000的时间,他们编写的方法里面的代码分为 前中后 三个部分,而且只有中间这部分的代码不同,前和后 两部部分代码相同,这时我们可以写一个抽象父类,父类中写一个抽象方法和一个普通方法,抽象方法就是把AA类和BB类的方法的 中间 那一部分代码抽象出来等子类去重写就行,然后普通方法里面写 (前部分代码+抽象方法+后部分代码),然后子类继承父类,然后重写抽象方法,然后调用父类的普通方法就行了。