• interface与抽象类


    抽象类:

      定义:在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类

      抽象类不能被实例化。

      抽象类被继承之后,子类必须完全实现父类的全部抽象方法才能实例化。如果子类没有全部实现父类中的所有抽象方法,那么该子类也是一个抽象类,必须在 class 前面加上 abstract 关键字,并且不能被实例化。

    <?php
    abstract  class A{
        abstract function show();
    }
    class B extends A {
        public function index(){
            echo 111;
        }
    }
    

     B继承A,但是没有实例化其中的抽象方法show。所以结果会报错。

    其实在编辑器中就已经报错提示。

    同时,访问该文件时也会报错:

    Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::show)
    

      在B中实例化show方法:

    <?php
    abstract  class A{
        abstract protected function show();
    }
    class B extends A {
        public function show(){
            echo '实现抽象方法';
        }
        public function index(){
            echo 111;
        }
    }
    

      这样运行出来的结果就正常。

      注意:实例化抽象方法的访问权限不能超过父类定义方法的访问权限。

             即:A.show访问权限为public,则实例化的时候权限只能设置为:public。

                  A.show访问权限为protected,则实例化的时候权限可以设置为:public、protected。

                  A.show访问权限为:private  这种会直接报错,不能讲父类的抽象方法设置为私有。

          当将A.show访问权限设置为private:

    Abstract function A::show() cannot be declared private

    interface:

      接口是更高级的抽象类。

          interface 是完全抽象的,只能声明方法,而且只能声明 public 的方法,不能声明 private 及 protected 的方法,不能定义方法体,也不能声明实例变量 。

          任何实现接口的类都要实现接口中所定义的所有方法。

          使用 implements 关键字来实现某个接口。

      一个类可以同时继承一个父类和实现任意多个接口。 extends 子句应该在 implements 子句之前

      接口不能实现接口,但可以继承多个接口。

    <?php
    interface  A{
         function show();
    }
    class B implements A {
        public function index(){
            echo 111;
        }
    }
    

      如果不实现接口中的方法:就会出错

    Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::show)
    

     

    抽象类与interface的异同:

    1.共同点: 

       都是抽象类,不能实例化。

       子类必须实现已经定义的抽象方法。

    2.不同点:

     抽象类需要继承,用extends; interface需要实现,用implements。

     一个类至多继承一个抽象类;但可以实现多个interface。

     接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。

      接口中的抽象方法默认是 public 的,也只能是 public 的,不能用 private , protected 修饰符修饰。而抽象类中的抽象方法则可以用 public ,protected 来修饰,但不能用 private 。

     

  • 相关阅读:
    【Alpha】Scrum Meeting 10
    【Alpha】Scrum Meeting 9
    【Alpha】Scrum Meeting 8
    【Alpha】Scrum Meeting 7
    团队项目拆解
    【Alpha】Scrum Meeting 6
    【Alpha】Scrum Meeting 5
    servlet转发与重定向区别
    servlet中request和response
    Java Web之Servlet中response、request乱码问题解决
  • 原文地址:https://www.cnblogs.com/lingshao/p/5580266.html
Copyright © 2020-2023  润新知