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 。
最新文章
- Url重写——伪静态实现
- ASP.NET MVC 模块与组件(一)——发送邮件
- Android开发者资源大汇总
- [转载] HTTP 协议漫谈
- 在唯一密钥属性“value”设置为“Default.aspx”时,无法添加类型为“add”的重复集合项
- Tomcat - JNDI 配置
- android中少用静态变量(android静态变量static生命周期)
- 学习Cassandra资料的一些整理
- Windows下Node.js开发环境搭建-合适的开发环境
- hdu 2034
- asp.net通过配置文件设置默认页
- List源码学习之LinkedList
- Web service request SetParameters to Report Server http://host/reportserver failed. Error: 请求因 HTTP 状态 401 失败: Unauthorized
- SOA 和 微服务
- MySQL基础、主从复制、优化
- RPM 包的构建 - SPEC 基础知识
- DJango 基础 (2)
- windows 控制台cmd乱码(及永久修改编码)的解决办法
- hive 测试
- InstallShield卸载不彻底,残留大量dll文件
热门文章
- activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
- 百度知道的代码复制粘贴到VB没有换行怎么办
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
- Mysql-SQL优化-统计某种类型的个数
- 改动MyEclipse行数的颜色
- c#控件重绘的问题
- 步长为float
- from import 引入 变量 函数
- android:模拟水波效果的自己定义View
- 关于Android热点模式下的UDP广播