Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >转向Kotlin——对象

转向Kotlin——对象

作者头像
蜻蜓队长
发布于 2018-08-14 10:10:23
发布于 2018-08-14 10:10:23
76900
代码可运行
举报
文章被收录于专栏:Android机动车Android机动车
运行总次数:0
代码可运行
由于Kotlin中没有静态成员的概念,因此Kotlin推出了一个有趣的语法糖:对象。那么对象能取代静态类成员吗?该怎么做呢?下面会详细介绍到。

对象表达式

Java中又匿名类的概念,也就是说,在创建类的时候,无需指定类的名字。匿名类一般用于方法参数。基本理念就是方法需要接收一个类或者接口的实例,而这个实例只是在该方法中使用,没有必要单独再定义一个类,或者创建一个对象变量。因此,就在传入方法参数值的同时创建了该类的实例。代码例子如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JClass {

    public void fun(){
        System.out.println("jclass");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JClassTest {

    public static void process(JClass jClass) {
        jClass.fun();
    }

    public static void main(String[] agrs) {
        process(new JClass() {
            @Override
            public void fun() {
                System.out.println("haha jclass");
            }
        });
    }

}

最终输出 haha jclass

Kotlin中也有类似的功能,但不是匿名类,而是对象。与上面代码相同功能,下面是Kotlin代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object JClassTest {

    fun process(jClass: JClass) {
        jClass.`fun`()
    }

    @JvmStatic
    fun main(agrs: Array<String>) {
        process(object : JClass() {
            override fun `fun`() {
                println("haha jclass")
            }
        })
    }

}

可以看到,要想建立一个对象,就要使用object关键字,该对对象要继承的类需要与object之间用冒号(:)分隔。

对象和类一样,只能有一个父类,但可以实现多个接口,下面的代码中,对象不仅继承了JClass类,还实现了JInterface接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
process(object : JClass(), JInterface {
    override fun printlnData() {
        println("haha jinterface")
    }

    override fun `fun`() {
        println("haha jclass")
    }
})

如果只想建立一个对象,不想继承任何类,也不想实现任何接口,可以按下面的方式建立:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var data = object {
    var value: String = "H"
}

声明匿名对象

匿名对象只能用在本地(函数)或private声明中。如果将匿名对象用于public函数的返回值,或者public属性的类型,那么Kotlin编译器会将这些函数或属性的返回类型重新定义为匿名对象的夫类型,如果匿名对象没有继承任何类,也没有实现任何接口,那么父类型就是Any。因此,添加在匿名对象中的任何成员都将无法访问。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ObjectClass {
    // private函数,返回类型是匿名对象本身,可以访问x
    private fun foo() = object {
        var x = 1
    }

    // public函数,由于匿名对象没有任何父类型,因此函数的返回类型是Any
    public fun publicFoo() = object {
        var x = 2
    }

    fun bar() {
        var x = foo().x //可以访问
//        var x2 = publicFoo().x // 编译错误,publicFoo返回的是Any对象
    }
}

访问封闭作用域内的变量

在Java中,匿名对象访问封闭作用域内的变量,需要用final声明该变量,这也就意味着在匿名对象中无法修改封闭作用域内变量的值。在Java8中,如果只是使用封闭作用域内的变量,该比那辆无需使用final,但一旦修改变量的值,就必须使用final进行修饰,其实在Java8中,,封闭作用域的变量是一个隐式的final变量。

但是在Kotlin中,在匿名对象中就可以任意访问封闭作用域内的变量,包括修改它的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    fun main(agrs: Array<String>) {
        var n = 10
        process(object : JClass(), JInterface {
            override fun printlnData() {
                println("$n")
                println(n++)
            }
        })
    }

陪伴对象

在Kotlin中并没有静态类成员的概念,但并不等于不能实现类似于静态类成员的功能。陪伴对象就是Kotlin中用来解决这个问题的语法糖。

如果在Kotlin类中定义对象,那么就称这个对象为该类的陪伴对象。陪伴对象要使用companion关键字声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CompanionClass {

    companion object {
        val TAG = "JIA"

        fun create(): CompanionClass = CompanionClass()
    }

}

陪伴对象中定义的成员是可以直接通过类名访问的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var instance=CompanionClass.create()

注意,虽然陪伴对象的成员看起来很像其他语言中的类的静态成员,但在运行期间,这些成员任然是真实对象的实例的成员,它们与静态成员是不同的。不过使用@Jvmtatic进行注释,Kotlin编译器会将其编译成Byte Code真正的静态方法。这些内容以后会详细介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android机动车 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kotlin修炼指南(三)——奇技淫巧
Kotlin作为Android开发的首选语言,为开发者提供了大量的语法糖和技巧,让开发者可以专注于需求开发,而将语言所带来的影响减少到最少。Java和Kotlin最大的区别,实际上在于Kotlin的函数式编程思想以及语法,特别是lambda表达式,这是Kotlin效率高于Java开发的核心武器,在之前的文章中,已经有比较详细的讲解了。
用户1907613
2020/08/20
8000
Kotlin修炼指南(三)——奇技淫巧
从 Java 到 Kotlin,再从 Kotlin 回归 Java
背景介绍 作者是 Allegro 的一名技术人员。Allegro 拥有超过 50 个开发团队。可以自由选择 他们的 PaaS 所支持的技术。他们主要使用 Java、Kotlin、Python 和 Golang 进行编码。本文中提出的观点来自作者的经验。 Kotlin 很流行,Kotlin 很时髦。Kotlin 为你提供了编译时 null-safety 和更少的 boilerplate。当然,它比 Java 更好,你应该切换到 Kotlin。等等,或者你不应该如此?在开始使用 Kotlin 编写之前,请阅
我就是马云飞
2018/06/22
1.6K0
C++的魔法世界:类和对象的终章
类和对象(中)里介绍的构造函数,使用的是赋值实现成员变量的初始化。而构造函数还有另一种初始化方法,就是使用初始化列表。
技匠晓晨
2024/11/26
650
C++的魔法世界:类和对象的终章
Kotlin方法与Lambda表达式
Kotlin中并没有static关键字,不过我们可以借助companion object 来实现类方法的目的。
人不走空
2024/07/16
1830
Kotlin方法与Lambda表达式
Kotlin Vocabulary | 唯一的 \&#34;对象\&#34;
在 Java 语言中,static 关键字主要用于表明方法和属性是属于某个对象,而不是属于对象的实例。static 关键字也用于创建 Singleton (单例),单例模式是非常常见的设计模式,它可以帮您创建某个对象的唯一实例,并且其它对象也可以访问和分享该实例。
Android 开发者
2022/09/23
1.6K0
【趣学程序】java面向对象(一)
注意:如果类中没有写构造方法,那么系统会自动生成一个无参构造方法。public类名(){}。特别注意一点,如果你自己定义了构造方法,系统将不会再自动生成无参构造,如果需要使用无参构造,需要自己在类中定义出来。
趣学程序-shaofeer
2019/07/27
3760
Java 复习 【知识改变命运】第九章
饿汉式的缺点:饿汉式,一般创造重量级的对象,但是有可能创建了对象没有使用,造成资源的浪费
用户11319080
2024/11/21
460
Java 复习 【知识改变命运】第九章
重学 Kotlin —— object,史上最 “快” 单例 ?
这里是专栏 重学 Kotlin,灵感来自于 Medium 上 Android Developers 团队的 Kotlin Vocabulary 。
路遥TM
2021/08/31
3.4K1
转向Kotlin——类和接口
和Java没有什么两样,Kotlin中,类的声明也使用class关键字,如果只是声明一个空类,Kotlin和Java没有任何区别,不过定义类的其他成员,区别就很大了。
蜻蜓队长
2018/08/03
9820
kotlin基础--对象、接口、抽象类
如果你想要某个对象和一个类实例化绑定在一起,可以考虑伴生对象,使用 companion object 可以在一个类里定义一个伴生对象,一个类只能有一个伴生对象, 伴生对象也是静态的,只会在类实例化或调用伴生对象中的内容(对象和函数)时实例化一次
aruba
2021/12/06
4530
kotlin基础--对象、接口、抽象类
Better Kotlin
转眼间使用 Kotlin 已经有两个月了,时间不长,我也算搭上了 Google 宣布 Kotlin 作为官方支持语言的一波末班车。可能大家早已从纯 Java 开发 Android 转为了混合使用开发甚至是 Kotlin 开发,那你转向 Kotlin 的初衷又是什么呢?
贺biubiu
2019/04/24
1.3K0
《Kotin 极简教程》第7章 面向对象编程(OOP)(2)《Kotlin极简教程》正式上架:
在上面的代码中,我们通过向注解类添加元注解(meta-annotation)的方法来指定其他属性:
一个会写诗的程序员
2018/08/17
1.6K0
Kotlin---扩展
通过data关键字来定义数据类。通常用来定义纯数据类型的结构体。定义的数据类只能有一个主构造函数定义该数据类中的变量。而在该类中,可以定义函数
None_Ling
2018/12/06
6310
Java核心-面向对象(下)
之前说完了类、对象、方法以及面向对象的三大特性封装、继承和多态,现在来了解一下接口、代码块和一些常见的类如抽象类、包装类等。
reload
2024/02/21
1500
Java核心-面向对象(下)
《Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)第五章 Kotlin 面向对象编程(OOP)1. 面向对象的HelloWorld 2. 面向对象编程思想简述3.Kotlin 面向
Kotlin 同Java、 Scala、Groovy 一样,都使用关键字class 来定义类。
一个会写诗的程序员
2018/08/20
1.5K0
「JAVA」从语法到案例,从定义到使用,详细解释Java 内部类的完全实现
Java 类中的可以定义的成员有:字段、方法、内部类,内部类是定义在类结构中的另一个类,因为定义在类的内部,故称为内部类。
老夫编程说
2020/05/13
7980
「JAVA」从语法到案例,从定义到使用,详细解释Java 内部类的完全实现
第十三天 面向对象-final static 匿名对象内部类包代码块【悟空教程】
第13天 面向对象 第1章 面向对象其他知识点 1.1 final与static关键字 1.1.1 final关键字 1.1.1.1 final概念 继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写。可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢? 要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变。final是个修饰符,它可以用来修饰类,类的成员,以及局
Java帮帮
2018/06/11
4170
kotlin基础语法
最近在学kotlin,这是本人看菜鸟教程后所做的笔记,很多会内容和菜鸟教程重复,仅供参考
HelloJack
2018/10/25
2.2K0
转向Kotlin——枚举类和扩展
Kotlin中的枚举类和Java中的枚举类型非常相似,具有类的特性。一般将可枚举的同类型的一组值作为枚举类定义。
蜻蜓队长
2018/08/03
1.4K0
From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
Kotlin 出自于捷克一家软件研发公司 JetBrains ,这家公司开发出很多优秀的 IDE,如 IntelliJ IDEA、DataGrip 等都是它的杰作,包括 Google 官方的 Android IDE -- Android Studio ,也是 IntelliJ IDEA 的插件版。
Seachal
2023/05/20
1.3K0
From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
推荐阅读
相关推荐
Kotlin修炼指南(三)——奇技淫巧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验