zoukankan      html  css  js  c++  java
  • `Java`中`abstract class`与`interface`区别

    abstract class

    Java中允许使用abstract修饰符声明方法,此时只定义方法但是不实现方法(abstract修饰的方法没有主体,只有一个签名和一个分号).
    以下是abstract方法和这些方法所在的abstract类相关的规则:

    • 只要类中有一个abstract方法,那么这个类本身就自动成为abstract,而且必须声明为abstract class,否则会导致编译错误;
    • abstract class无法实例化;
    • abstract类的子类必须覆盖超类的每个abstract方法,并且把这些方法全部实现(即提供方法主体),才能实例化.这种类一般称为具体子类(concrete subclass),目的是强调它不是抽象类.
    • 如果abstract class的子类没有实现集成的所有abstract方法,那么这个子类仍然是abstract class,而且必须使用abstract声明;
    • 使用static,private以及final声明的方法不能是抽象方法,因为这三种方法在子类中不能被覆盖.类似的,final class中不能有任何abstract方法;
    • 就算类中没有abstract方法,这个类也能声明为abstract.使用这种方法声明的abstract类表明类实现的不完善,需要交给子类实现,这种类不能被实例化.

    interface

    Java的类继承是单继承模式,为了更进一步的面向对象扩展,Java创建了interface概念.
    interface的作用只是描绘API,因此,interface提供类型的描述信息,以及实现这个API的类应该提供的方法.

    以下是interface相关的规则:

    • interface中所有强制方法都隐式使用abstract声明,不能有方法主体,要使用分号(可以使用abstract修饰符,不过一般省略);
    • 接口定义公开的API.interface中的所有成员都隐式使用public声明,而且习惯省略不必要的public修饰符.如果在接口中使用protected或者private定义方法,会导致编译错误;
    • interface中不能定义任何势实例字段.字段是实现细节,而接口是规则不是事先,在接口中只能定义同时使用staticfinal声明的常量;
    • 接口不能实例化,因此不能定义构造函数;
    • 接口中可能包含嵌套类型.嵌套类型隐式使用publicstatic声明;
    • Java 8开始,interface中可以包含静态方法.

    区别总结

    abstract classinterface存在诸多联系,也存在差异.
    以下是个人总结的差异支出:

    • abstract classclass中存在未实现的方法,留待继承的子类实现,interface中的方法则均是未实现的方法(Java 8interface中的default方法除外);
    public interface List<E> extends Collection<E> {
        // `interface`中被`default`修饰的方法,提供默认实现
        default void sort(Comparator<? super E> c) {
            Object[] a = this.toArray();
            Arrays.sort(a, (Comparator) c);
            ListIterator<E> i = this.listIterator();
            for (Object e : a) {
                i.next();
                i.set((E) e);
            }
        }
    }
    
    • 子类只能extends单个abstract class,但是可以implements多个interface;
    • abstract class中能声明non final变量(诸如int test;),interface中仅能声明被static final修饰的变量;
    • abstract class中变量可以被private,public以及protected修饰,interface中变量仅能被public修饰;
    • intercae可以extends多个interface,而abstract class可以extends一个类(非限定于abstract class)以及多个interface.

    编码使用

    在日常的代码编写工作中,选用abstract class或者interface需要慎重.

    • abstract class表示继承关系,继承关系在本质上是"is a"关系;
    • interface则表示具有某种行为关系,是like a关系.

    带报警器的门为例,她具有门的作用,也具有报警功能.

    • 继承门(门为abstract class,子类实现开关函数);
    • 实现告警功能(实现告警interface,完成报警函数).

    PS:
    如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!
    程序员打怪之路

  • 相关阅读:
    ==和equals
    Fastjson toJSONString 碰到的一个问题
    Java之旅之第一个Java项目[Sping+ Spring MVC + MyBatis] 项目框架
    Java之旅之第一个Java项目[Sping+ Spring MVC + MyBatis] 项目配置
    Java之旅之第一个Java项目[Sping+ Spring MVC + MyBatis] org.springframework.web相关源码
    Java之旅之第一个Java项目[Sping+ Spring MVC + MyBatis] 项目背景
    centos6 yum源不可用问题解决
    ORACLE修改最大连接数
    Docker学习笔记(二):Docker镜像
    Mysql5.7慢日志时间与系统时间相差8小时问题的解决
  • 原文地址:https://www.cnblogs.com/jason1990/p/11606995.html
Copyright © 2011-2022 走看看