文章目录

  • 抽象类与抽象方法
  • abstract关键字的使用
  • abstract修饰类:抽象类
  • abstract修饰方法:抽象方法
  • abstract使用上的注意点:
  • 抽象类的匿名子类
  • 模板方法设计模式


抽象类与抽象方法

abstract关键字的使用

  • abstract:抽象的
  • abstract可以用来修饰的结构:类、方法

abstract修饰类:抽象类

  • 此类不能实例化
  • 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
  • 开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作

abstract修饰方法:抽象方法

  • 抽象方法只有方法的声明,没有方法体
  • 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
  • 若子类重写了父类中的所有的抽象方法后,此子类方可实例化
  • 若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰

abstract使用上的注意点:

  • abstract不能用来修饰:属性、构造器等结构
  • abstract不能用来修饰私有方法、静态方法、final的方法、final的类

抽象类的匿名子类

匿名对象:

method(new Student());

抽象类的匿名子类:

Person p = new Person(){

   @Override
   public void eat() {
      System.out.println("吃东西");
   }

   @Override
   public void breath() {
      System.out.println("好好呼吸");
   }
   
};

如果子类构造器中对父类方法进行重写,那么就调用重写的方法,这就是匿名子类的语法特性与目的。我们既可以在匿名子类中进行调用父类的方法,也可以在匿名子类中重写父类的方法以及直接调用父类方法。

模板方法设计模式

解决问题:

  • 当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
  • 换句话说,在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。
public class TemplateTest {
   public static void main(String[] args) {
      
      SubTemplate t = new SubTemplate();
      
      t.spendTime();
   }
}

abstract class Template{
   
   //计算某段代码执行所需要花费的时间
   public void spendTime(){
      
      long start = System.currentTimeMillis();
      
      this.code();//不确定的部分、易变的部分
      
      long end = System.currentTimeMillis();
      
      System.out.println("花费的时间为:" + (end - start));
      
   }
   
   public abstract void code();
   
   
}

class SubTemplate extends Template{

   @Override
   public void code() {
      
      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);
         }
      }

   }
   
}