PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > 定义一个接口和抽象类、对比接口与抽象类的区别与联系

定义一个接口和抽象类、对比接口与抽象类的区别与联系

lus菜
lus菜 原创
2021年02月09日 22:01:31 710浏览

接口:

  1. JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明;
  2. 一个类通过继承接口的方式,从而来继承接口的抽象方法,
  3. 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念;
  4. 类描述对象的属性和方法,接口则包含类要实现的方法;
  5. 成员方法只能是抽象方法,修饰符默认且必须是是(public abstract)类型,abstract关键字可以省略;
  6. 接口中的成员属性,必须是常量(不能有变量)
  7. 所有的权限必须是公有的(public);
  8. 可以使用extends继承自另一个接口,(接口和接口只有扩展新抽象方法,没有覆盖的关系);
  9. 可以使用一个类来实现接口中的全部方法,也可以使用一个抽象类,来实现接口中的部分方法;
  10. (类与接口,抽象类与接口 =>有实现接口中的抽象方法)
  11. 类(抽象类)实现接口使用关键字 implements, 多个接口中间逗号隔开

样式代码:

  1. <?php
  2. // 声明
  3. interface iCon
  4. {
  5. // 接口常量
  6. const APP_NAME = '天猫商城';
  7. // 公共抽象方法,没有实现过程
  8. public static function d1(...$args): string;
  9. // 构造方法
  10. public function __constract(...$args);
  11. }
  12. // 实现类
  13. class User_Con implements iCon
  14. {
  15. // 在实现类中必须将接口中声明的抽象方法全部实现了
  16. public static function d1(...$args): string
  17. {
  18. return print_r($args,true);
  19. }
  20. // 构造方法
  21. public function __constract(...$args)
  22. {
  23. return new static;
  24. }
  25. }
  26. $obj = new User_Con();
  27. echo User_Con::APP_NAME, '<hr>';
  28. // 尽可能直接用接口来访问类常量
  29. echo iCon::APP_NAME, '<hr>';
  30. // 实例可以调用 静态方法,但是不能调用静态属性
  31. echo $obj->d1(' 商品信息','商品价格','商品数量','原价','现价'),'<hr>';
  32. // 尽可能用类来调用静态方法
  33. echo User_Con::d1(' 商品信息','商品价格','商品数量','原价','现价'),'<hr>';

效果预览:

抽象类:

  1. 如果一个类中有一个方法是抽象方法,则这个类是抽象类,如果声明一个抽象类,必须使用 abstract 来修饰
  2. 只能单继承;成员变量可以是常量也可以是变量;
  3. 与普通类一样,有构造方法,但是不能实例化。构造方法的作用是子类继承抽象方法后进行父类数据的初始化;
  4. 成员方法既可以是抽象的,也可以是非抽象的;但所表述的意义不同:抽象方法是强制要求子类实现的,非抽象方法可以被子类继承,提供搞代码的复用性;

abstract关键字和哪些关键字有冲突

  1. private:私有则不能继承,那么就不能被重写
  2. final:定义为final则不能被继承和重写
  3. static:无意义,抽象方法无方法体

样式代码:

  1. <?php
  2. // 抽象类
  3. abstract class Conso
  4. {
  5. public function find()
  6. {
  7. // ...
  8. }
  9. public function init()
  10. {
  11. // ...
  12. }
  13. // 抽象方法
  14. abstract public function __construct();
  15. }
  16. // 抽象类必须通过它的子类才可以使用
  17. class UserConso extends Conso
  18. {
  19. // 抽象类的实现类(子类)必须将抽象类的抽象方法实现了
  20. public function __construct()
  21. {
  22. echo "我靠 放假了<hr>";
  23. }
  24. }
  25. // 抽象类必须通过它的子类才可以使用
  26. class Conso_Model extends Conso
  27. {
  28. // 抽象类的实现类(子类)必须将抽象类的抽象方法实现了
  29. public function __construct()
  30. {
  31. echo "哎呦 作业还没写<hr>";
  32. }
  33. }
  34. new UserConso();
  35. new Conso_Model();

效果预览:

接口与抽象类的区别与联系:

  1. 语法层面:
  2. 抽象类是一种抽象的类,可以有构造方法,可以包含静态方法;
  3. 接口是一种特殊的抽象类,不能有构造方法,不能包含静态方法;
  4. 抽象类中可以有普通成员变量,接口中没有普通成员变量(默认public static final );
  5. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的;
  6. 抽象类中的抽象方法的可以是publicprotected的,但接口中的抽象方法只能是public的;
  7. 抽象类中可以包含任意访问权限的静态成员变量,但接口中定义的变量只能是public static final类型;
  8. 一个类可以实现多个接口,但只能继承一个抽象类;
  9. 思想层面:
  10. 抽象类与子类为”is a”关系,它抽象出事物的共同本质特征,可单一继承;
  11. 接口与实现类为”like a”关系,它定义并规范了个性化的功能特征,可多重继承(实现);
  12. 抽象类和接口都不能被实例化,两种都是java实现抽象的方式;
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议