• 抽象类与接口的见解(精华篇)


    什么是抽象类:
    1、声明方法的存在而不去实现它的类被叫做抽象类。
    2、抽象类不能被实例化。
    3、抽象类中可以有非抽象方法。
    4、抽象类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。
    
    继承抽象类:子类必须实现抽象类的所有方法,子类不实现那么子类也必须是抽象类。
    继承普通类:共享父类的方法,经常要用到的一些方法写成一个公共类继承就能调用。
    
    使用抽象类好处:假设要编写一个计算矩形、三角形和圆的面积与周长的程序。
    可以看到三个类都要计算面积和周长,虽然公式不同但目标相同。
    因此可以定义一个抽象的父类,在抽象类里定义圆、三角形和矩形共同的数据成员及成员方法。
    把计算面积与周长的成员方法放在父类给予说明,再将具体的计算公式在子类中的实现。
    抽象类的作用在于将许多有关的类组织在一起,提供一个公共的类,即抽象类,而那些被它组织在一起的具体的类将作为它的子类由它派生出来。
    抽象类刻画了公有行为的特征,并通过继承机制传送给它的派生类。
    什么是接口: 
    1、接口是抽象类的变体。 
    2、接口中的所有方法都是抽象的,没有一个有程序体。 
    3、接口只可以定义static final成员变量。 
    4、多继承问题可以通过接口来实现。 
    
    一般类实现接口:必须为接口提供所有方法的实现(接口中的所有方法都是抽象方法) 
    抽象类实现接口:可以不实现接口的所有方法,可以由它的子类实现。
    

      

    使用接口的好处:
    1、简单,有利于庞大项目的行为规范,防止一些开发人员随意定义
    2、有利于后期的维护和扩展
    3、提高的代码的安全性,是实现软件松耦合的重要手段
    

      

    主要体现三方面: 
    1、通过接口可以实现不相关类的相同行为,而不需要了解对象所对应的类。 
    2、通过接口可以指明多个类需要实现的方法。 
    3、通过接口可以了解对象的交互界面,而不需了解对象所对应的类。
     
    实现多接口好处:如果两个接口有同样的行为即方法,那么用一个具体方法来实现就行了 
    

      

    1.两者语法层面上的区别
    1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
    2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
    3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
    4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
    
    2.设计层面上的区别
    1)抽象类是对一种事物的抽象,即对类抽象;而接口是对行为的抽象。
    抽象类是对整个类整体进行抽象,包括属性、行为,
    但是接口却是对类局部(行为)进行抽象。
    举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。
    设计时可以将飞机设计为一个抽象类Airplane,将鸟设计为一个抽象类Bird,但是不能将"飞行" 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。
    此时可以将"飞行"设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。
    
    2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
    什么是模板式设计?
    最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。
    而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。
    也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
    
    网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作
    abstract class Door {
      public abstract void open();
      public abstract void close();
    }
    或者:
    interface Door {
      public abstract void open();
      public abstract void close();
    }
    如果我们需要门具有报警alarm( )的功能,那么该如何实现?
    interface Alram {
      void alarm();
    }
    abstract class Door {
      void open();
      void close();
    }
    class AlarmDoor extends Door implements Alarm {
      void open() {
      //....
      }
      void close() {
      //....
      }
      void alarm() {
      //....
      }
    }
    
     
    
     
    

      

  • 相关阅读:
    Android控件之ListView探究二
    解决activity页面跳转时显示桌面
    TextView实现滚动显示的效果
    QPainter的坐标系系统的转换
    MODBUS_RTU通信协议
    收藏的博客 -- Qt有关的GitHub/Gitee开源项目
    VS联调多个解决方案的项目
    软件工具——GitGUI使用教程
    Python中对文件的操作
    VMware虚拟机三种网络模式详解 --------- NAT(地址转换模式)
  • 原文地址:https://www.cnblogs.com/zhaojinhui/p/4921302.html
Copyright © 2020-2023  润新知