Abstract
abstract:抽象的
1.可以用来修饰:类、方法
2.具体的:
abstract 修饰类:抽象类
1.此类不可实例化
2.抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化全过程)
3.开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作 --->抽象的使用前提:继承性
/*
* Person 为抽象类
* Person p = ...声明一个抽象类类型时,= 右边必定是一个子类的实例对象,
* method(Person p)方法中,现实使用时传入实参时必定是实例的子类对象,
* 上述体现了多态性。
* 多态性的使用前提是继承性。
*/
main(){
Person p = ...
}
public void method(Person p) {
}
abstract 修饰方法:抽象方法
1.抽象方法,只有方法的声明,没有方法体。
2.包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法。
3.若子类重写了父类中所有的抽象方法后,此子类方可实例化。
4.若子类没有重写了父类中所有的抽象方法,则子类也是一个抽象类,需要用abstract修饰。
3.注意点:
1.abstract 不能用来修饰变量、代码块、构造器;
2.abstract 不能用来修饰私有方法、静态方法、final 的方法、final 的类。
abstract和static不可以共用!
静态方法不能被重写。
abstract fly(); fly方法不能被对象调用,再没有子类重写该方法之前。
若static修饰后,abstract static fly(); 静态方法(类方法)无需对象就可以调用,
很快就可以发现调用此方法无实际意义(没有方法体)。
4.abstract的应用举例:
public abstract class Vehicle {
public abstract double calcFuelEfficiency();//计算燃料效率的抽象方法
public abstract double calcTripDistance();//计算行驶距离的抽象方法
}
public class Truck extends Vehicle {
public double calcFuelEfficiency() {
//写出计算卡车的燃料效率的具体方法
}
public double calcTripDistance() {
//写出计算卡车行驶距离的具体方法
}
}
public class RiverBarge extends Vehicle {
public double calcFuelEfficiency() {
//写出计算驳船的燃料效率的具体方法
}
public double calcTripDistance() {
//写出计算驳船行驶距离的具体方法
}
}
多态的应用:模板方法的设计模式(TemplateMethod)
1.解决的问题
在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。
2.举例
public class TemplateTest {
public static void main(String[] args) {
SubTemlate t = new SubTemlate();
t.sendTime();
}
}
abstract class Template{
//计算某段代码执行所需花费的时间
public void sendTime(){
long start = System.currentTimeMillis();
this.code(); //不确定部分,易变的部分
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));
}
public abstract void code();
}
//具体的例子
class SubTemlate extends Template{
@Override
public void code() {
//1000以内的质数
for(int i = 2;i <= 1000;i++){
boolean isFlag = true;
for(int j = 2;j <= Math.sqrt(i);j++){
if(i % j == 0){
isFlag = false;
break;
}
}
if(isFlag){
System.out.println(i);
}
}
}
}
3.应用场景
模板方法设计模式是编程中经常用得到的模式。各个框架、类库中都有他的影子,比如常见的有:
数据库访问的封装
Junit 单元测试
JavaWeb 的 Servlet 中关于 doGet/doPost 方法调用
Hibernate 中模板程序
Spring 中 JDBCTemlate、HibernateTemplate等