• 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等

  • 相关阅读:
    POJ NOI0113-05 素数回文数的个数(PKU2928)
    POJ NOI0113-04 垂直直方图(PKU2800)
    POJ NOI0113-03 八进制小数(PKU2765)
    UVALive2245 POJ1131 HDU1376 ZOJ1086 Octal Fractions【进制】
    HDU2708 Vertical Histogram
    POJ2136 Vertical Histogram【打印图案】
    POJ2190 HDU2714 ISBN
    POJ NOI0113-02 不吉利日期(PKU2723)
    POJ NOI0113-01 数制转换(PKU2710)
    POJ NOI MATH-7828 最大公约数与最小公倍数
  • 原文地址:https://www.cnblogs.com/NTyee/p/13188204.html
Copyright © 2020-2023  润新知