多态与内部类
信息管理系统分析--多态的引入
-
存在问题
在现有的条件下:当我们需要改变使用的Dao类,则必须将Service类中的Dao类进行改变(创建另一个Dao类的对象),而改变之后
我们的Servie类中使用的Dao对象都需要改变。这样就使得类和类之间的关联性太差了 -
是否有一种方式可以使得我们改变了Dao类,而和Dao关联的类中的代码可以不改变呢(减低耦合性)?
多态的前提条件
- 多态:同一个类中不同的对象,在相同的方法下不同的表现
多态成员的访问特点
理解:成员多态的访问特点:
1.不能访问子类特有的成员和方法
2.当父类方法被重写,则方法重写的方法
多态的好处和弊端
多态中的转型
多态中转型存在的风险和解决方案
目标类型和实际类型必须是同一种类型
满足:
1.在向下转型前必须先通过线上转型实现目标和实际类型统一
- 解决方案
Fu f = new Fu ();
if(f instanceof Zi){//判断实际类型是否和目标类型相同
Zi z = (Zi)f;
}else {
System.out.println("类型不统一,不能转型");
}
信息管理系统----多态改进
- 代码存在问题
- 改进点
通过上面的改进,我们将Service和Dao之间的耦合性解开了(改变dao而不同变service类)。但是又有一个新的问题:就是我们的
factory和dao类又存在新的耦合性(dao类改变,factory类里面的代码就要跟着改变)
匿名内部类
- 正常的使用一个接口中的方法的步骤
- 使用匿名内部类可以将4步整合成一步完成
- 对于匿名内部类的理解
匿名内部类:是一个实现了接口或者是继承了类的子类的对象
关于对匿名内部类的理解 - 1.它不是一个类,而是类或者接口的实现类对象
package com.itheima.test3;
public class Testss {
public static void main(String[] args) {
new Inter(
) {
@Override
public void show() {
System.out.println("show");
}
};
}
}
interface Inter{
public abstract void show();
}
**情况说明:当接口中有多个方法需要调用(使用匿名内部类)
- 书写步骤理解
-
new Inter();(这是一个Inter类型的匿名对象)
-
new Inter(
) {
@Override
public void show() {
System.out.println("show");
}
};(这是一个实现了Inter中抽象方法的匿名对象)
-
这里理解为该对象重写了抽象方法
- 总结
匿名内部类在开发中使用场景
package com.itheima.test3;
public class TT {
public static void main(String[] args) {
swimming(new Swim() {//直接传递一个匿名内部类进去
@Override
public void swim() {
System.out.println("我们去游泳哦");
}
});
}
public static void swimming(Swim swim){//需要传递一个接口
swim.swim();
}
}
interface Swim{
void swim();
}