-
明确设计思想
-
子类越来越具体,父类需要越来越通用
-
父类和子类保证能够共享特征
-
父类的设计有时非常抽象,以至于它没有具体的实例
-
抽象类和抽象方法
-
abstract关键字修饰一个类,这个类叫做抽象类
-
abstract关键字修饰一个方法,该方法叫做抽象方法
-
含有抽象方法的类必须被声明为抽象类
-
抽象类不能被实例化(不能被new),抽象类是用来被继承的。
-
抽象类的子类必须重写父类的抽象方法,并提供方法体,如果未重写全部的抽象方法,还有其他抽象方法在子类中,则该子类也为抽象类(抽象类的子类可以是抽象类)
-
abstract不能修饰变量、代码块、构造器
-
abstract不能修饰私有方法、静态方法、final修饰的方法、final修饰的类
解析:
抽象类是用来模型化父类无法确定的方法实现,而是由子类提供具体实现的对象的类。
例如:
所有的车都有加速和减速,但是父类无法确定每种车的具体加速度,因此各个子类就需要继承车的加速和减速方法,根据具体的加速度描述各自加速和减速的情况
抽象类的模板方法设计模式
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,
子类在抽象类的基础上进行扩展、改造,但是子类总体上会保留抽象类的行为方式。
abstract class Template {public final void getTime() {long start = System.currentTimeMillis();code();long end = System.currentTimeMillis();System.out.println("执行时间是:" + (end -start));}public abstract void code();
}
class SubTemplate extends Template {public void code() {for (int i = 0; i < 10000; i++) {System.out.println(i);}}
}
抽象类的总体设计代码:
//首先定义一个Person抽象类
package com.carl.javacore.abstarctTest;import java.text.SimpleDateFormat;
import java.util.Date;public abstract class Person {public String name;//抽象类可以定义成员变量public static Date date=new Date();//可以定义静态变量public static final int LEG=4;//可以定义全局常量public Person(){//可以写无参构造器}public Person(String name) {//可以写有参构造器this.name = name;}public void eat(){//可以写具体方法//HH是24小时制,hh是12小时制SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");System.out.println(sdf.format(date));String time = sdf.format(date).toString().substring(0, 2);System.out.println(time);if(time.equals("09")){breakfast();}else if(time.equals("12")){lunch();}else if(time.equals("18")){dinner();}else if(time.equals("23") || time.equals("00")){supper();}else {System.out.println("吃点零食");}}public abstract void breakfast();//可以写抽象方法public abstract void lunch();public abstract void dinner();public abstract void supper();//也可以有代码块(静态代码块、局部代码块、普通代码块,同步代码块)//也可以有静态方法、final方法以及static final修饰的方法/*以下都支持public static void show(){}public final void play(){}public static final void work(){}*/
}
//两个Person的子类,用于实现具体的抽象方法,继承父类的行为
//Man子类
package com.carl.javacore.abstarctTest;public class Man extends Person{public Man(){super();}@Overridepublic void eat() {super.eat();}public void breakfast() {System.out.println("鸡蛋、牛排、牛奶");}@Overridepublic void lunch() {System.out.println("青椒肉丝、蒜苔炒肉,米饭");}@Overridepublic void dinner(){System.out.println("卤猪蹄、番茄鸡蛋汤,米饭");}@Overridepublic void supper() {System.out.println("烧烤");}
}
//Women子类
package com.carl.javacore.abstarctTest;public class Women extends Person{public Women(){super();}@Overridepublic void eat() {super.eat();}public void breakfast() {System.out.println("鸡蛋、牛奶");}@Overridepublic void lunch() {System.out.println("胡萝卜、黄瓜");}@Overridepublic void dinner(){System.out.println("鸡胸肉、烤玉米");}@Overridepublic void supper() {System.out.println("减肥不能吃夜宵");}
}
//测试类
package com.carl.javacore.abstarctTest;/*** 抽象类是一个描述性的类,具体的实现依靠子类去实现* 抽象类不能实例化,必须使用多态的方式进行调用*/
public class Test {public static void main(String[] args) {Person mp=new Man();mp.eat();Person wp=new Women();wp.eat();//匿名类,可以通过匿名类的方式来实现抽象类的抽象方法,但是不推荐,不好维护Person p2=new Person(){@Overridepublic void breakfast() {}@Overridepublic void lunch() {}@Overridepublic void dinner() {}@Overridepublic void supper() {}};}
}