文章目录

  • I . 接口总结
  • II . 接口声明
  • III . 接口实现
  • IV . 接口中的方法
  • V . 接口中的属性 ( 变量 / 常量 )
  • VI . 接口中的属性属性覆盖 ( 变量 / 常量 )
  • VII . 接口覆盖冲突问题
  • VIII . 接口继承接口

I . 接口总结


接口总结 :

① 声明与实现 : 使用 interface 关键字声明接口 , 实现时需要重写所有的抽象成员 ( 属性 / 方法 ) ;

② 接口成员 : 接口中的 正常成员属性和成员方法默认使用 open 关键字修饰 , 接口中的抽象成员属性和抽象成员方法默认使用 abstract open 关键字修饰 ;

③ 接口属性及覆盖 : 变量属性声明成抽象属性 , 常量属性可以声明成抽象属性 , 也可以添加访问器 ;

④ 接口覆盖冲突问题 : 实现类实现多个接口 , 使用 super<接口名称> 调用不同接口的正常方法 ;

II . 接口声明


1 . 接口声明 : 接口使用 interface 接口名称 格式定义 ;

① 接口默认 open 修饰 : 接口 , 默认使用 open 关键字修饰 , 可以直接继承 ;

② 接口方法默认 open 修饰 : 接口中的方法 , 默认使用 open 关键字修饰 , 可以直接 override 重写 ; 抽象方法可以省略 abstract 关键字修饰 ;

② 接口属性默认 open 修饰 : 接口中的属性 , 默认使用 open 关键字修饰 , 可以直接 override 重写 ; 抽象属性可以省略 abstract 关键字修饰 ;

//定义接口
interface Intf{}

III . 接口实现


接口实现 :

① 没有构造函数委托 : 实现接口时不用调用其构造函数 , 因此在子类声明时 , 接口名称后没有括号 ;

② 必须重写抽象方法与抽象属性 : 接口中的没有初始化的属性是抽象属性 , 没有方法体的方法是抽象方法 , 其省略了 abstract 和 open 关键字 ;

//接口定义
interface Intf{//抽象属性var age : Int//抽象方法fun action_abstract()}//接口实现 , 注意没有构造函数委托
class Impl : Intf {//重写抽象属性override var age: Int = 18//重写抽象方法override fun action_abstract() {println("Impl : action_abstract")}
}

IV . 接口中的方法


1 . 接口中的方法 : 接口中的方法默认使用 open 修饰 , 可以直接在实现类中重写覆盖 ;

① 抽象方法 : 接口中可以定义抽象方法 , 接口中没有方法体的抽象方法可以省略 abstract 关键字 , 所有方法默认使用 open 修饰 ;

② 正常方法 : 也可以定义普通的方法 , 普通方法默认使用 open 修饰 ;

③ 与 Java 对比 : 这一点与 Java 不同 , Java 中接口必须都是抽象方法 ;

interface Intf{//接口中的方法默认使用 abstract 修饰fun action_abstract()//接口中可以定义正常方法fun action_real(){println("action_real")}
}

2 . 接口中方法重写 : 重写的方法必须使用 override 关键字修饰 ;

//接口定义
interface Intf{//接口中的方法默认使用 abstract open 修饰fun action_abstract()//接口中可以定义正常方法 , 默认使用 open 修饰fun action_real(){println("Intf : action_real")}
}//接口实现类
abstract class Impl : Intf {//实现类中实现接口的抽象方法override fun action_abstract() {println("Impl : action_abstract")}//实现类中重写接口中的正常方法override fun action_real() {super.action_real()println("Impl : action_real")}
}

V . 接口中的属性 ( 变量 / 常量 )


1 . 接口属性 : 接口无法实例化 , 无法保存状态 , 接口中的属性不能初始化 , 此时有两种选择 : ① 将该属性定义成抽象的 ( 变量常量都可 ) , ② 提供 get 方法 ( 只有常量才可以 ) ;

① 抽象属性 ( 变量 / 常量 ) : 被 abstract 修饰的 常量 var 或 变量 val 属性 , 没有初始化值 , 没有 getter 和 setter 方法 ;

interface Intf{//抽象属性 常量 , 默认被 abstract open 修饰 ( 可省略 )abstract open val age : Int//抽象属性 变量 , 默认被 abstract open 修饰 ( 可省略 )abstract open var name : String
}

② 省略的修饰符 ( 变量 / 常量 ) : 接口中的属性和方法默认自带 open 修饰符 , 接口中的抽象属性 和 抽象方法 可以省略 abstract , 因此这里可以省略 open 和 abstract 关键字 , 加上也不会出错 ;

( 下面的抽象属性与 ① 中的抽象属性是等价的 )

interface Intf{//抽象属性 常量 , 默认被 abstract open 修饰 ( 可省略 )val age : Int//抽象属性 变量 , 默认被 abstract open 修饰 ( 可省略 )var name : String
}

③ 提供访问器 ( 常量 ) : 可以给属性提供一个访问器 , 但是明显接口无法实例化 , 该访问器调用不了 ;

( 常量可以提供一个访问器 , 变量只能定义成抽象属性 )

interface Intf{//抽象属性 常量 , 常量可以提供一个访问器val age : Intget() = 18//抽象属性 变量 , 变量只能声明成抽象属性 , 不能添加访问器var name : String
}

VI . 接口中的属性属性覆盖 ( 变量 / 常量 )


接口中的属性覆盖 :

① 抽象属性 : 接口中的 变量 / 常量 属性可以声明成抽象的 ;

② 关于访问器 : 只有常量才能使用添加访问器替代抽象属性方案 , 变量不能添加访问器 ;

③ 常量与变量 : 覆盖属性 , 可以使用变量覆盖常量 , 反过来不行 , 变量只能使用变量覆盖 ;

//1 . 接口定义
interface Intf{//抽象属性 常量 , 默认被 abstract open 修饰 ( 可省略 )//常量可以提供一个访问器 , 变量只能声明成抽象属性 , 不能添加访问器val age : Int//抽象属性 变量 , 默认被 abstract open 修饰 ( 可省略 )//常量可以提供一个访问器 , 变量只能声明成抽象属性 , 不能添加访问器var name : String
}//2 . 接口实现类
abstract class Impl : Intf {//覆盖属性 , 可以使用变量覆盖常量 , 反过来不行override var age: Int = 18//覆盖属性 , 变量只能使用变量覆盖override var name: String = "Tom"
}

VII . 接口覆盖冲突问题


1 . 接口覆盖冲突问题描述 : 一个类可以实现多个接口 , 如果多个接口中出现相同函数签名的函数 ( 正常带方法体的函数 ) , 如何调用不同接口的相同签名函数 ; ( 注意 : 这里调用的方法是有方法体的正常方法 )

2 . 覆盖冲突解决方案 : 可以通过 super<接口名> 调用不同接口的正常方法 ;

3 . 代码示例 : Intf1 和 Intf2 接口中都定义了非抽象函数 action_real , Impl 类实现了两个接口 , 通过使用 super.action_real() 调用 Intf1 中的 action_real 方法 , 通过使用 super.action_real() 调用 Intf2 中的 action_real 方法

//接口 1 定义
interface Intf1{fun action_abstract()fun action_real(){println("Intf1 : action_real")}
}//接口 2 定义
interface Intf2{fun action_abstract()fun action_real(){println("Intf2 : action_real")}
}//实现两个接口
class Impl : Intf1 , Intf2 {override fun action_abstract() {println("Impl : action_abstract")}override fun action_real() {//调用 Intf1 接口中的 action_real 方法super<Intf1>.action_real()//调用 Intf2 接口中的 action_real 方法super<Intf2>.action_real()}
}

VIII . 接口继承接口


接口继承接口 :

① 派生接口继承 : 一个接口可以继承另一个接口 , 派生接口拥有基类接口的成员 ;

② 派生接口新成员 : 派生接口声明新的接口成员和属性 ;

③ 子类实现派生接口 : 需要实现两个接口的所有的抽象成员 ( 属性 / 方法 ) ;

//接口定义
interface Intf1{//抽象属性var age : Int//抽象方法fun action_abstract()
}//接口定义
interface Intf2 : Intf1{//抽象属性var name : String//抽象方法fun action_abstract2()
}//接口实现 , 注意没有构造函数委托
//需要实现 Intf1 和 Intf2 中的抽象成员
class Impl : Intf2 {override var name: String = "Tom"override var age: Int = 18override fun action_abstract() {println("Impl : action_abstract")}override fun action_abstract2() {println("Impl : action_abstract")}
}

【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )相关推荐

  1. Java面试接口以及接口调用超时解决方法

    一.概念 是一个抽象类型,是抽象方法的集合(100%的抽象类).接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法.一个接口只有方法的特征没有方法的实现,因此这些方 ...

  2. Java接口学习(接口的使用、简单工厂、代理模式、接口和抽象类的区别)

    前言引入 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 我的 ...

  3. 方法的重写和重载,接口和抽象类区别

    方法的重写和重载,接口和抽象类区别,新手入门必看!!!!!要记住 方法的重写和重载 重写 重载 接口和抽象类 说明 方法的重写和重载 重写 在Java程序中,类的继承关系可以产生一个子类,子类继承父类 ...

  4. Java8新特性Optional、接口中的默认方法与静态方法

    Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...

  5. http接口返回对象的方法

    有时候写了一个http接口后,希望这个接口返回一个对象,方法如下,通过Gson 1. 接口处的处理 @RequestMapping(value = "/parse/baidu/lemma&q ...

  6. typescript 接口 java_[Java教程]【TypeScript】TypeScript 学习 2——接口

    [Java教程][TypeScript]TypeScript 学习 2--接口 0 2015-06-19 12:00:28 在 TypeScript 中,接口是用作约束作用的,在编译成 JavaScr ...

  7. Go 学习笔记(35)— Go 接口 interface (接口声明、接口初始化、接口方法调用、接口运算、类型断言、类型查询、空接口)

    1. 接口概念 接口是双方约定的一种合作协议.接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节.接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式.类型及结构. 接口内部存 ...

  8. java修饰方法_java接口中方法、属性修饰符详解

    java接口的修饰符:abstract(inteeface本身就是抽象的,加不加abstract都一样). 接口中字段的修饰符:public static final(默认不写) 如下解释: publ ...

  9. Ajax→异步的JavaScript和XML、HTTP请求响应、Ajax简介同步异步、XMLHttpRequest类的方法及属性、原生Ajax、Koa实现Ajax、接口文档、浏览器同源策略、反向代理

    浏览器服务器 HTTP请求响应 数据库后端语言 Ajax简介同步异步 Koa前端框架 XMLHttpRequest类的方法及属性 原生Ajax Koa实现Ajax JSON DOM 接口文档 浏览器同 ...

最新文章

  1. 学计算机一般要off,必须要学的电脑知识
  2. 微型计算机怎么插耳机,让听音更轻松一些,朗琴E10真无线耳机
  3. boost::hana::permutations用法的测试程序
  4. 5.13 卡尔曼滤波
  5. JavaScript函数 this调用规则
  6. keil C对lib封装库反汇编成C语言,Keil软件“C语言”及“汇编”混编 —— 相关知识整理.doc...
  7. 在linux中 与 的区别,在linux中,和, |和|| , 与 的区别
  8. [Unity脚本运行时更新]C#7新特性
  9. SAP License:FI疑难问题小结
  10. 合作︱2018CCF青年精英大会首设科技创业竞赛,快来报名吧!
  11. Mycat-server-1.6.5 常见分片方式
  12. php dfa,DFA 算法的PHP实现
  13. Java实现简单图书管理系统
  14. SQL Server2008详细安装步骤(超详细步骤)
  15. 基于Quartz实现定时任务-框架学习
  16. 用python的matplotlib和numpy库绘制股票K线均线和成交量的整合效果(含量化验证交易策略代码)
  17. app系统后台服务器搭建,云服务器 搭建 app后台
  18. 随手写的QT程序:文件大小转化可读字符串,整数转 B,KB,MB......
  19. 计算机虚拟化技术的未来前景,计算机虚拟化技术及应用前景分析
  20. 区块链常见的几大共识机制

热门文章

  1. MySQL:参数wait_timeout和interactive_timeout以及空闲超时的实现【转】
  2. git 错误 RPC
  3. jvm垃圾回收器(《深入理解java虚拟机》)
  4. Python学习之路-12 (递归)
  5. 前端学习笔记2017.6.12 CSS控制DIV
  6. css 字体样式设置
  7. prism4.0——chapter 2:初始化Prism应用
  8. Java ---- java io / java nio / java net 学习资源汇总
  9. 36)PHP,搜寻数据库信息在html中显示(晋级1)
  10. Win10開始菜单打不开