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

一、抽象类概念和作用

       

抽象类

                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("男人喝");
                                                                                    }    
                                                                }

接口强调的行为

接口强调的行为

接口强调的行为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值