一、抽象类概念和作用

抽象类

                Java中可以定义没有方法体的方法,该方法由子类来具体实现。

                该没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象类

 抽象方法的特点

                a、只有方法头没有方法体的方法称为抽象方法

                b、抽象方法用abstract来修饰

                c、抽象方法代表一种不确定的操作或方法

                d、抽象方法不能被调用 

  Java中可以定义没有方法体的方法,该方法有子类来具体实现:

        我们以前定义的方法里面都会有相应的实现,至少写个System.out来实现,但是Java中可以定义没有方法体的方法,该方法由继承它的子类来具体实现

  该没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象类:

只有访问的权限,返回值,函数名,以及参数,大括号里面的东西没掉了,甚至都没有大括号,我们把他称为抽象方法

抽象类对比我们普通的类,他有一个抽象方法,抽象方法是没有方法体的方法

新建一个工程

我们做一个类           Demo1

Demo1 里面有一个方法叫做抽象方法

所谓的抽象方法不就是public void printInfo();     只有类似于C语言里面的声明,并没有它的实现体

是不是很像c语言里面对头函数的声明呀

只是这样写的话他会   This method requires a body instead of a semicolon

这个方法需要定义一个方法体

如果你不定义一个方法体的话,如何解决这个错误呢?

添加一个abstract

第3行  添加以后又说了什么呢?

The abstract method printInfo in type Demo1 can only be defined by an abstract class

抽象方法只能放在抽象类里面

所以在类前面也需要加上一个abstract的说明

抽象方法代表一种不确定的操作或方法

printInfo没有方法体,代表它的实现我们不知道

抽象方法不能被调用 

除了抽象方法不能被调用,抽象类也不能实例化

抽象类的特点

        定义中含有抽象方法的类叫做抽象类

        抽象类用abstract来修饰

        抽象类代表一种抽象的对象类型

        抽象类不能实例化

        抽象类中可以有具体方法,可以没有抽象方法

       

                //A是一个抽象类

                      public  abstract class A{

                              public  void methodA(){

                           }

                                public abstract void method   B();

                        }

包含有抽象方法的类一定是抽象类,但是抽象类不一定有抽象方法,你可以做一个类,里面带abstract 的属性,但是里面没有抽象方法,但是这个就没什么意义了

        抽象类不能实例化

你new 它的时候让你实现它的方法体                public void printInfo() {
                                                                        // TODO Auto-generated method stub
                
                                                                            }

如果我把实现去掉,加个分号

Cannot instantiate the type Demo1

不能实例化这个Demo1

那抽象类不能被实例化,那么抽象类如何使用呢?

第一种方法:实例化的时候,同时要把函数做好

我们可以加上一个System.out.println("demo1 print");

但是我们运行完发现什么都没有

实例化抽象类的时候呢     第12行

对里面的抽象方法的函数体进行补充        第14行到第16行

补充完你可以d.printInfo();调用        第20行

运行结果

也就是说抽象类是不能被实例化的,你看到的这种方法感觉是实例化,其实是不是的

(匿名的内部类)

这是一种不怎么靠谱的方式,那抽象类不能实例化,我们如何使用它呢?

一般我们做一个类来继承抽象类

The type Demo2 must implement the inherited abstract method Demo1.printInfo()

这个Demo2 必须去实现Demo里面的printInfo这个接口

然后我们点击这个提示

双击这个提示

继承过来的时候,把里面的东西实现了

抽象类是不能被实例化的,我们唯一的用法就是继承他并且实现里面的抽象方法

我的Demo1不能被实例化,我的Demo 2可以实例化

运行结果

 模板方法模式

        ·定义

                一个模板方法用一些抽象的操作定义一个算法,而子类将重定义这些操作方法以提供具体行为

        ·意图

                定义了一个操作中的一个算法框架,把一些步骤推迟到子类去实现

                模板方式让子类不需要改变算法结构

// 模板方法

        public void work(){

  //1、授课前准备

        prepared();

        //2、进行授课

        teaching();

        //3、授课结束

        end();

}

新建一个工程

比如我们做智能家居

智能家居有个控制的类class Con

控制的类里面有个函数public void work()

那我们控制的步骤,        初始化串口initUart();

获取一个指令getcomand();

打开窗帘opencurse();

打开灯openlight();

打开电视openTV();

在con里面的work可以调用这么多的方法

这么多的方法,我统一给他做成抽象方法

带有抽象方法的类,一定是个抽象类

现在这个控制函数我还不能用它,怎么办呢?

比如说我现在用c51来完成这个控制,我这个代码既能运行在c51上面,也能运行在STC15w上面

那么我有一个类,c51Con继承于这个控制Con

当我继承它的时候,肯定需要实现它里面所有的抽象方法

按一下这个,就可以自动填充

变成这样

我的控制在这里就是一个抽象的类

至于怎么控制,里面的控制的方法,我们没有实现它,但是work他是一系列的流程

你要控制肯定初始化串口initUart();,

然后获取指令getcomad();

然后去做一些基本的操作opencurse();
                                                                openlight();
                                                                openTV();

这就是c51控制的

那么C51可以控制,那我的STC15w也能控制

我现在有个模板方法,有一系列的控制流程,可以用C51控制,也可以用STC15w控制

可以用C51实现智能家居,也可以用STC15w实现智能家居

现在可以确认我有两套方案控制家里的智能家居

那我现在用C51来做,我直接调用C里面的work();就完事了

因为这个work怎么控制,里面的代码是没有实现的

那我C51把他继承过来的时候,把里面的每一个硬件相关的操作都 给他弄个出来了,当然我们这边只是通过打印来调试

我把work的整体算法也给继承过来了

运行结果

Con没有发现

我们直接写Con在这面命名上是有问题的

把他改成Con1就可以啦

运行结果

当然STC15w也能用

我的控制类在这里,控制类里面有工作流程(当然初始化串口这个函数每个硬件实现是不一样的)

我只是做个模板放在这边,这就叫模板方法模式

C51去继承他,STC15w继承他,去实现里面的抽象方法

也就是说我这套代码即支持运行在C51上面,也支持运行在STC15w上面,也可以通用

要用C51的话,需要实例化C51,C51Con c = new C51Con();

然后调用C51里面的work();代码

(这只是个类比 ,其实我们Java在单片机上是跑不了的)

加上STC15的

运行结果

二、Java接口及使用

接口语法

        interface接口名{

                //公有静态常量、抽象方法

}

接口的特点

        接口中只能存放静态常量和抽象方法

        Java接口是对功能的拓展

        通过实现接口,Java类可以实现多实现

        一个类可以同时继承(extends)一个父类并且实现(implements)多个接口

        接口与接口之间可以使用extends实现继承

接口中只能存放静态常量和抽象方法:

因为接口也是不能够被实例化的,其实接口也不能被继承,所以这面放普通变量的话,是要放常量

在接口里面放常量其实用的不太多,其实接口里面一般我们都放一些抽象的方法

接口与抽象类的区别

        抽象类和具体实现之间是一个继承关系,也就是如果采用抽象类的方式,则父类和子类在概念上应该是相同的is -a

        接口的实现类在概念上不要求相同,接口只是抽取相互之间没有关系的类的共同特征,而不去关注类之间的关系,它可以使没有层次关系的类具有相同的行为

        抽象类是对一组具有相同属性和行为的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和行为的逻辑上不相关的事物的一种抽象

接口的实现类在概念上不要求相同,接口只是抽取相互之间没有关系的类的共同特征,而不去关注类之间的关系,它可以使没有层次关系的类具有相同的行为:

比如说人可以分为男人和女人,狗可以分为公狗和母狗,男人和公狗不好提取特征

但是人和狗还有共同特征,都会吃喝拉撒

那接口就有点不强调亲属的继承关系,只强调行为

抽象类是对一组具有相同属性和行为的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和行为的逻辑上不相关的事物的一种抽象

人跟狗就是逻辑上不相关事物的一种抽象

新建一个工程

接口的语法长什么样呢?interface xingWei

男人和公狗之间有一种行为很像,都能吃都能喝

所以说可以用男的来使用这个接口,那我怎么样才能和接口产生行为呢?怎么样才能实现接口

implements来实现接口

上面讲的C51Con 和STC15wCon都是继承于Con类,去实现里面的方法

我们现在讲的人跟狗在特征上没有什么特别大的联系,可能都具有一些行为,接口的意思是把相应的行为给他提取出来,去实现里面的行为,并没有继承的概念,

继承是带有亲属关系的,比如物理老师is - a teacher   音乐老师is -a teacher

男人有这个行为class man implements xingWei

公狗有这个行为class dogman implements xingWei

继承和接口是两码事

继承是is -a 的关系,接口不是is -a 的关系

运行结果

注意:

接口他要用interface这样的格式                interface xingWei
                                                {
                                                                    abstract void eat();
                                                                    abstract void drink();
                                                }

类要去实现接口的话呢要用implements字段,关键字来实现接口里面的方法

class man implements xingWei
                                                                    {

public void eat() {
                                                                                // TODO Auto-generated method stub
                                                                                        System.out.println("男人吃");
                                                                                   }
                                                                                            public void drink() {
                                                                                        // TODO Auto-generated method stub
                                                                                System.out.println("男人喝");
                                                                                    }    
                                                                }

接口强调的行为

接口强调的行为

接口强调的行为

Java:抽象方法和抽象类,抽象类应用模板方法模式,接口及使用相关推荐

  1. Java设计模式之行为型:模板方法模式

    一.什么是模板方法模式: 模板方法是基于继承实现的,在抽象父类中声明一个模板方法,并在模板方法中定义算法的执行步骤(即算法骨架).在模板方法模式中,可以将子类共性的部分放在父类中实现,而特性的部分延迟 ...

  2. app+java代码模板_软件设计模式之模板方法模式(JAVA)

    什么是模板方法模式? 定义一个操作中算法的骨架,而将这些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 好抽象的概念啊,文绉绉的东西就是不讨人喜欢,下面我 ...

  3. java抽象方法声明_java抽象类和抽象方法

    一.什么是抽象类和抽象方法 没有具体功能的实现,通过子类继承后重写方法来实现一定约束的类称之为抽象类,抽象类必须被abstract修饰.抽象方法就是只有方法声明,没有方法体的方法.抽象类的使用一般通过 ...

  4. java抽象方法实例_Java 抽象类和抽象方法实例

    Linux参考文章 定义 Shape 类表示一般二维图形.Shape 具有抽象方法 area 和 perimeter,分别计算形状的面积和周长.试定义一些二维形状类(如矩形.三角形.圆形等),这些均为 ...

  5. JAVA基础13-Java抽象方法、抽象类、抽象之模板方法模式

    文章目录 Java抽象方法和抽象类 抽象之模板方法模式 Java抽象方法和抽象类 抽象类: Java中可以定义没有方法体的方法,该方法由子类来具体实现.这个没有方法体的方法我们称之为抽象方法,含有抽象 ...

  6. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  7. Java设计模式之行为型:解释器模式

    一.什么是解释器模式:         解释器模式,就是定义语言的文法,并建立一个解释器来解释该语言中的句子,通过构建解释器,解决某一频繁发生的特定类型问题实例. 这里我们将语言理解成使用规定格式和语 ...

  8. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  9. Java设计模式之结构型:桥接模式

    一.什么是桥接模式: 桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯,桥接模式的作用就是为被分离的抽象部分和实现部分搭桥.在现实生活中一个物品在搭配不同的配件时会产生不同的动作和结果, ...

  10. Java设计模式之行为型:访问者模式

    背景: 去医院看病时,医生会给你一个处方单要你去拿药,拿药我们可以分为两步走: (1)去柜台交钱,划价人员会根据处方单上的药进行划价,交钱. (2)去药房拿药,药房工作者同样根据处方单给你相对应的药. ...

最新文章

  1. Django celery6.4
  2. Java设计模式10:观察者模式
  3. 超详细C语言的字符串函数讲解
  4. easyui tree:根据属性格式化树节点名称
  5. 10.热空气扭曲效果
  6. java正则表达式及api_Java API 之 正则表达式
  7. RTX5 | 消息队列06 - (实战技巧)FDCAN接收中断ISR同步线程
  8. Dart基础第9篇:对象、类
  9. OpenCV图像处理基础操作(2)
  10. 【EI会议推荐】机电一体化、自动化与智能控制领域
  11. lintcode-微软笔试
  12. python-Selenium
  13. 钟汉良日记:做短视频和直播的基础能力
  14. Springboot+MySQL实现多数据源的信息导入
  15. 【mybatis】mybatis的工作原理
  16. 看《我的工科女友》感受
  17. 刷脸支付帮助线下实体经济突破营销困境
  18. Python分析盘点2019全球流行音乐:是哪些歌曲榜单占领了我们?
  19. 【JS面试题】面试官问我:遍历一个数组用 for 和 forEach 哪个更快?
  20. 程序员犯的错误都这么屌吗?

热门文章

  1. C语言常用宏定义(#define)使用方法
  2. 【树莓派】不只是一封感谢信!漂移菌手把手指导:小空间树莓派镜像系统备份方法...
  3. 基于AES加解密的图像加解密算法
  4. 交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
  5. 2018/12/07 L1-033 出生年 Java
  6. 第一课-并行编程的几个概念
  7. 记一次内存溢出的分析经历——使用thrift
  8. scalikejdbc 学习笔记(2)
  9. 二维树状数组 BZOJ 1452 [JSOI2009]Count
  10. Keepalived的相关应用,使用keepalived实现nginx和lvs的高可用负载均衡器