抽象类:

定义:在 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 。

最新文章

  1. Url重写——伪静态实现
  2. ASP.NET MVC 模块与组件(一)——发送邮件
  3. Android开发者资源大汇总
  4. [转载] HTTP 协议漫谈
  5. 在唯一密钥属性“value”设置为“Default.aspx”时,无法添加类型为“add”的重复集合项
  6. Tomcat - JNDI 配置
  7. android中少用静态变量(android静态变量static生命周期)
  8. 学习Cassandra资料的一些整理
  9. Windows下Node.js开发环境搭建-合适的开发环境
  10. hdu 2034
  11. asp.net通过配置文件设置默认页
  12. List源码学习之LinkedList
  13. Web service request SetParameters to Report Server http://host/reportserver failed. Error: 请求因 HTTP 状态 401 失败: Unauthorized
  14. SOA 和 微服务
  15. MySQL基础、主从复制、优化
  16. RPM 包的构建 - SPEC 基础知识
  17. DJango 基础 (2)
  18. windows 控制台cmd乱码(及永久修改编码)的解决办法
  19. hive 测试
  20. InstallShield卸载不彻底,残留大量dll文件

热门文章

  1. activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
  2. 百度知道的代码复制粘贴到VB没有换行怎么办
  3. IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
  4. Mysql-SQL优化-统计某种类型的个数
  5. 改动MyEclipse行数的颜色
  6. c#控件重绘的问题
  7. 步长为float
  8. from import 引入 变量 函数
  9. android:模拟水波效果的自己定义View
  10. 关于Android热点模式下的UDP广播