一、 多态
1. 多态性是指同一操作作用于某一类对象,可以有不同的解释,产生不同的执行效果。(同一事件发生在不同的对象身上,有不同的效果)。
2. 多态存在的三个必要条件
a) 需要存在继承和实现关系;
b) 同样的方法调用而执行不同操作、运行不同代码;(重写操作)
c) 在运行时父类或接口的引用变量可以引用其子类的对象;
3. 多态的作用(主要是父类对象的引用变量可以引用其子类的对象,越是抽象的东西 越代表稳定)
多态通过分离做什么和怎么做,从另一个角度将接口和实现进行分离;
多态消除了类型之间的耦合关系;
多态的存在提高了程序的扩展性和后期的可维护性。
4. 对象的上下转型
向上转型:
a) 由子类转型成父类,在继承图上是向上移动的;
b) 从一个较专用类型向比较通用类型转换,所以总是安全的,即子类是父类的一个超级;
c) 在向上转型过程中,类接口唯一可能发生的事情是丢失方法,而不是获取方法(父类的引用变量只能调用父类中的方法或子类重写父类的方法);
向下转型:
a) 与向上转型的操作相反,不安全(可能需要instanceof操作符协助);
Note:instanceof运算符用来在运行时通过返回一个布尔值来指出对象是否是特定类或者是它的子类的一个实例。
result = object instanceof class
判断对象object是不是class或其子类的一个实例
b) LSP(liskov替换原则);子类型必须能够替换掉它们的基类型;
5. 动态绑定和静态绑定
(静态绑定)在程序执行前方法已经被绑定,即该方法不能再被改写,java当中的方法是final,static,private和构造方法都是前期绑定的。
(动态绑定)运行时,根据变量实际引用的对象类型决定调用哪个方法。
二、 抽象类
1. Java中可以定义没有方法体的方法,即抽象方法,该方法由子类来具体的实现,含有抽象方法的类成为抽象类。
2. 抽象方法的特点:——只有方法的声明,没有方法的实现
a) 只有方法头没有方法体的方法成为抽象方法(即只做个方法的声明);
b) 抽象方法用abstract来修饰;
c) 抽象方法代表一种不确定的操作或行为。
抽象类特点:
a) 定义中含抽象方法的类叫做抽象类;
b) 抽象类用abstract来修饰;
c) 抽象类代表一种抽象的数据类型;
d) 抽象类不能实例化;
e) 抽象类中可以有具体方法,可以没有抽象方法;
f) 一旦一个类继承了抽象类,那么这个类幺妹实现抽象类中的抽象方法,要么继续抽象下去。
g) 抽象类,声明即可,由子类去具体实现,不用{}
public abstract void teaching();
3. 使用抽象类定义的模板方法
定义:一个模板方法用一些抽象的操作定义一个算法,而子类将重新定义这些操作已提供具体行为。
意图:定义一个操作中的算法框架,把一些步骤推迟到子类去实现。模板方法模式让子类不需要改变算法结构而重新定义特定的算法步骤。
三、 接口
1. 接口语法
interface 接口名{ //静态常量、抽象方法 }
2. 接口特点
a) 接口中只能存放静态常量和抽象方法;
b) Java接口是对功能的扩展(非通用方法,存放特有的方法或变量);
c) 通过实现接口,java类可以实现多实现;
d) 一个类可以同时继承(extends)一个父类并且实现(implements)多个接口;
e) 接口与接口之间可以通过使用extends来产生继承关系;
f) 抽象类是对一组具有相同属性和行为的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和行为的逻辑上不相关的事物的一种抽象;
g) 接口的引用变量可以引用其实现类的对象(类似于父类的引用变量可以引用其子类的对象)。
3. 面向接口的编程
开放系统时,主题构架使用接口,接口构成系统的骨架;
4. 简单工厂模式
a) 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。
b) 意图:定义一个类,由它负责根据一定的条件创建某一具体类的实例。
5. 策略模式
定义:是对算法的包装,把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类型的子类型。
四、 内部类
1. 内部类:将一个类定义在另一个类的内部
a) 内部类可以很好的实现隐藏,可以使用public、protected、private修饰符;
b) 内部类可以直接访问外部类的所有成员,包括私有成员;
c) 外部类不能直接访问内部类的成员,必须要建立内部类的对象才可以访问;
d) 内部类可以间接地实现多继承,还可以避免修改接口而实现同一个类中两种同名方法的调用。
2. 成员内部类特点
a) 成员内部类属于外部类的实例成员,成员内部类可以有public、protected、default、private 权限修饰符,在成员内部类中访问外部类的成员方法和属性,使用外部类名.this.成员方法(属性)形式;
b) 创建成员内部类的实例使用“外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)”;
c) 成员内部类名不能与外部类名重名;
d) 不能在成员内部类中定义static属性、方法和类(static final形式的常量定义除外)。因为一个成员内部类实例必然与一个外部类实例关联,static成员完全可以移到其外部类中去。
3. 匿名内部类及应用
a) 匿名内部类是没有名称的内部类,没有办法引用它们。必须在创建时,作为new语句的一部分来声明并创建它们的实例;
b) 匿名内部类必须继承一个类(抽象,非抽象都可以)或者实现一个接口。如果父类(或父接口)是抽象类,则匿名内部类必须实现其所有抽象的方法;
c) 匿名内部类中可以定义代码块,用于实例的初始化,但是不能定义静态代码块;
d) 语法:new interface、superclass(){ //类体} 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口,并同时创建该匿名类的一个新实例。
4. 静态内部类及应用
a) 使用static修饰的成员内部类叫静态内部类;
b) 静态内部类和外部类没有任何关系,只是在生成类名和类定义时有影响。静态内部类可以看做是与外部类平级的类;
c) 静态内部类的使用方式与外部类平级的类完全相同;
d) 静态内部类不能与外部类重名;
e) 静态内部类不能访问外部类的非静态的属性和方法,外部类不能访问内部类的非静态的属性和方法;
f) 创建静态内部类的实例使用外部类名.内部类名 实例名 = new 外部类名.内部类名(参数)。
5. 局部内部类
a) 定义在代码块、方法体内的类叫局部内部类;
b) 局部内部类访问外部类的属性和方法:外部类名.this.属性名/方法名(参数);
c) 对外部世界完全隐藏,只能在其作用域内生成对象;
d) 局部内部类不能加访问修饰符,因为它们不是类成员;
e) 成员内部类不能与外部类重名;
f) 局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰;