1.为什么要有抽象类?
给学生讲课的时候,尤其是一些理论技术性的知识,我都喜爱把这种理论或技术产生的背景和理由将清楚,因为从人类发展的来看,总是人们的需求推动技术的发展,我们讲这些背景知识,实际上是还原了人们对事物的认知规律。
尽管如此,但实际上在我们讲课的过程中,不可能每个知识点都给出为什么?有时都找不到其产生的很系统的背景知识。比如,对于JAVA的有些知识点,我就有点束手无策。其中之一,JAVA为什么要有这个抽象类呢?
实际上,我后来学习和开发过程中才慢慢理解,这可能完全是为了设计的需要。语言是为了设计产品而出生的,而在设计的过程中,人们可能获得了一些共性,带普遍性的属性和行为,可能很多还停留在思考上设计上的还没办法完成的就设计一个抽象的,具体的实现留在子类去完成,这样就降低了程序的耦合度,使程序的通用性更强大,代码的重用性也更好。而这样需求,在我们开发产品的过程中,会经常遇到,我想这应该是JAVA抽象类产生的原因之一吧。
2.实例
Rectangle.java
(2)增删改查
给学生讲课的时候,尤其是一些理论技术性的知识,我都喜爱把这种理论或技术产生的背景和理由将清楚,因为从人类发展的来看,总是人们的需求推动技术的发展,我们讲这些背景知识,实际上是还原了人们对事物的认知规律。
尽管如此,但实际上在我们讲课的过程中,不可能每个知识点都给出为什么?有时都找不到其产生的很系统的背景知识。比如,对于JAVA的有些知识点,我就有点束手无策。其中之一,JAVA为什么要有这个抽象类呢?
实际上,我后来学习和开发过程中才慢慢理解,这可能完全是为了设计的需要。语言是为了设计产品而出生的,而在设计的过程中,人们可能获得了一些共性,带普遍性的属性和行为,可能很多还停留在思考上设计上的还没办法完成的就设计一个抽象的,具体的实现留在子类去完成,这样就降低了程序的耦合度,使程序的通用性更强大,代码的重用性也更好。而这样需求,在我们开发产品的过程中,会经常遇到,我想这应该是JAVA抽象类产生的原因之一吧。
2.实例
(1)几何图形、三角形和矩形的面积
GeometricObject.java
package com.solo;
public abstract class GeometricObject {
private String color = "white";
private boolean filled;
private java.util.Date dateCreated;
protected GeometricObject(){
dateCreated = new java.util.Date();
}
protected GeometricObject(String color,boolean filled){
dateCreated = new java.util.Date();
this.color = color;
this.filled = filled;
}
public String getColor(){
return color;
}
public void setColor(String color){
this.color = color;
}
public boolean isFilled(){
return filled;
}
public void setFilled(boolean filled){
this.filled = filled;
}
public java.util.Date getDateCreated(){
return dateCreated;
}
public String toString(){
return "创建于" + dateCreated + "\n颜色:" + color + "充填:" + filled;
}
/**
* 定义了一个求面积的抽象方法
* @return
*/
public abstract double getArea();
/**
* 定义了一个求周长的抽象方法
* @return
*/
public abstract double getPerimeter();
}
Circle.java
package com.solo;
public class Circle extends GeometricObject {
private double radius;
public Circle(){
}
public Circle(double radius){
this.radius = radius;
}
public Circle(double radius,String color,boolean filled){
this.radius = radius;
setColor(color);
setFilled(filled);
}
public double getRadius(){
return radius;
}
public void setRadius(double radius){
this.radius = radius;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return radius * radius * Math.PI;
}
public double getDiameter(){
return 2*radius;
}
@Override
public double getPerimeter() {
// TODO Auto-generated method stub
return 2*radius*Math.PI;
}
public void printCircle(){
System.out.println("The circle is created" + getDateCreated() + "and the radius is " + radius);
}
}
Rectangle.java
package com.solo;
public class Rectangle extends GeometricObject {
private double width;
private double height;
public Rectangle() {
}
public Rectangle(double width, double height) {
this.height = height;
this.width = width;
}
public Rectangle(double width, double height, String color, boolean filled) {
this.width = width;
this.height = height;
setColor(color);
setFilled(filled);
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
@Override
public double getPerimeter() {
return 2 * (width + height);
}
}
TestGeometricObject.java
package com.solo;
public class TestGeometricObject {
public static void main(String[] args){
GeometricObject geoObject1 = new Circle(5);
GeometricObject geoObject2 = new Rectangle(5,3);
System.out.println("The two objects have the same area?" + equalArea(geoObject1,geoObject2));
displayGeometricObject(geoObject1);
displayGeometricObject(geoObject2);
}
public static boolean equalArea(GeometricObject object1,GeometricObject object2){
return object1.getArea() == object2.getArea();
}
public static void displayGeometricObject(GeometricObject object){
System.out.println();
System.out.println("The area is " + object.getArea());
System.out.println("The perimeter is " + object.getPerimeter());
}
}
(2)增删改查
public abstract class CrudActionSupport<T> extends ActionSupport implements Preparable,ModelDriven<T>{
public CrudActionSupport(){
//访问日志
HttpServletRequest request = Struts2Utils.getRequest();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
Jm_adminlogService jm_adminlogService = (Jm_adminlogService)ctx.getBean("jm_adminlogService");
String strBackUrl = request.getContextPath() //项目名称
+ request.getServletPath(); //请求页面或其他地址
String querystring = request.getQueryString();
if(StringUtils.isNotBlank(querystring)){
strBackUrl = strBackUrl + "?" + querystring;
}
Jm_user jmuser = SpringUtil.getJm_user();
Jm_adminlog ja = new Jm_adminlog();
ja.setIpaddress(ParamUtil.getIp(request));
ja.setDate(JDate.getStringDate());
ja.setScript(strBackUrl);
ja.setAction(jmuser.getZsxm());
ja.setUserid(jmuser.getUserid());
jm_adminlogService.save(ja);
}
/**
* Action函数, 默认的action函数, 默认调用list()函数.
*/
@Override
public String execute() throws Exception {
return list();
}
// CRUD函数 //
/**
* Action函数,显示Entity列表界面.
* 建议return SUCCESS.
*/
public abstract String list() throws Exception;
/**
* Action函数,显示新增或修改Entity界面.
* 建议return INPUT.
*/
@Override
public abstract String input() throws Exception;
/**
* Action函数,新增或修改Entity.
* 建议return RELOAD.
*/
public abstract String save() throws Exception;
/**
* Action函数,删除Entity.
* 建议return RELOAD.
*/
public abstract String delete() throws Exception;
}
下面引用一个例子