前言
前面,我们学习了面向对象的三大特征,其中多态的使用需要有子类重写父类的方法。今天,我们介绍学习一个与继承相关的知识——抽象类(abstract)。
正文
一、抽象类关键字
abstract,抽象类的关键字,意思是抽象的。可以用于修饰成员方法、类。
abstract class Fu {//abstract可以修饰类
abstract int a = 10;//java: 此处不允许使用修饰符abstract
public abstract void run();//abstract可以修饰方法.
}
二、抽象类的注意事项
-
抽象类不一定有抽象方法,抽象方法一定在抽象类中。
abstract class Fu { }//abstract修饰类可以没有抽象方法. //错误示范 class Fu { public abstract void run(); } //java: Test02.Fu不是抽象的, 并且未覆盖Test02.Fu中的抽象方法run() //正确示范 abstract class Fu { public abstract void run(); }abstract修饰的方法一定要在抽象类中.
-
抽象类中,可以修饰具体的方法,成员变量,构造器。
abstract class Fu { private String name;//具体的成员变量 public Fu(String name) { this.name = name; }//构造器 public String getName() { return name; }//具体的方法 public void setName(String name) { this.name = name; } }
-
抽象类不可以创建对象。
class Test { public static void main(String[] args) { Fu fu =new Fu(); }//java: Test02.Fu是抽象的; 无法实例化 }
但是,抽象类可以用于多态。
class Test { public static void main(String[] args) { Fu fu =new Zi(); } } abstract class Fu { } class Zi extends Fu { }
-
子类继承抽象类父类后,可以选择将父类所有的抽象方法重写或者将子类定义为抽象类。
abstract class Fu { abstract void run(); } class Zi extends Fu { @Override void run() { System.out.println("跑"); }//实现抽象方法 } abstract class Fu { abstract void run(); } abstract class Zi extends Fu { }//定义为抽象类
三、模板方法的设计
模板方法,是20多种设计的一种。需要用到抽象方法。
-
使用场景:多个方法中大部分的内容是重复的情况下,我们可以考虑使用模板实际。
-
使用方法,将相同的代码成分提取出来,创建一个方法用来存放相同的代码,并放入抽象方法来取代不同的代码部分。
-
标准格式:
-
抽象方法
-
模板方法
abstract class A { abstract void a();//抽象方法 public void run(){//模板方法 System.out.println("代码的相同部分"); a(); System.out.println("代码的相同部分"); } }
-
-
因为模板设计一旦被子类重写就毫无意义,所以为了防止模板方法在子类继承时被重写,我们可以在模板方法上定义一个final。
abstract class A { abstract void a(); public final void run(){ System.out.println("代码的相同部分"); a(); System.out.println("代码的相同部分"); }//final 修饰,无法继承修改。 }
-
模板方法的好处:解决了代码的重复部分,简化了代码的运行。