首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从 Java 到 Kotlin,再从 Kotlin 回归 Java

伴生对象 ? 一个 Java 程序员来到 Kotlin 阵营。 “嗨,Kotlin。我是新来的,有静态成员可用吗?”他问。 “没有。...我是面向对象的,而静态成员不是面向对象的,” Kotlin回答。 “好吧,但我需要用于 MyClass 日志记录,该怎么办?” “没问题,可以使用伴生对象。” “伴生对象是什么鬼?”...“它是与绑定的一个单例对象。你可以把日志记录放在伴生对象中,” Kotlin 如此解释。 “明白了。是这样吗?” ? “对!...在没有Google的帮助下尝试着写出这个伴生对象。 ? ? 集合字面量 ? 在 Java 中初始化列表需要大量的模板代码: ? 初始化 Map 更加繁琐,所以不少人使用 Guava: ?...Java代码是正确的Groovy代码,因此你可以从.java文件扩展名更改为.groovy扩展名开始。每次你学习新的Groovy功能时,你都可以做出决定。你喜欢它还是喜欢用Java的方式?

1.8K40

从 Java 到 Kotlin,再从 Kotlin 回归 Java

=null//ok val b:String =null//编译错误 如果您在没有空检查的情况下使用可空变量,那么Kotlin无法编译,例如: println(a.length)// compliation...“没有。我是面向对象的,而静态成员不是面向对象的,” Kotlin回答。 “好吧,但我需要用于 MyClass 日志记录,该怎么办?” “没问题,可以使用伴生对象。” “伴生对象是什么鬼?”...“它是与绑定的一个单例对象。你可以把日志记录放在伴生对象中,” Kotlin 如此解释。 “明白了。是这样吗?”...在没有Google的帮助下尝试着写出这个伴生对象。...Java代码是正确的Groovy代码,因此你可以从.java文件扩展名更改为.groovy扩展名开始。每次你学习新的Groovy功能时,你都可以做出决定。你喜欢它还是喜欢用Java的方式?

1.5K10
您找到你想要的搜索结果了吗?
是的
没有找到

号称取代 Java 的 Kotlin 语言到底是什么鬼?

Kotlin 中, 方法的参数无法修改,因此在本例中你不能改变 num。这个设计很好,因为你不应该改变方法的输入参数。但是你可以用相同的名称定义另一个变量对其进行初始化。...“这是局限到你的的单独对象。把你的 logger 放在伴生对象中。”Kotlin解释说。 “我懂了。这样对吗?”...Java 代码是正确的 Groovy 代码,因此你可以通过文件扩展名从 .java 更改为 .groovy。 最后的想法 学习新技术就像一项投资。我们投入时间,新技术让我们得到回报。...伴生对象 原文中说: 有时候你必须使用静态。旧版本 public static void main() 仍然是启动 Java 应用程序的唯一方式。...这就是为什么 Kotlin 不允许数据继承的原因。 我不知道你为什么提出这个问题。如果你需要复杂的,你仍然可以创建它们手动维护它们的 equals、hashCode 等方法。

2.2K50

Kotlin中的对象表达式和对象声明的具体使用

因此不允许将对象表达式定义成抽象对象表达式不能定义构造。但对象表达式可以定义初始化块,可以通过初始化块来完成构造需要完成的事情。 对象表达式可以包含内部类,不能包含嵌套。...非private修饰的对象表达式与Java的匿名内部类相似,编译只会把对象表达式当成它所继承的父或所实现的接口处理。如果它没有父类型,系统当它是Any类型。...的对象表达式比Java的匿名内部类增强了三个方面: 对象表达式可指定多个父类型 Kotlin编译准确地识别局部范围内private对象表达式的类型。...四、伴生对象的扩展 伴生对象也可以被扩展。如果一个具有伴生对象,则Kotlin允许为伴生对象扩展方法和属性。...) //通过伴生对象所在的调用为伴生对象扩展的成员 MyClass.test() println(MyClass.foo) } 输出结果: <h1 Kotlin必须学</h1 <h2

1.1K31

Better Kotlin

因此上面提到的,自定义 getter 方法随着当前时间的不同而返回不同的值违反了最后一条原则。大家也要尽量的避免这种情况。...3 应该好好注意一下伴生对象 伴生对象通过在中使用 companion object 来创建,用来替代静态成员,类似于 Java 中的静态内部类。...访问一个伴生对象的私有常量字段需要经过以下方法: 调用伴生对象的静态方法 调用伴生对象的实例方法 调用主的静态方法 读取主中的静态字段 为了访问一个常量,而多花费调用4个方法的开销,这样的 Kotlin...对于其他类型的常量,最好在它们自己的主对象而不是伴生对象中来存储公共的全局常量。...但由于某些原因,当我把上面的 ISkipService 改为Kotlin 实现,却发生了崩溃,从代码上暂时没看出问题。

1.2K20

是时候使用Kotlin编程了

Kotlin可以代码编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。...吸收了其他语言的优点:模板字符串,运算符重载,方法扩展,命名参数等。 2,安全性 Kotlin提供了安全符“?”,当变量可以为null时,必须使用可空安全符?进行声明,否则会出现编译错误。...调用上面集合的方式如下: 6,伴生对象 Kotlin没有静态属性和方法,如果我们要创建单列,可以使用Object关键字声明。...如果要在一个里面声明静态成员,可以在的内部使用伴生对象伴生对象使用关键字companion object。...伴生对象的调用跟Java一样,通过名.属性名称或函数名称调用。 新特性 1,空安全 在Kotlin中,对象声明分为可空引用和非空引用两种。

3.2K10

Kotlin与Java互操作

平台类型标识法 如上所述,平台类型不能在程序中显式表述,因此在语言中没有相应语法。 然而,编译和 IDE 有时需要(在错误信息中、参数信息中等)显示他们,Koltin提供助记符来表示他们: T!...静态字段 在命名对象伴生对象时,声明的 Kotlin 属性会在该命名对象或包含伴生对象中包含静态幕后字段。通常这些字段是私有的,但可以通过以下方式之一暴露出来。...Key.COMPARATOR.compare(key1, key2); // Key 中的 public static final 字段 在命名对象或者伴生对象中的一个延迟初始化的属性具有与属性 setter... 注解也可以应用于对象伴生对象的属性, 使其 getter 和 setter 方法在该对象或包含该伴生对象中是静态成员。...// …… } 因为 foo() 没有声明 IOException,我们从 Java 编译得到了一个报错消息

3.4K30

Kotlin 漫谈系列之类与继承

Kotlin: Kotlin 里面已经没有方法的概念了。?不过,Kotlin 中可以用 object 关键字直接定义一个对象,在内部,我们可以用 companion 为声明一个伴生对象。...伴生对象的成员可通过只使用名作为限定符来调用,伴生对象的成员看起来像 Java 的静态成员,在运行时他们仍然是真实对象的实例成员。...在 JVM 平台,如果使用 @JvmStatic 注解,你可以伴生对象的成员生成为真正的静态方法和字段。 不过你们的方法还可以被子类重写,这个在 Java 里也不行。...伴生对象 Kotlin 中可以用 object 关键字直接定义一个对象,在内部,我们可以用 companion 为声明一个伴生对象。...在 JVM 平台,如果使用 @JvmStatic 注解,你可以伴生对象的成员生成为真正的 静态方法和字段。详细信息请参见Java 互操作性一节。

3.6K40

Kotlin | 4.对象和接口

/ 将会生成一个不带任何参数的构造方法 open class Button // 必须显示的调用父的构造方法,即使没有任何参数,空括号表示没有参数的构造方法...因此它违反了通用的hashCode契约:如果两个对象相等,它们必须有着相同的hash值。...初始化语句块和从构造方法为初始化实例提供了灵活性 使用 field 标识符在访问方法体中引用属性的支持字段 数据提供了编译生成的 equals hashCode toString copy 和其他方法...伴生对象(与包级别函数和属性 起)替代了 Java 静态方法和字段定义 伴生对象与其他对象一样,可以实现接口,也可以拥有有扩展函数和属性 对象表达式是 Kotlin 中针对 Java 匿名内部类的替代品...,增加了诸如实现个接口的能力和修改在创建对象的作用域中定义的变 的能力等功能

91510

Kotlin的互操作——Kotlin与Java互相调用

⑤ NoArg和AllOpen 数据本身属性没有默认的无参数的构造方法,因此Kotlin提供一个NoArg插件,支持JPA注解,如@Entity。...④ 静态方法 Kotlin包级函数表示为静态方法。如果对这些函数使用@JvmStatic进行标注,那么Kotlin还可以为在命名对象伴生对象中定义的函数生成静态方法。...如果使用该注解,那么编译既会在相应对象中生成静态方法,也会在对象自身中生成实例方法。...();//没问题,通过单例实例调用 Obj.INSTANCE.foo();// 也没问题 @JvmStatic注解也可以被应用于对象伴生对象的属性上,使其getter和setter方法在该对象或包含该伴生对象中是静态成员...因此示例中的对应函数实际上翻译如下: // 作为返回类型——没有通配符 Box boxDerived(Derived value) { … } // 作为参数——有通配符 Base

3.7K10

Kotlin|这些隐藏的内存陷阱,你应该熟记于心

错误示例 sealed 初始化 如题,我们有一个公用的属性 sum ,为了便于复用,我们将其抽离到 Fruit 构造函数中,让子类便于初始化时传入,而不用重复显式声明。...错误示例 如下截图中所示,我们随便创建了一个方法,增加了 inline 关键字: 观察截图会发现,此时IDE已经给出了提示,它建议你移除 inline , Why? 为什么呢?...伴生对象,也许真的不需要 在 Kotlin 中,我们不能像 Java 一样,随便定义一个静态方法或者静态属性。此时 companion object(伴生对象)就会派上用场。...---- const 抛开前者不谈(静态对象),那么我们有没有什么方法能让编译少生成一个 get() 方法呢(非private)?...作为一个Kotlin使用者,这也是我们所不断追寻的。 善用字节码分析,你的技艺也上一筹。

77030

Kotlin学习日志(五)对象

这里面,初始化函数init看似是Kotlin的构造函数,但它只是构造函数的一部分,并不完整,因为没有定义输入参数,那么怎么定义呢?谁来定义呢?...2.3 伴生对象 伴生对象这个是在Kotlin中有的,Java中没有,什么是伴生对象呢,你可以把它理解为“影子”,把当做一个人,这个人可以有很多房子,但是人只有一个,影子也只有一个。...,它们都在伴生对象中定义,外部可以通过名直接访问该类的静态成员。...,由于Kotlin的接口允许实现方法,因此super所指的对象也可以是interface return super.run() } //重载了来自接口的抽象属性...这对于开发者来说无疑于一个繁琐的工作,而Kotlin鉴于此,推出了名为“数据”这样的骚操作,其实说起来也比较简单,数据的定义仅仅只要在class前面增加关键字data,声明拥有完整输入参数的构造函数

1K20

第4章 与面向对象编程第4章 与面向对象编程

第4章 与面向对象编程 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统等相关的知识。在本章节以及下一章中,我们一起来学习Kotlin对面向对象编程以及函数式编程的支持。...因此,每一个对象包含两部分:成员变量和成员方法。在成员方法中可以改变成员变量的值。 2.程序是对象的集合,他们通过发送消息来告知彼此所要做的事情,也就是调用相应的成员函数。...每个对象能够接受的请求(消息)由对象的接口所定义,而在程序中必须由满足这些请求的代码,这段代码称之为这个接口的实现。...当向某个对象发送消息(请求)时,这个对象便知道该消息的目的(该方法的实现已定义),然后执行相应的代码。 我们经常说一些代码片段是优雅的或美观的,实际上意味着它们容易被人类有限的思维所处理。...关键字,重写toString() return "Person(name='$name', age=$age, sex='$sex')" } } 使用这样的简洁语法,可以通过主构造来定义属性初始化属性值

1.7K20

重学 Kotlin —— object,史上最 “快” 单例 ?

对象声明 object 的语义是这样的:定义一个创建一个实例 。不管是对象声明,还是下面会说到的另外两种用法,都是遵循这一语义的。...下面来看看 伴生对象伴生对象 你可以回想一下,你在 Kotlin 中使用过 static 关键字吗?答案肯定是没有。...伴生对象,顾名思义,就是伴随着而存在的对象,在加载的时候初始化。...再回想一下前面说过的, object 其实我们可以把它理解成 定义一个创建一个实例 。 伴生对象仍旧符合这一语义。 在 Java 中如何调用伴生对象呢?...另外,我们可以给伴生对象命名,如下所示: companion object X { ... } 那么,编译生成的就不是 Companion 了,而是 X 。

2.6K20

Kotlin 机制你都了解吗?

kotlin 中有多少种构造函数 ---- kotlin 构造函数分为了两种: 主构造函数和次构造函数。...伴生对象的总结 ---- 类似于 Java 中使用访问静态成员的语法。因为 Kotlin 取消了 static 关键字,所以 Kotlin 引入伴生对象来弥补没有静态成员的不足。...可见,伴生对象的主要作用就是为其所在的外部类模拟静态成员。 注意: 每个可以最多有一个半生对象; 使用 const 关键字修饰常量,类似于 Java 中的 static final修饰。...8. init 代码块和构造方法以及伴生对象中代码的调用时机 ---- 创建 Person ,创建 person 对象打印方法调用时机: class Person { private var...-->show Kotlin Bytecode, Person 反编译成 java 得到: ?

76030

Kotlin 扩展函数 与 JS 的 prototypeKotlin 扩展函数 与 JS 的 prototype

扩展函数是静态解析的,并未对原添加函数或属性,对本身没有任何影响。 扩展属性允许定义在或者kotlin文件中,不允许定义在函数中。.../setters显式提供 val Foo.bar = 1 // 错误:扩展属性不能有初始化 get() = 1 由于扩展没有中插入新成员,因此扩展属性无法使用幕后字段,...这就是为什么扩展属性不能有初始化,只能由getters/setters显式提供!...3.伴生对象-扩展函数和属性 可为伴生对象定义扩展函数和属性: class MyClass { companion object { } //伴生对象 } fun...prototype就是“一个给对象添加方法的方法”,使用prototype属性,可以给动态地添加方法 语法 object.prototype.name=value 实例 在本例中,我们展示如何使用

1.6K20

Kotlin代码检查在美团的探索与实践

Kotlin的隐藏开销 伴生对象 伴生对象通过在中使用companion object来创建,用来替代静态成员,类似于Java中的静态内部类。...访问一个伴生对象的私有常量字段需要经过以下方法: 调用伴生对象的静态方法 调用伴生对象的实例方法 调用主的静态方法 读取主中的静态字段 为了访问一个常量,而多花费调用4个方法的开销,这样的Kotlin...对于其他类型的常量,最好在它们自己的主对象而不是伴生对象中来存储公共的全局常量。...可惜的是目前还没有解析Kotlin语法树的单独库,只能通过Kotlin编译这个库中的相关来解析。KLint用的是kotlin-compiler-embeddable:1.1.2-5库。...主要作用是.Kt文件转化成KtFile对象

1.5K40

《Kotin 极简教程》第7章 面向对象编程(OOP)(2)《Kotlin极简教程》正式上架:

例如,Spring中的Bean默认就是单例。通过单例模式可以保证系统中一个只有一个实例。即一个只有一个对象实例。...7.9.2 object对象 Kotlin没有 静态属性和方法,但是也提供了实现类似于单例的功能,我们可以使用关键字 object 声明一个object对象: object AdminUser {...Hi, I am CompanyC ClassC.CompanyC.index ClassC.CompanyC.create() ClassC.CompanyC.get() 伴生对象初始化是在相应的被加载解析时...,与 Java 静态初始化的语义相匹配。...密封的所有子类都必须与密封在同一个文件中声明(在 Kotlin 1.1 之前, 该规则更加严格:子类必须嵌套在密封声明的内部): sealed class Expression class Unit

1.4K20
领券