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等

原文地址:https://www.cnblogs.com/NTyee/p/13188204.html