zoukankan      html  css  js  c++  java
  • 第10章 接口、继承与多态----抽象类和接口

    一、抽象类

      在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。回想继承和多态原理,继承树中越是在上方的类越抽象,如:鸽子类继承鸟类、鸟类继承动物类等。在多态机制中,并不需要将父类初始化对象,我们需要的只是子类对象,所以在Java语言中设置抽象类不可以实例化对象,因为图形类不能抽象出任何一种具体图像,但它的子类却可以。

      抽象类的语法如下:使用abstract关键字定义的类称为抽象类,而使用这个关键字定义的方法称为抽象方法,抽象方法没有方法体,这个方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承之外没有任何意义。

      只要类中有一个抽象方法,此类就被标记为抽象类

    public abstract class Test{
        abstract void testAbstract(); //定义抽象方法
    }

      

      从图中可以看出,继承抽象类的所有子类需要将抽象类中的抽象方法进行覆盖。

      这样在多态机制中,就可以将父类定义为抽象类,将draw()方法设置为抽象方法,然后每个子类都重写这个方法来处理。

      但这会导致程序中会有太多冗余的代码,同时这样的父类局限性很大,也许某个不需要draw()方法的子类也不得不重写draw()方法。

      如果将draw方法放置在另外一个类(下面介绍的接口)中,这样让那些需要draw()方法的类继承该类,而不需要draw()方法的类继承图形类,但所有的子类都需要图形类,因为这些类是从图形类中被导出的,同时某些类还需要draw()方法,但是在Java中规定,类不能继承多个父类,面临这种问题,接口的概念便出现了。

    二、接口

      接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中所有方法都没有方法体。上面遇到的问题,可以将draw()方法封装到一个接口中,使需要draw()方法的类实现这个接口,同时也继承图形类,这就是接口存在的必要性。

      

      接口使用interface关键字进行定义,其语法如下:

    public interface drawTest{
        void draw();//接口内的方法,省略abstract关键字
    }
    备注:在接口中定义方法必须被定义public或abstract形式,其他修饰权限不被Java编译器认可,即使不讲该方法声明为public形式,它也是public
       在接口中定义的任何字段都自动是static和final的

      一个类实现一个接口可以使用implements关键字,代码如下:

    public class Parallelogram extends Quadrangle implements drawTest{    
        ...//
    }

     

    interface drawTest{//定义接口
        public void draw();//定义方法
    }
    //定义平行四边形类,该类继承了四边形类,并实现了drawTest接口
    class ParallelogramgleUseInterface extends QuadrangleUseInterface
        implements drawTest{
        public void draw(){//由于该类实现了接口,所以需要覆盖draw()方法
            System.out.println("平行四边形.draw()");
        }
        void doAnything(){//覆盖父类方法
        }
    }
    class SquareUseInterface extends QuadrangleUseInterface 
        implements drawTest{
        public void draw(){
            System.out.println("正方形.draw()");
        }
        void doAnything(){        
        }
    }
    class AnythingUseInterface extends QuadrangleUseInterface{
        void doAnything(){        
        }
    }
    public class QuadrangleUseInterface {//定义四边形类
        void doAnything(){        
        }
        public static void main(String[] args){
            drawTest[] d={ //接口也可以进行向上转型操作
                    new SquareUseInterface(), new ParallelogramgleUseInterface()
            };
            for(int i=0;i<d.length;i++){
                d[i].draw();//调用draw()方法
            }
        }
    }

      运行结果如图:

      分析:在本实例中,平行四边形类与正方形类分别实现了drawTest接口并继承了四边形类,所以需要覆盖接口中的方法。在调用draw()方法时,首先将平行四边形类对象与正方形类对象向上转型为drawTest接口形式

      在Java中无论是将一个类向上转型为父类对象,还是向上转型为抽象父类对象,或者向上转型为该类接口,都是没问题的。

      然后使用d[i]数组中的每一个对象调用draw(),由于向上转型,所以d[i]数组中的每一个对象分别代表正方形类对象与平行四边形类对象,最后结果分别调用正方形类与平行四边形类中覆盖的draw()方法。

    三、接口与继承

      在Java中不允许多重继承,但使用接口就可以实现多重继承,因为一个类可以同时实现多个接口,这样可以将所有需要继承的接口放置在implements关键字后并使用逗号隔开,但这可能会在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有方法。多重继承的语法如下:

      class 类名 implements 接口1,接口2,...,接口n

      注释:一个接口可以继承另一个接口   

    interface inf1{
    }
    interface inf2 extends inf1{
    }

     

  • 相关阅读:
    小程序官方请求封装
    小程序天/小时/分秒倒计时封装
    小程序不定数量左右滑动中间放大轮播图效果
    小程序换行符检测换行
    小程序点击图片重新排序写法
    基于webuploader.js的单图片上传封装
    VMware Fusion 11 序列号
    Ionic 4 beta + Capacitor beta 尝鲜
    C语言学习笔记之动态分配数组空间
    C语言学习笔记之获取文件长度
  • 原文地址:https://www.cnblogs.com/chamie/p/4548608.html
Copyright © 2011-2022 走看看