抽象类
基本介绍
-
当父类的某些方法需要声明但是还没确定如何实现,则可以将其声明为抽象方法。含有抽象方法的类就是抽象类。
-
一般来说抽象类会被继承,在设计的时候会经常用到,其抽象方法会在子类中实现。
-
声明为抽象类语法:
访问修饰符 abstract 类名{ }
-
声明为抽象方法语法:(无方法体)
访问修饰符 abstract 返回类型 方法名(参数列表);
注意事项
- 抽象类不能被实例化
- 抽象类可以没有
abstract
方法,但是有abstract
方法的类一定要声明为抽象类 abstract
关键字只能修饰方法和类名,不能修饰属性或其他。
//AbstractDetail01.java
public class AbstractDetail01 {
}
//抽象类可以没有abstract方法
abstract class A{
public void hi(){
System.out.println("hi");
}
}
//但是有abstract方法的类一定要声明为抽象类
abstract class B{
public abstract void hi();
}
/** abstract关键字只能修饰方法和类名,不能修饰属性或其他。
* class C{
* public abstract int n1 = 1;//报错
* }
*/
-
抽象类本质还是类,可以拥有任意成员。如:非抽象方法、构造器、静态属性等。
-
抽象方法不能有主体(不能有大括号),即不能在父类中实现。
-
如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自身也声明为抽象类。从语法角度讲,所谓实现就是给方法后面补上大括号,无论是否大括号里有内容。
-
抽象方法不能用
private
、final
和static
等关键字来修饰,因为这些关键字和重写是相互违背的。private
:子类无法访问final
:子类无法重写static
:本类中要初始化,而抽象类不需要初始化
//AbstractDetail02.java
public class AbstractDetail02 {
public static void main(String[] args) {
System.out.println("你好");//只是为了能运行方面检测而写的语句
}
}
//抽象类本质还是类,可以拥有任意成员。声明以下抽象类后运行未报错
abstract class D{
public int n1 = 10;//普通属性
public static String name = "hspjava";//静态属性
public void hi(){//普通方法
System.out.println("hi");
}
public static void OK(){//静态方法
System.out.println("OK");
}
public abstract void hello();//抽象方法
}
//如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自身也声明为抽象类。
abstract class E{
public abstract void hi();
}
/**以下会报错,因为没有实现E中的hi()方法
* class F extends E{
*
* }
*/
//以下不会报错,因为F也声明为了抽象类,但要在F的子类中实现hi()方法
abstract class F extends E{
}
class G extends E{
@Override
public void hi() {//此处加了大括号,从语法上实现了方法,不会报错
}
}
实践-模板设计模式
需求:
- 有多个类,完成不同的任务
- 要求能够得到各自完成任务的时间
实践:
设计抽象类(Template
)完成如下功能:
- 编写方法
calculateTime()
,计算某段代码执行的耗时 - 编写抽象方法
job()
- 编写子类
Sub
继承抽象类Template()
,并实现job()
- 编写测试类
TestTemplate
抽象类Template
:
//Template.java
abstract class Template {
public abstract void job();//声明抽象类job
public void calTimes(){//统计耗时
long start = System.currentTimeMillis();//该方法用于统计1970-1-1 0:0:0至今的时间,单位ms
job();
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
}
}
在AA
类和BB
类中都实现job
方法,一个+=,一个*=
//AA.java
public class AA extends Template{
public void job(){
long num = 0;
for (long i = 0; i <= 80000; i++) {
num += i;
}
}
}
//BB.java
public class BB extends Template{
public void job(){
long num = 0;
for (long i = 0; i <= 80000; i++) {
num *= i;
}
}
}
测试主函数TemplateTest
:
//TemplateTest.java
public class TemplateTest {
public static void main(String[] args) {
AA aa = new AA();
aa.calTimes();
BB bb = new BB();
bb.calTimes();
}
}
运行结果:(耗时与计算机配置有关,不同计算机结果可能不一样)
耗时:1
耗时:1