2019独角兽企业重金招聘Python工程师标准>>>

一,伴生对象

1.类似于java中的静态方法static

class TestCompanion{//伴生对象使用companion object定义companion object {fun doTest(){}}
}//kotlin调用
fun main(args: Array<String>) {//2种方式//直接通过类名点Companion去点要调用的方法TestCompanion.Companion.doTest()//直接通过类名去点要调用的方法TestCompanion.doTest()
}//kotlin和java是100%兼容,在Java中调用
public class TestCompanionJava {public static void main(String[] args) {TestCompanion.Companion.doTest();}
}

在java中调用可见加了一个Companion,但是假设我们在开发是由java转kotlin项目肯定是一点一点的去动代码,那么这里就涉及到静态方法改成kotlin但是调用还是java,怎么办呢?

class TestCompanion{//伴生对象使用companion object定义companion object {//使用该注解,在java中就可以直接类名调用@JvmStaticfun doTest(){}}
}
//JAVA调用
public class TestCompanionJava {public static void main(String[] args) {TestCompanion.doTest();}
}

2.实现接口


class TestCompanion{//伴生对象使用companion object定义//实现一个接口companion object :InterfaceCompanion {override fun inter() {println("伴生对象")        }}
}
/*** 有两种方法调用方法*/
fun main(args: Array<String>) {//1.直接调用方法名TestCompanion.inter()//2.实例化伴生对象,再通过对象调用方法名val companion = TestCompanion.Companioncompanion.inter()//在这里我们测试一下实例val companion2 = TestCompanion.Companionprintln(companion)println(companion2)
}输出: 伴生对象
伴生对象
river.service.TestCompanion$Companion@16b98e56
river.service.TestCompanion$Companion@16b98e56//可见两次实例的物理地址是一样的,说明是同一个实例对象

这种实现接口的伴生对象有什么意义呢?

个人粗浅理解,作为外层类的成员变量,又作为该接口的一个实现类的实例,若只有这一个地方需要使用到这样实现的子类,或者只在此处需要这样定制化的子类,则可以写成这种,类似于匿名内部类的样子,我们不需要知道这个子类是什么,只需要知道他的特性即可;

二.对象表达式

Kotlin 用对象表达式和对象声明来实现创建一个对某个类做了轻微改动的类的对象,且不需要去声明一个新的子类。

/*** 对象表达式用法* 通过对象表达式实现一个匿名内部类的对象用于方法的参数中:*/
class TestCompanion{//对象表达式实现接口var param = object : InterfaceCompanion{override fun inter() {TODO("not implemented") //To change body of created functions use File | Settings | File Templates.}}//对象表达式继承抽象类var param2 = object : AbstractObject() {override fun abMethod(): String {TODO("not implemented") //To change body of created functions use File | Settings | File Templates.}}}
/*** 有两种方法调用方法*/
fun main(args: Array<String>) {val testCompanion = TestCompanion()println(testCompanion.param2.name)}输出 : name
//上面例子用到的接口和抽象类
//1.接口
interface InterfaceCompanion{fun inter()
}//2.抽象类
abstract class AbstractObject{var name :String = "name"abstract fun abMethod():String
}

对象表达式的用途,当需要一个对某个类轻微改动后的实例时,又不需要显式的声明此改动后的类,因为用到的地方可能仅此一处,使用对象表达式可以更加简洁;减少了不必要的类,避免类膨胀;

转载于:https://my.oschina.net/JackieRiver/blog/1825819

Kotlin学习笔记(六) 伴生对象 对象表达式相关推荐

  1. Java学习笔记六 常用API对象二

    1.基本数据类型对象包装类:见下图 1 public class Test { 2 public static void main(String[] args){ 3 Demo(); 4 toStri ...

  2. Kotlin学习笔记-3 --- 类与对象

    文章参考 class KotlinClass {} /*** 空类 */ class EmptyClass 类的修饰符 1)classModifier: 类属性修饰符,标示类本身特性 abstract ...

  3. Kotlin 学习笔记(八)—— Kotlin类与对象之接口

    Kotlin 学习笔记(八)-- Kotlin类与对象之接口 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- 基础 ...

  4. Kotlin 学习笔记(七)—— Kotlin类与对象之属性与字段

    Kotlin 学习笔记(七)-- Kotlin类与对象之属性与字段 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- ...

  5. Kotlin开发笔记:伴生对象和数据类

    Kotlin开发笔记:伴生对象和数据类 简介: 前面的文章里我们已经介绍了如何创建类和类的成员变量,方法等.那么如果想要创建类级别的属性或者方法(就是类似于静态成员变量和方法)该如何实现呢?本篇文章将 ...

  6. Python学习笔记 (类与对象)

    Python学习笔记 (类与对象) 1.类与对象 面向对象编程语言类: 一个模板, (人类)-是一个抽象的, 没有实体的对象: (eg: 张三, 李四) 属性: (表示这类东西的特征, 眼睛, 嘴巴, ...

  7. JavaScript学习笔记02【基础——对象(Function、Array、Date、Math)】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  8. 【数据库学习笔记】——cursor游标对象

    目录 1.创建cursor对象 2.cursor对象常用方法 3.操作数据库的常见流程(五部曲) 课程视频链接: 第14节 Python操作数据库_哔哩哔哩_bilibili666https://ww ...

  9. oracle查看表空间的内容,学习笔记:Oracle查看object对象 表空间 表 索引 数据文件的使用空间...

    天萃荷净 运维DBA咨询想要查看Oracle的object对象的使用空间大小,包括表空间 表 索引 数据文件的使用空间 1.查看Oracle表空间大小 Select Tablespace_Name,S ...

最新文章

  1. postfix+mysql 发件服务
  2. C#设计模式--简单工厂模式
  3. Javascript-7对象:字符串、时间
  4. 鼠标点击实现花瓣雨_每周实验 | 黄金雨
  5. 宏锦软件 Android 的 ListView 使用详解
  6. VUE3.x的基本使用
  7. [导入]正则表达式学习心得体会(3)(转)
  8. java 性能优化:35 个小细节,让你提升 java 代码的运行效率
  9. java 员工管理系统
  10. 如何在Ubuntu MATE 18.04中安装GNOME 3?
  11. 1 is not JSON serializable的解决方案
  12. linux开发员用游戏本吗,为什么很多程序员使用thinkpad而不是同等价位的游戏本呢?...
  13. 备忘录-UE4切出焦点掉帧问题
  14. 交换二叉树的左右子树——非递归方式
  15. 软件测试质量度量,软件测试过程质量的度量
  16. 《夏风》刊发的几组诗词
  17. html 与 jsp 文件格式区别
  18. 瞬间几千次的重复提交,我用 SpringBoot+Redis 扛住了
  19. 尚硅谷JavaScript高级教程(javascript实战进阶)学习笔记
  20. oracle局域网相互连接,Oracle局域网客户端连接服务器

热门文章

  1. linux只允许从ttyS0设备登录,linux自动以root登录,并自动启动用户程序的设置方...
  2. 学习vue第一篇记录
  3. 作用域和作用域链 —javascript面向对象高级
  4. xcode更新之后插件失效的解决办法
  5. USACO training 2.4.5 Fractions to Decimals题解
  6. C#多线程、并发与并行概念
  7. VC6.0下opencv1.0的环境配置
  8. asp文件上传和下载
  9. Android—AspectJ实践
  10. IOS基础之绘图函数的使用