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

    在分析2个方法之前先了解它们的语法定义和基础知识

    抽象类和接口不能相互继承。他们都不能实现方法


    接口:关键字: 声明接口interfate  实现接口implements。

     接口中继承只有接口继承接口。

    实现和接口之间只有字面意思,再无其他关系。

    1.   接口与类 ——接口是独立于"类"类型之外的,全新的数据类型,本质上完全不同
    2.   接口中声明属性,只允许public / static / final 公共静态常量 就算不写public  static  final三个关键字,也会自动认为是公共静态常量
    3.   接口中声明方法,只允许3种:public / static / default,不允许使用final修饰一个方法
    4.   接口允许多实现,一个类一个拥有多个接口 。
    5.   一个类可以实现多个接口(关键字implements),其中abstract修饰的方法实现类必须实现。
    6.   接口中的方法也有返回类型,
    7.   接口不允许有构造器
    8.   如果接口有父类,父类也必须是接口。
    9.   接口不是类所以不需要class修饰。
    public interface Animal {    //接口不是一个类所有不需要class修饰
    
        public static final boolean sex = true;    //    公开静态常量的属性
        
        void animal_1(){
            //    **报错 Abstract methods do not specify a body
            //    抽象方法未指定类型
        }
        
        static void me() {
            //    静态static的方法
        }
        
        public default void sleep() {
            //    默认访问修饰符的方法
            //    public default 也可以这样写,default只是说明默认访问修饰符的一个英文
        }
        
        abstract int animal();    //正确声明的抽象方法
            //    接口也有返回类型
    }

    抽象类:关键字abstract class

    一个抽象的类? 那么它和普通类有什么区别?  抽象类本身和普通类唯一的区别是不能被实例化

    1. 抽象类的意义就是让其他类继承(JAVA中继承只能单继承,可以多重继承),其中abstract修饰的方法子类必须实现。
    2. 抽象类中抽象方法的定义,决定了子类的本质。
    3. 抽象类可以有构造器,子类运行时直接调用执行。
    4. 如果一个类有一个方法被声明是抽象的,那么这个类必须是抽象类。
    5. 抽象类中可以没有抽象方法(只有普通方法)。
    6. 子类继承抽象方法,子类的重写权限必须是public。
    7. 抽象类可以继承接口,并且不实现接口中的abstract方法。

    两者之间的

    相同点:

    都是通过关系,让其他类实现其中的abstract方法。

    都有抽象方法,都不能被实例化, 他们的设计都是让下层去实现

    都支持动态绑定

    不同:

    接口中限制更严谨,属性只允许定义常量和静态,方法只允许出现静态,默认和抽象方法。而抽象类本身除了不能实例化以外它和普通的类没有区别,可以定义各种属性方法。

    接口不能有构造器,抽象类可以有

    抽象类使用要继承(extends),接口使用要实现(implements) 。 这里的区别就很大了继承只能单继承,实现确可以多实现

    前者只要他们都是同一个父类就可以进行统一操作,后者只要实现了同一个接口就可以进行统一操作。


    总结:

    如果设计的场景时无论怎么变他都会存在,那么就设计到抽象方法中。继承的特性 不管继承延续了多少次,他们都还是属于同一个父类的延续

    如果设计的场景是为了丰富需求,那么就设计成接口。

    举例:

    lol英雄技能 所有英雄都有4个技能——设计成抽象方法

    装备系统  所有英雄都有可以装备装备,但不代表他们都有——设计成接口


    场景联想:

      抽象类B实现了接口A,C继承了抽象类B,那么C要同时实现A和B的抽象方法

      C也能够调用到A接口,B抽象类里的所有方法和属性(private除外)


    可以扩展的知识点:

    继承:是站在子类立场( 子类变量= new 子类对象() )能继承父类的成员和方法.

    多态:是站在父类立场( 父类变量=new 子类对象() )调用父类方法时,如果该方法被子类覆盖,则忽略父类方法,直接调用子类方法.

    接口是否是Object的子类?

    是:反编译可以找到java/lang/Object

    不是:通过反射找不到

    可能java为了安全起见设计成这样

    问题
  • 相关阅读:
    形象理解ERP(转)
    禁用windows server 2008 域密码复杂性要求策略
    How to adding find,filter,remove filter on display method Form
    Windows Server 2008 R2激活工具
    How to using bat command running VS development SSRS report
    Creating Your First Mac AppGetting Started
    Creating Your First Mac AppAdding a Track Object 添加一个 Track 对象
    Creating Your First Mac AppImplementing Action Methods 实现动作方法
    Creating Your First Mac AppReviewing the Code 审查代码
    Creating Your First Mac AppConfiguring the window 设置窗口
  • 原文地址:https://www.cnblogs.com/liqking/p/11962286.html
Copyright © 2011-2022 走看看