继续面向对象,开撸就是!!

接口:

我们知道对于JDK8之后接口中除了方法的声明之后还可以有default方法的,而在Kotlin中也类似,下面来看一下在Kotlin接口相关的东东:

很显然就是一个方法的声明,接着:

这是方法的具体实现,跟JDK8中的默认方法差不多,只不过在Koltin中的接口中定义具体方法之前不需要用default关键字来声明而已,下面在里面打印一句话:

接下来咱们可以在实现类中来复写接口中实现的方法,如下:

接下来问题来了:既然一个类既可以实现一个接口,又能继承一个类,那如果都定义的是同一个方法,那子类覆写的到底是接口中的方法还是类中的方法呢?下面来试一下:

所以:

接下来提个需求,在C中重写方法中需要融合接口A和类B方法的功能该怎么办呢?如下:

抽象类:

它跟Java类似,所以说明一上语法既可,如下:

伴生对象【companion object】:

在这是Kotlin的新概念,主要也是为了解决某个问题而存在的,具体解决啥问题先不说,因为需要有一些前置的概念先要了解,“object declaration 对象声明”,具体怎么定定义呢?

这就声明了一个对象,而在对象里面也可以像类一样声明属性和方法,如下:

那如何调用它呢?既然已经是对象了,那不直接用.的方式去调用就行了?是的~~不用像class那样还得先生成实例再调用之,如下:

其实有点像JavaScript,任何皆对象。好,学它的目的是为了要学习“伴生对象”而做准备,在Java中是完全没这个概念的,但是!!在像Scala这样的语言也是存在的,那啥叫“伴生对象”呢?其实得从Java的static说起, 我们知道被static修饰的成员变量或者方法是用Class直接去调用的,那是不是跟我们说的定义的对象有点类似,在Kotlin中,与java不同的是,类是没有static方法的,那么问题来了,那在Kotlin中如何表达static的这种作用呢?其实是这样:在大多数情况下,Kotlin推荐的做法是使用包级别的函数来作为静态方法,Kotlin会将包级别的函数当做静态方法来看待。那问题又来了,说的这个包级别的函数跟咱们已经学习的对象声明和既将要学习的伴生对象又有何关系呢?所谓“伴生”其实就是存在于类中的一个对象,它是随类一起伴生的,讲了这么多下面来瞅下它的真面目:

然后在伴生对象里面定义的东东跟在类中定义的差不多,如下:

那这个伴生对象如何使用呢?如下:

直接可以通过类来访问伴生对象里面的方法,但是!!貌似跟java中的static还是没联系上呀,下面再来演变:

这就是伴生对象所起到的作用,可以达到java中的static的效果。

接下来再来脑洞一个情况:假如一个类中有多个伴生对象,而且伴生对象中有相同的方法,那我们直接用类去访问这个方法调的是哪个伴生对象中的方法呢?其实Kotlin已经为我们杜绝了这种可能性,也就是一个类只能有一个伴生对象,不信咱们试试:

另外还有一个细节,就是伴生对象的名字其实是可以省略掉的:

其中报错的需要这样改就不会报错了:

所以“如果不提供伴生对象的名字,那么编译器会提供一个默认的名字叫Companion”,下面咱们还是将伴生对象名称还原:

至此对于Kotlin的伴生对象的使用就已经学完了,但是!!还是有个疑问:它怎么就能实现static的效果呢?编译生成的字节码中是不是真正给加上一个static的关键字呢?好!!接下来就开始对它进行揭密:先来将这个伴生对象给打印一下,看它倒底是啥?

所以需要注意:“虽然伴生对象的成员看起来像是Java中的静态成员,但是在运行期,他们依旧是真实对象的实例成员【因为属于伴生内部对象中的方法,伴生对象在编译后会生成一个静态内部类】”,但是在JVM上,可以将伴生对象的成员真正生成为类的静态方法与属性,这是通过@JvmStatic注解来实现的,如下:

那说是这么说,如何来验证所说的观点呢?其实很简单,查看一下所生成的字节码就知晓了,所以下面来正式探究原理,先来查看一下当前生成类的字节信息,咱们先来看不加@JvmStatic注解的字体码情况:

进一步查看字节信息:

这也论证了“虽然伴生对象的成员看起来像是Java中的静态成员,但是在运行期,他们依旧是真实对象的实例成员【因为属于伴生内部对象中的方法,伴生对象在编译后会生成一个静态内部类】”,好,接下来加上@JvmStatic注解,再来看一下字节码的情况:

真正成为了Mytest中的静态方法了,这也就是这个注解的作用,下面来看一下该注解的说明:

再来看一下详细的字节情况:

接下来为了更加清晰的了解,再定义一个类,再查看一下它的字节码信息:

下面调用一下:

所以说,了解一定的Java字节码的知识有助于了解底层~~

Kotlin伴生对象及其字节码内幕详解的更多相关文章

  1. Java Class 字节码文件结构详解

    Class字节码中有两种数据类型: 字节数据直接量:这是基本的数据类型.共细分为u1.u2.u4.u8四种,分别代表连续的1个字节.2个字节.4个字节.8个字节组成的整体数据. 表:表是由多个基本数据 ...

  2. [转]C语言字节对齐问题详解

    C语言字节对齐问题详解 转载:https://www.cnblogs.com/clover-toeic/p/3853132.html 引言 考虑下面的结构体定义: typedef struct{ ch ...

  3. Hadoop3.1.1源码Client详解 : 写入准备-RPC调用与流的建立

    该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 关于RPC(Remote Procedure Call),如果没有概念,可以参考一下RMI(Remot ...

  4. Hadoop3.1.1源码Client详解 : 入队前数据写入

    该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 紧接着上一篇: Hadoop3.1.1源码Client详解 : 写入准备-RPC调用与流的建立 先给出 ...

  5. NopCommerce源码架构详解--初识高性能的开源商城系统cms

    很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...

  6. HTTP 状态响应码 意思详解/大全

    HTTP 状态响应码 意思详解/大全 转:http://blog.csdn.net/helin916012530/article/details/29842595 HTTP状态码(HTTP Statu ...

  7. NopCommerce源码架构详解

    NopCommerce源码架构详解--初识高性能的开源商城系统cms   很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从 ...

  8. Nop--NopCommerce源码架构详解专题目录

    最近在研究外国优秀的ASP.NET mvc电子商务网站系统NopCommerce源码架构.这个系统无论是代码组织结构.思想及分层都值得我们学习.对于没有一定开发经验的人要完全搞懂这个源码还是有一定的难 ...

  9. Hadoop3.1.1源码Client详解 : Packet入队后消息系统运作之ResponseProcessor(ACK接收)

    该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 紧接着上一篇文章: Hadoop3.1.1源码Client详解 : Packet入队后消息系统运作之D ...

随机推荐

  1. [LeetCode] 723. Candy Crush 糖果粉碎

    This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...

  2. 高级UI-滤镜和颜色通道

    滤镜在图片处理里面有很多的运用,尤其是相机使用了大量的滤镜,通过对颜色通道的调和,可以呈现出各种各样的效果 对图像进行一定的过滤加工处理,使用Paint设置滤镜效果 很多高级UI使用时候需要关闭硬件加 ...

  3. 重回ubutntu12.04小记(装完ubuntu做的几件事)

    原来一直是在windows下用虚拟机跑redhat 和debian 做实验和一些工程,以前也装过ubuntu和windows双系统,但是换电脑后,就一直懒得捣鼓了. 现在,由于长期需要在linux上做 ...

  4. 【计算机网络基础】URI、URN和URL的区别

    先引用一张关系图 灰色部分为URI URI强调的是给资源标记命名,URL强调的是给资源定位. URI是Uniform Resource Identifier,表示是一个资源: URL是Uniform ...

  5. redis复制机制

    摘自redis设计与实现 通过客户端,发送slave of xxx给redis从服务器,即可实现主从服务器之间的复制.如果主服务器设置了requirepass进行身份验证,从服务器需要设置master ...

  6. Linux 环境安装 Node、nginx、docker、vsftpd、gitlab

    Linux 环境安装 centos7 # 更新yum yum update -y 0. 防火墙 firewalld 新入的JD云服务器,发现防火墙默认是关闭的. # 查看防火墙状态 systemctl ...

  7. vue 仿写微信公众号自定义菜单

    先看效果图 代码参考 <template> <div> <!-- 公众号设置 --> <el-col :span="24" style=& ...

  8. wireshark抓包新手教程(win10空包问题)

    首先下载官网的wireshark,下载地址https://www.wireshark.org/ 下载完按照提示一步步安装 安装完打开wireshark,安装中文包 安装之前首先讲一下win10截图工具 ...

  9. golang ---获取内存信息

    package main import ( "fmt" "syscall" "unsafe" ) var kernel = syscall. ...

  10. 面试总结 转发(CSDN 博主)

    1 https://blog.csdn.net/jackfrued/article/details/44921941 2 https://blog.csdn.net/jackfrued/article ...