Java面向抽象编程定义:
1、面向抽象编程指:当设计某些重要的类时,不让该类面向具体的类,而是面向抽象类,即抽象类是各个类的父类;
2、所设计的类中的重要数据是由抽象类声明的对象调用的,而不是具体类的对象,即通过方法传参,创建各个类的上转型对象;
如下代码↗:
创建一个抽象类(小艾同学),中间类(创建上转型对象)、子类(小艾各个爱好)、测试类(调用方法进行传参)
//抽象类
public abstract class Abstract {
//创建抽象方法,进行小艾同学爱好的设置
abstract void setHooby();
}
//中间类
public class middleClass {
//创建方法,进行上转型对象引用的赋值
public void getHooby(Abstract abs){
abs.setHooby();
}
}
//子类
public class singClass extends Abstract {
//重写父类的抽象方法,设置爱好
void setHooby() {
System.out.print(" 唱歌 ");
}
}
//子类
public class danceClass extends Abstract {
//重写父类的抽象方法,设置爱好
void setHooby() {
System.out.print(" 跳舞 ");
}
}
//测试类
public class testClass {
public static void main(String[] args) {
System.out.println("小艾的爱好有:");
//调用方法,进行传参
middleClass mc = new middleClass();
mc.getHooby(new singClass());
mc.getHooby(new danceClass());
}
}
以上代码中,各个类面向的是 抽象类Abstract ,而不是某个具体的类;通过上转型对象 abs,进行调用各个子类相应的方法;
代码输出结果:
小艾的爱好有:
唱歌 跳舞
总结:
面向抽象编程的目的:是为了应对用户需求的变化,将某个类中经常因需求变化而需要改动的代码从该类中分离出去。
面向抽象编程的核心:是让类中每种可能的变化对应地交给抽象类的一个子类去负责;
面向抽象编程 的 " 开-闭 " 原则 :
" 开-闭 " 原则 指:让设计的系统对 扩展开放,对 修改关闭;
以上面代码为例:
扩展开放: 指可以对继承抽象类的子类进行扩展,即当需求变化时,可以重新创建一个子类来完成需求;
修改关闭: 指对抽象类与中间类的修改是关闭的,一旦它们设计完成后,就不能进行修改了;(当然,不是说一定不能进行修改)
如以上代码中,进行 " 开-闭 " 原则 :
增加一个继承抽象类的子类,实现 小艾同学爱好的扩展 ;
//子类扩展
public class runClass extends Abstract {
//重写父类的抽象方法,设置爱好
void setHooby() {
System.out.print(" 跑步 ");
}
}
//测试类
public class testClass {
public static void main(String[] args) {
System.out.println("小艾的爱好有:");
//调用方法,进行传参
middleClass mc = new middleClass();
mc.getHooby(new singClass());
mc.getHooby(new danceClass());
mc.getHooby(new runClass());
}
}
那么代码输出结果:
小艾的爱好有:
唱歌 跳舞 跑步
" 开-闭 " 原则 总结 :
在设计系统时,应当首先考虑用户需求的变化,将 应对用户需求变化的部分 设计为 扩展开放,而 设计的核心部分(基本结构) 设计为 修改关闭 的 ;
如以上代码:
抽象类的子类、测试类 是 扩展开放的;
抽象类、中间类 是 修改关闭的;
与子类有关的匿名内部类实现 " 开-闭 " 原则:
匿名内部类就是一个类的子类,只是它是没有类名的,使用就无法声明对象,但可以通过父类的构造方法直接创建对象;
对于使用匿名内部类实现 " 开-闭 " 原则,以上面代码为例:
为抽象类创建一个匿名内部类,来完成 扩展开放(需求的扩展);
//测试类
public class testClass {
public static void main(String[] args) {
System.out.println("小艾的爱好有:");
//调用方法,进行传参
middleClass mc = new middleClass();
mc.getHooby(new singClass());
mc.getHooby(new danceClass());
mc.getHooby(new runClass());
//抽象类的匿名内部类
mc.getHooby(new Abstract(){
//重新抽象类的抽象方法
void setHooby() {
System.out.println("画画");
setMethod();
}
//匿名内部类自己定义的方法
void setMethod(){
System.out.println("我是匿名类自己定义的方法:小艾同学画画很厉害");
}
});
//匿名内部类的结束
}
}
通过 new Abstract(){ } 创建一个抽象类 Abstract 的匿名内部类,并重写抽象方法;
代码输出结果:
小艾的爱好有:
唱歌 跳舞 跑步 画画
我是匿名类自己定义的方法:小艾同学画画很厉害