• 接口与抽象类对比


    在分析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为了安全起见设计成这样

    问题
  • 相关阅读:
    ubuntu下php-fpm多实例运行配置
    ubuntu下nginx+PHP-FPM安装配置
    php中include_path配置
    laravel中的队列
    laravel权限控制Gate
    Configuring an NVIDIA Jetson TX2
    NVIDIA Jetson TX2 の設定
    3-Jetson Nano Developer KitでAWS IoT GreengrassのML Inferenceを試す(GPU編)
    2-Jetson Nano Developer KitでAWS IoT GreengrassのML Inferenceを試す
    1-Jetson Nano Developer KitでAWS IoT Greengrassを動かしてみる
  • 原文地址:https://www.cnblogs.com/liqking/p/11962286.html
Copyright © 2020-2023  润新知