Kotlin 中类和对象之间的区别

2022-08-31 08:12:50

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

爪哇岛:

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 < 8; bit_index++) {

                temp = ((crc >> 15)) ^ ((crc_byte >> 7));

                crc <<= 1;
                crc &= 0xFFFF;

                if (temp > 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 ...
}

任何帮助将不胜感激。


答案 1

Kotlin 关于此的文档非常好,因此请随时阅读。

这个问题的选择答案在解释中有一些糟糕的短语,很容易误导人们。例如,一个对象不是“静态类本身”,而是 ,也称为单例。a static instance of a class that there is only one of

也许显示差异的最好方法是查看Java形式的反编译Kotlin代码。

Kotlin 对象和类:

object ExampleObject {
  fun example() {
  }
}

class ExampleClass {
  fun example() {
  }
}

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

等效的 Java 代码 Kotlin 将生成:

Kotlin 编译为 Java 字节代码,但是如果我们反向编译上述编译的 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 会引入对象s?

Kotlin 的主要用例是因为 Kotlin 试图摒弃静态和基元,给我们留下一种纯粹的面向对象语言。Kotlin 仍然在引擎盖下使用和基元,但它不鼓励开发人员再使用这些概念。相反,现在 Kotlin 用单例对象实例替换了 static。以前在 Java 中使用静态字段,在 Kotlin 中,您现在将创建一个 ,并将该字段放在 .objectstaticobjectobject

与 Java 的互操作性:

因为 Kotlin 与 Java 是 100% 可互操作的,所以有时你会希望以一种更适合 Java 阅读的方式公开某些 API 或字段。为此,您可以使用批注。通过在 with 中注释字段或函数,它将编译为 Java 可以更容易使用的静态字段。@JvmStaticobject@JvmStatic

伴随对象:

最后值得一提的是s。在Java中,您通常具有一些静态内容的类,但也有一些非静态/实例内容。Kotlin 允许您对伴随对象执行类似操作,这些伴随对象与 绑定,这意味着类可以访问其伴随对象的私有函数和属性:companion objectobjectclass

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)
  }
}

答案 2

Kotlin 对象就像一个无法实例化的类,因此必须按名称调用它。(静态类本身)

android 转换器看到您的类只包含一个静态方法,因此它将其转换为 Kotlin 对象。

在此处阅读更多相关信息:http://petersommerhoff.com/dev/kotlin/kotlin-for-java-devs/#objects


推荐