目录
1.5 抽象的具体应用:模板方法设计模式(TemplateMethod)
01 抽象类(abstract)
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类
修饰类(抽象类)
/*
abstract 修饰类:抽象类
* 》 此类不能实例化
* 》 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化全过程)
* 》 开发中,都会提供抽象类的子类,让子类对象实例化,实现相关的操作
*/
public class AbstractTest {
public static void main(String[] args){
Person1 person = new Person1(); // 报错 不可实例化
Student student = new Student();
}
}
abstract class Person1{ //形容 类
String name;
int age;
public Person1() {
}
public Person1(String name, int age) {
this.name = name;
this.age = age;
}
}
// 子类可以实例化
class Student extends Person1{
public Student(String name, int age){
super(name, age);
}
}
修饰方法(抽象方法)
4.abstract 修饰方法:抽象方法
* > 抽象方法,只有方法的声明,没有方法体。
* > 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法
抽象方法不可被调用,就要保证类不能被实例化
* > 若子类重写了父类中所有的抽象方法,此子类才能实例化,否则此子类也是抽象类
abstract class Creature{
public abstract void breath(); // 只能声明,没有方法体
}
abstract class Person extends Creature{
String name;
int age;
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
//不是抽象方法
// public void eat(){
// System.out.println("人吃饭");
// }
//抽象方法
public abstract void eat(); // 此时Person类有两个抽象方法
public void walk(){
System.out.println("人走路");
}
}
class Student extends Person{
public Student(String name,int age){
super(name,age);
}
public void eat(){ // 重写父类的抽象方法
System.out.println("学生应该多吃有营养的。");
}
@Override
public void breath() { // 也要重写根类的抽象方法
System.out.println("学生应该呼吸新鲜的无雾霾空气");
}
}
1.1 抽象应用场景举例
抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。
/* Java 允许类设计者指定:超类声明一个方法但不提供实现,该方法的实现由子类提 供。这样的方法称为抽象方法。有一个或更多抽象方法的类称为抽象类。
* Vehicle 是一个抽象类,有两个抽象方法。
* 注意:抽象类不能实例化 new Vihicle()是非法的
*/
public abstract class Vehicle{
public abstract double calcFuelEfficiency();//计算燃料效率的抽象方法
public abstract double calcTripDistance();//计算行驶距离的抽象方法
}
public class Truck extends Vehicle{
public double calcFuelEfficiency(){
//写出计算卡车的燃料效率的具体方法
}
public double calcTripDistance(){
//写出计算卡车行驶距离的具体方法
}
}
public c