- 对象多态性的核心本质:方法的覆写;
抽象类的定义与使用
- 抽象方法:只声明未实现的方法(没有方法体);
- 所有的抽象方法要求使用abstract关键字来定义,并且抽象方法所在的类也一定要使用abstract关键字来定义,表示抽象类。
- 抽象类中包含抽象方法,而抽象方法不包含方法体,所以抽象类不能直接产生实例化对象;
抽象类的使用原则:
- 所有的抽象类必须有子类;
- 抽象类的子类必须覆写抽象类的所有抽象方法(子类不是抽象类);【子类的权限要 >= 父类】;
- 抽象类的对象可以通过对象多态性利用子类为其实例化;
- private和abstract不能同时使用;
- 抽象类也允许提供构造方法,即实例化子类时一定要先调用父类构造方法;若父类没有无参构造,那么子类构造必须使用super明确指出使用父类哪个构造方法。
abstract class A{
public A() {//4,调用父类构造
this.print();//5,调用被子类覆盖的方法
}
public abstract void print();
}
class B extends A{
private int num=100;
public B(int num) { //2,调用子类实例化对象
super();//3,先调用父类构造方法
this.num=num;
}
public void print() {//5,子类对象的属性此时未被发初始化
System.out.println(this.num);//对应数据类型的默认值
}
}
public class Test1{
public static void main(String[] args) {
new B(30); //1,实例化子类对象
}
}
若构造方法中属性值未被初始化修改,则对象中的属性一定都是其对应数据类型的默认值。
- 抽象类中允许不定义任何的抽象方法,但是此时的抽象类仍然不可直接创建实例化对象。
- 抽象类一定不能使用final定义,由于final声明的类不允许有子类,但抽象类必须有子类;抽象方法不能使用private定义,由于抽象方法必须被覆写;
- 抽象类也分为内部抽象类 与 外部抽象类;内部抽象类可以使用static定义来描述,外部抽象类不可;
模板设计模式:
- 定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板:
//基类声明为抽象类:子类必须实现其操作;
abstract class AbstractClass{
//模板方法,声明为final 以免子类改变算法的顺序
final void temMethod(){}
//具体操作不同子类具体实现
abstract void Operation1();
abstract void Operation2();
//共用的方法定义在超类中,可以被模板方法或子类直接使用
final void Operation(){
//实现
}
//钩子方法时“默认不做事的方法”,子类可以决定是否覆写
//钩子方法,超类中是默认实现
void hook(){}
接口:
定义:接口是抽象方法和全局变量的集合,Java中用interface定义;
- 实现接口用implements关键字;
- 一个子类可以实现多个接口;
- 接口的子类(不是抽象类)必须覆写接口中的全部抽象方法,后可以利用子类的向上转型通过实例化子类来得到接口的实例化对象;【父类名称 父类对象=new 子类名称();子类向上转型,为父接口实例化对象】
- 接口只允许Public权限;【不管是属性还是方法,权限都是public】;
- 当一个子类既需要实现接口又需要继承抽象类时,先使用extends继承抽象类,再使用implements实现接口;
- 一个抽象类可以使用implements实现多个接口,但是接口不能继承抽象类(由于接口中也是抽象方法);
- 一个接口可以使用extends继承多个父接口;
工厂设计模式:
简单工厂模式:专门定义一个类来创建其他类的实例,被创建的实例通常都有共同的父类;
概要:一个抽象产品类;电脑接口;具体产品类实现接口,打印具体电脑;创建一个工厂类,通过方法创建所需要种类的对象;
优点:
- 简单易于实现;
- 把类的实例交给工厂,易于解耦;