zoukankan      html  css  js  c++  java
  • 抽象类与接口

    经常搞不清抽象类和接口之间的关系,所以决定记下来

    抽象类

      《Thinking in Java》一书中对抽象类的定义为:

    包含了抽象方法的一个类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成
    abstract(抽象)。否则,编译器会向我们报告一条出错消息。

      其实用关键字abstract修饰的类即是抽象类,即使该类中没有用abstract修饰的抽象方法。

    抽象方法

      抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

    abstract void method_name()

      抽象方法必须用 abstract 修饰,含有抽象方法的类就是抽象类,必须在类前用 abstract 修饰。
    由于抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

      由此可以看出抽象类就是为了被继承而存在的,抽象类中包含了子类的共通特性。如果定义了一个抽象类却不去继承它,相当于白白创建了这个抽象类。
      同时,抽象类也跟普通类一样,可以拥有成员变量和普通的成员方法。

    抽象类和普通类的区别  

    1. 抽象方法必须为public或者protected,缺省情况下默认为public。如果用private修饰,则该方法不能被子类继承,子类便无法实现该方法。
    2. 抽象类不能实例化,即不能创建对象。
    3. 如果一个类继承了一个抽象类,则该类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。

    接口

      接口,英文称作interface。在软件工程中,接口泛指供别人调用的方法或者函数,是对行为的抽象。在Java中,定一个接口的形式如下:

    [public] interface InterfaceName {
    }

      接口中可以包含基本数据类型的数据成员和方法,需要注意的是接口中的数据成员都默认为static和final,接口中方法只能是public abstract修饰的抽象方法。
      接口中的所有方法都不能有具体实现。实现接口的类必须实现接口中所有的抽象方法,一个类可以实现多个接口,通过关键字implements

    class className implements interface1,interface2,[...]{
    }

      如果抽象类实现了一个接口,该抽象类可以不实现接口中的抽象方法。

    抽象类与接口的区别

    参数 抽象类 接口
    默认的方法实现 可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
    实现 子类通过extents关键字继承抽象类。如果子类不是抽象类,需要实现父类中所有声明的方法的实现 子类通过关键字implements实现接口,需要提供接口中所有生命方法的实现
    构造器 可以有构造器 不能有构造器
    与普通类的区别 除了不能实例化,其他的跟普通类没有任何区别 接口是完全不同的类型
    访问修饰符 抽象类方法可以用public、protected和default修饰 接口方法只能用public修饰,成员属性只能定义为 public static final
    main方法 抽象类可以有main方法且可以运行 接口没有main方法,不能运行
    多继承 抽象方法可以继承一个类或者实现多个接口 只能继承一个或多个接口
    速度 速度比接口要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
    添加新方法 如果在抽象类中添加新方法,可以给该方法提供默认的实现,不需要改变现在的代码 在接口中添加新方法后必须改变实现该接口的类




    什么时候使用抽象类和接口 

    1. 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
    2. 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
    3. 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

    参考资料:

      http://www.importnew.com/18780.html
      http://www.importnew.com/12399.html
      《Java编程思想》

    作者: 暮颜 —— 衣带渐宽终不悔
    出处:https://www.cnblogs.com/vocaloid-fan1995/
    版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    转载请注明原文链接:https://www.cnblogs.com/vocaloid-fan1995/p/10363831.html
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议知识共享许可协议进行许可。

  • 相关阅读:
    .NET CORE 3.1.5 跨域设置
    NET CORE WebAPI 搭建--基础搭建
    EF 表中中多次指定了列名解决办法
    .Net Core 3.1.2 区域路由配置【原创】
    浅谈DevOps
    阿里云服务器SQLSERVER 2019 远程服务器环境搭建【原创】【转载请注明出处】
    c# vs2019 Window服务搭建
    云服务器和域名的使用简历
    WAI-ARIA无障碍网页资料
    kendoUI toolbar kendoComboBox 使用
  • 原文地址:https://www.cnblogs.com/vocaloid-fan1995/p/10363831.html
Copyright © 2011-2022 走看看