Kotlin中的一个类和一个对象之间的区别

我是Kotlin的新手,最近把一个简单的文件从java转换为Kotlin。 我想知道为什么Android转换器将我的Java类更改为Kotlin对象。

Java的:

public class MyClass { static public int GenerateChecksumCrc16(byte bytes[]) { int crc = 0xFFFF; int temp; int crc_byte; for (byte aByte : bytes) { crc_byte = aByte; for (int bit_index = 0; bit_index > 15)) ^ ((crc_byte >> 7)); crc < 0) { crc ^= 0x1021; crc &= 0xFFFF; } crc_byte <<= 1; crc_byte &= 0xFF; } } return crc; } } 

转换Kotlin:

 object MyClass { fun GenerateChecksumCrc16(bytes: ByteArray): Int { var crc = 0xFFFF var temp: Int var crc_byte: Int for (aByte in bytes) { crc_byte = aByte.toInt() for (bit_index in 0..7) { temp = crc shr 15 xor (crc_byte shr 7) crc = crc shl 1 crc = crc and 0xFFFF if (temp > 0) { crc = crc xor 0x1021 crc = crc and 0xFFFF } crc_byte = crc_byte shl 1 crc_byte = crc_byte and 0xFF } } return crc } } 

为什么不是这样:

 class MyClass { ... etc ... } 

任何帮助将不胜感激谢谢。

Kotlin对象就像一个不能实例化的类,所以它必须按名称调用。 (一个静态类每个说)

android转换器看到你的类只包含一个静态方法,所以它转换成一个Kotlin对象。

在这里阅读更多关于它: http : //petersommerhoff.com/dev/kotlin/kotlin-for-java-devs/#objects

一个对象是一个单例。 你不需要创建一个实例来使用它。

一个类需要实例化才能使用

就像在Java中一样,你可以说Math.sqrt(2),你不需要创建一个数学实例来使用sqrt,在Kotlin中你可以创建一个对象来保存这些方法,而且它们是有效的静态的。

这里有一些信息:

https://kotlinlang.org/docs/reference/object-declarations.html

IntelliJ显然足够聪明,可以检测到你需要一个对象,因为你只有静态的java方法。

Kotlin关于这方面的文档相当不错,所以请随时阅读。

对于这个问题,选择的答案在解释上有一些不好的措词,很容易误导人们。 例如,一个对象不是“一个静态类每个说”,而是a static instance of a class that there is only one of ,否则称为单例。

也许最好的方法是看看反编译的Kotlin代码的Javaforms。

这是一个Kotlin对象和类:

 object ExampleObject { fun example() { } } class ExampleClass { fun example() { } } 

为了使用ExampleClass ,你需要创建它的一个实例: ExampleClass().example() ,但是对于一个对象,Kotlin会为你创建一个实例,而你永远不会调用它的构造函数您只需使用名称: ExampleObject.example()即可访问它的静态实例。

这是Kotlin将生成的等效Java代码:

 public final class ExampleObject { public static final ExampleObject INSTANCE = new ExampleObject(); private ExampleObject() { } public final void example() { } } public final class ExampleClass { public final void example() { } } 

你可以用下面的方式在Kotlin中使用这个对象:

 ExampleObject.example() 

哪个可以编译成等效的Java字节码:

 ExampleObject.INSTANCE.example() 

Kotlin中object的主要用例是因为Kotlin试图消除静态和原语,给我们留下纯粹的面向对象的语言。 Kotlin仍然使用引擎盖下方的static和原始图形,但是它不鼓励开发者使用这些概念。 相反,现在Kotlin用单例对象实例替换静态。 您以前在Java中使用静态字段的位置,现在您将在Kotlin中创建一个object ,并将该字段放入object

因为Kotlin可以与Java 100%进行互操作,所以有时候你会希望以更好的方式公开某些API或者字段来读取。 要做到这一点,你可以使用@JvmStatic注解。 通过使用@JvmStatic注释一个object的字段或函数,它将被编译到Java可以使用的静态字段中。

最值得一提的是companion object 。 在Java中,您通常拥有一些具有一些静态内容的类,但也包含一些非静态/实例内容。 Kotlin允许你做伴侣对象的类似事情,这些伴侣对象是绑定到一个class对象,这意味着一个类可以访问它的伴侣对象的私有函数和属性:

 class ExampleClass { companion object { // Things that would be static in Java would go here in Kotlin private const val str = "asdf" } fun example() { // I can access private variables in my companion object println(str) } } 

你也可以定义没有对象声明的函数。 只需在.kt文件中例如:

 fun GenerateChecksumCrc16(bytes: ByteArray): Int { ... } 

而这个函数和package相关的地方是.kt文件被声明。 你可以在这里阅读更多关于https://kotlinlang.org/docs/reference/packages.html