上季内容回顾:
1、面向对象中接口与抽象类的具体应用。 
  可以通过对象的多态性,为父类实例化,之后一切的操作标准以父类为主。
本季主要知识点:
讲解抽象类与接口的关系。
1、一个抽象类中能否包含一个接口呢?
abstract class A    
{    
        public abstract void fun();    
        interface B    
        {    
                public void print();    
        }    
}
我们来验证测试下哈~发现生成A$B.class,表示B作为A的内部接口,证明一个抽象类中可以包含一个内部接口。
那怎么使用呢?我们看下面哈~
首先我们先子类X覆写父类A方法但不覆写接口B中的方法
abstract class A    
{    
        public abstract void fun();    
        interface B    
        {    
                public void print();    
        }    
}    
class X extends A    
{    
        //覆写父类fun()方法    
        public void fun()    
        {    
                System.out.println("Hello World!!!");    
        }    
}
发现编译没有问题哈~
现在我们测试覆写接口方法哈~
abstract class A    
{    
        public abstract void fun();    
        interface B    
        {    
                public void print();    
        }    
}    
class X extends A    
{    
        //覆写父类fun()方法    
        public void fun()    
        {    
                B b = new Y();    
                b.print();    
        }    
        class Y implements B    
        {    
                //覆写父类接口中的方法print()    
                public void print()    
                {    
                System.out.println("Hello Java!!!");    
                }    
        }    
}
现在我们加上主方法进行测试哈~
abstract class A    
{    
        public abstract void fun();    
        interface B    
        {    
                public void print();    
        }    
}    
class X extends A    
{    
        //覆写父类fun()方法    
        public void fun()    
        {    
                B b = new Y();    
                b.print();    
        }    
        class Y implements B    
        {    
                //覆写父类接口中的方法print()    
                public void print()    
                {    
                System.out.println("Hello Java!!!");    
                }    
        }    
}    
public class Demo01    
{    
        public static void main(String args[])    
        {    
                A a = new X();    
                a.fun();    
        }    
}
证明一个抽象类中可以包含一个接口,之后在抽象类的子类中可以有选择的是否实现抽象类中的接口。
2、一个接口中能否包含一个抽象类呢?同上,都是可以选择是否实现
interface A    
{    
        public void fun();    
        abstract class B    
        {    
                public abstract void print();    
        }    
}
下面我们写上个子类,检验一下是否可以有选择实现抽象类B
interface A    
{    
        public void fun();    
        abstract class B    
        {    
                public abstract void print();    
        }    
}

class X implements A    
{    
        public void fun()    
        {    
        }    
}

验证可以哈~
下面覆写抽象类B中print()方法
interface A    
{    
        public void fun();    
        abstract class B    
        {    
                public abstract void print();    
        }    
}

class X implements A    
{    
        public void fun()    
        {    
                new Y().print();    
        }    
        class Y extends B    
        {    
                public void print()    
                {    
                System.out.println("Hello World!!!");    
                }    
        }    
}    
public class Demo02    
{    
        public static void main(String args[])    
        {    
                A a = new X();    
                a.fun();    
        }    
}

3、观察以下的程序,验证输出结果
abstract class A    
{    
        public A()    
        {    
                this.print();    
        }    
        public abstract void print();    
}    
class B extends A    
{    
        private int i = 30;    
        public B(int i)    
        {    
                this.i = i;    
        }    
        public void print()    
        {    
                System.out.println("i = "+i);    
        }    
}    
public class Demo03    
{    
        public static void main(String args[])    
        {    
                new B(50);    
        }    
}
输出结果为0哈,这与子类对象实例化过程有关哈
回顾:子类对象的实例化过程 
  · 子类对象使用new关键字要调用构造方法 
  ·  调用构造方法时的顺序:先去调用父类中的构造方法(默认为无参构造),之后再调用子类中的构造方法。 
  · 调用构造方法的目的:为其内部的属性初始化 
  · 子类中的属性在没有完成父类中的构造方法之前,所有的内容都是默认值,整型是“0” 。
思考: 
  我们知道一个子类如果实现了一个接口则肯定要覆写接口中的全部抽象方法。那问?是否可以采用一种方式,让子类可以有选择的去覆写自己真正需要的方法。
interface Door    
{    
        //开门    
        public void openDoor();    
        //关门    
        public void closeDoor();    
        //维修    
        public void repairDoor();    
        //拆除    
        public void removeDoor();    
        //锁门    
        public void lockDoor();    
}    
class D implements Door    
{    
        //子类现在肯定要覆写里面全部的抽象方法    
}
矛盾点: 
  · 子类不需要覆写全部的方法 
  · 如果子类直接实现了接口则肯定要覆写全部的方法 
  · 解决:如果中间加入了一个过渡端呢? 
   接口  --> 过渡端 --> 子类 
|-  此过渡端不应该被直接使用。 --> 抽象类
过渡端使用抽象类实现最合适,因为抽象类可以实现一个接口同时可以有一些抽象方法,并且不能直接被new关键字实例化。
interface Door    
{    
        //开门    
        public void openDoor();    
        //关门    
        public void closeDoor();    
        //维修    
        public void repairDoor();    
        //拆除    
        public void removeDoor();    
        //锁门    
        public void lockDoor();    
}

abstract class DoorAdapter implements Door    
{    
        //但是以下的方法虽然实现了,可是没有具体的方法体    
        public void openDoor(){}    
        public void closeDoor(){}    
        public void repairDoor(){}    
        public void removeDoor(){}    
        public void lockDoor(){}    
}    
class D extends DoorAdapter    
{    
        //子类现在肯定要覆写里面全部的抽象方法    
        //只需要打开门    
        public void openDoor()    
        {    
                System.out.println("开门~~~");    
        }    
}    
public class Demo04    
{    
        public static void main(String args[])    
        {    
                new D().openDoor();    
        }    
}

此处是有选择的在子类实现了所需要的方法。这种设计称为Adapter(适配器设计) 
4、模拟: 
  · 张三 很老实  --> 李四,借10000000元,不还 
  · 张三  --> 讨债公司  --> 李四  --> 还钱 
张三和讨债公司的目的 --> 还钱。
//主题:讨债    
interface Subject    
{    
        //完成具体的操作    
        public void giveMe();    
}    
//真正要讨债的人    
class RealSubject implements Subject    
{    
        public void giveMe()    
        {    
                System.out.println("还我滴Money");    
        }    
}    
//代理人    
class ProxySubject implements Subject    
{    
        private Subject sub = null;    
        public ProxySubject(Subject sub)    
        {    
                this.sub = sub;    
        }    
        public void before()    
        {    
                System.out.println("需要一些准备~~~");    
        }    
        public void after()    
        {    
                System.out.println("销毁一些证据~~~");    
        }    
        public void giveMe()    
        {    
                //也要实现讨债    
                this.before();    
                //代表真正的债主去讨债    
                this.sub.giveMe();    
                this.after();    
        }    
}    
public class Demo05    
{    
        public static void main(String args[])    
        {    
        Subject real = new RealSubject();    
        //委托代理人完成    
        Subject proxy = new ProxySubject(real);    
        proxy.giveMe();    
        }    
}
代理设计: 
· 主要在日志上比较多。 
· 一般开发中我们只关注真实主题,而所有的其他操作,比如说日志等操作用户并不需要知道,所以可以在代理中完成这些其他与具体业务逻辑无直接关系的操作。
接口和抽象类图的表示? 
总结 
面试中:请你详细的解释一下抽象类和接口的不同 
#############################################################
本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/129441,如需转载请自行联系原作者

[零基础学JAVA]Java SE面向对象部分-18.面向对象高级(06)相关推荐

  1. 零基础是学java还是python-零基础学编程java和python哪个好

    零基础学编程java和python哪个好 更新时间:2019年02月17日18时56分 来源:传智播客java培训 浏览次数: 如今人工智能行业的蓬勃发展让很多想要学习编程的人会犹豫Java和Pyth ...

  2. [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)

    MIS信息管理系统实战开发之使用MySQL实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有 ...

  3. [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[文件保存](1)

    MIS信息管理系统实战开发之单独使用文件实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有工 ...

  4. 零基础学怎么学Java_零基础学java难么?怎么自学?

    在计算机发展迅速的今天,越来越多的人去学习编程,其中Java就是大家热衷的语言之一.这时候就有人问,零基础学java难么?下面小编将回答这一问题并给出学习路线. 小编想说,这个实际上要看个人能力以及前 ...

  5. 零基础学Java有哪些必看书?推荐这5本

    零基础学Java初学者,想要入门,应该多看一些关于Java的书,先充实理论基础.然而Java的技术知识是海量的,市面上关于Java的书令人眼花缭乱,零基础的小白完全不知道该看哪本书.那么,零基础学Ja ...

  6. 零基础学Java的10个方法

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为北京尚学堂原创文章,未经允许不得转载.​ 零基础学Java只要方法得当,依然有机会学习好Java编程. 但作为 ...

  7. java开发技术有什么意义,零基础学Java开发技术有哪些优势和好处?

    零基础学Java开发技术有哪些优势和好处?Java开发技术有下列优势:Java编程语言简单.面向对象集中于对象及其接口.分布式处理TCP/IP协议.鲁棒性.安全性.体系结构中立性.可移植性.解释执行. ...

  8. 【零基础学Java】—继承的概述(十九)

    [零基础学Java]-]继承的概述(十九) 一.面向对象的三大特征 面向对象的三大特征:封装性,继承性,多态性 继承是多态的前提,如果没有继承,就没有多态 继承解决的主要问题就是:共性抽取 继承关系的 ...

  9. 零基础学python知乎-零基础应该选择学习 java、php、前端 还是 python?

    零基础先学习JAVA吧 在大家看之前,我要先声明两点. 1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学 ...

  10. 机械转行java自学经历,零基础学java,血泪总结的干货

    机械转行java自学经历,零基础学java,血泪总结的干货 1.我为什么转行 2.转行之路 3.面试之路 自学路上的网站 Java教程 实践项目一站式学习 bilibili 自学书籍 <Java ...

最新文章

  1. 有趣的0-1背包问题:分割等和子集
  2. python并发入门(part5 event对象)
  3. Hi3516A开发-- 板卡串口烧写
  4. [转]ROS2 源码解析与实践 - Node
  5. 嵌入式linux文件系统启动,嵌入式Linux之文件系统启动分析【原创】
  6. adobe stream的最后一行空行_玩转Java8Stream(五、并行Stream)
  7. 全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<UEL表达式篇>
  8. php商品秒杀时间代码,Thinkphp5+Redis实现商品秒杀代码实例讲解
  9. JSP中调用java类中的方法
  10. iOS进阶--提高XCode编译速度、Xcode卡顿解决方案
  11. img引用网络图片资源无法加载问题解决
  12. 目标检测数据集标注工具LabelImg从安装到使用详解
  13. C3D行为识别(一):UCF101视频数据集预处理
  14. Android之高仿墨迹天气桌面组件(AppWidgetProvider)
  15. 计算机网络考研408计算机134分笔记!超级详细!23最新考纲
  16. java语言有很多的优点和特点_Java语言具有许多优点和特点,下列选项中()反映了Java程序并行机制的特点 (5.0分)_学小易找答案...
  17. 我写了款依赖检查的插件
  18. matlab怎么使用 spm_vol,SPM12批量处理预处理数据
  19. 推荐一个在线办公协作的
  20. add p4 多个文件_P4_tutorials

热门文章

  1. 金融机构银行架构变迁
  2. 斯坦福Dan Boneh密码学——01 香农密码与完美安全
  3. java class 混淆_Java 混淆那些事(三):了解 ProGuard Keep 规则
  4. 代理服务器(Upstream-server)
  5. 用PHP实现反向代理服务器
  6. 在Kratos灵活的使用火山引擎ImageX的动态水印以及评测
  7. Acrobat pro 快捷键设置
  8. 【bzoj4992: [Usaco2017 Feb]Why Did the Cow Cross the Road】动规
  9. 多线程常见问题及分析
  10. E店宝互联网思维与电子商务