-
明确设计思想
-
子类越来越具体,父类需要越来越通用
-
父类和子类保证能够共享特征
-
父类的设计有时非常抽象,以至于它没有具体的实例
-
抽象类和抽象方法
-
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();
}
@Override
public void eat() {
super.eat();
}
public void breakfast() {
System.out.println("鸡蛋、牛排、牛奶");
}
@Override
public void lunch() {
System.out.println("青椒肉丝、蒜苔炒肉,米饭");
}
@Override
public void dinner(){
System.out.println("卤猪蹄、番茄鸡蛋汤,米饭");
}
@Override
public void supper() {
System.out.println("烧烤");
}
}
//Women子类
package com.carl.javacore.abstarctTest;
public class Women extends Person{
public Women(){
super();
}
@Override
public void eat() {
super.eat();
}
public void breakfast() {
System.out.println("鸡蛋、牛奶");
}
@Override
public void lunch() {
System.out.println("胡萝卜、黄瓜");
}
@Override
public void dinner(){
System.out.println("鸡胸肉、烤玉米");
}
@Override
public 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(){
@Override
public void breakfast() {
}
@Override
public void lunch() {
}
@Override
public void dinner() {
}
@Override
public void supper() {
}
};
}
}