Kotlin 类和对象


在本章中,我们将学习使用 Kotlin 进行面向对象编程 (OOP) 的基础知识。我们将了解类及其对象以及如何使用该对象。根据 OOP 的定义,类是运行时实体的蓝图,对象是其状态,包括其行为和状态。在 Kotlin 中,类声明由一个类头和一个用大括号包围的类体组成,类似于 Java。

Class myClass { // 类头

    // 类主体
}

与 Java 一样,Kotlin 也允许创建一个类的多个对象,你可以自由地包含它的类成员和函数。我们可以使用不同的关键字来控制类成员变量的可见性,我们将在第 10 章 - 可见性控制中学习。在下面的示例中,我们将创建一个类及其对象,通过它我们将访问该类的不同数据成员。

class myClass {
    // 属性(数据成员)
    private var name: String = "Newbiego.com"
   
    // 成员函数
    fun printMe() {
        print("You are at the best Learning website Named-"+name)
    }
}
fun main(args: Array<String>) {
    val obj = myClass() // 创建 myClass 类的 obj 对象
    obj.printMe()
}

上面的代码将在浏览器中产生以下输出,我们使用它自己的对象调用 myClass 的 printMe()。

You are at the best Learning website Named- Newbiego.com

嵌套类


根据定义,当一个类在另一个类中创建时,它被称为嵌套类。在 Kotlin 中,嵌套类默认是静态的,因此可以在不创建该类的任何对象的情况下访问它。在下面的例子中,我们将看到 Kotlin 如何解释我们的嵌套类。

fun main(args: Array<String>) {
    val demo = Outer.Nested().foo() // 调用嵌套类方法
    print(demo)
}
class Outer {
    class Nested {
        fun foo() = "Welcome to The Newbiego.com"
    }
}

上面的代码将在浏览器中产生以下输出。

Welcome to The Newbiego.com

内部类


当嵌套类被标记为“内部”时,它将被称为内部类。内部类可以被外部类的数据成员访问。在下面的示例中,我们将访问外部类的数据成员。

fun main(args: Array<String>) {
    val demo = Outer().Nested().foo() // 调用嵌套类方法
    print(demo)
}
class Outer {
    private val welcomeMessage: String = "Welcome to the Newbiego.com"
    inner class Nested {
        fun foo() = welcomeMessage
    }
}

上面这段代码将在浏览器中产生以下输出,我们在编译时使用 Kotlin 编译器提供的默认构造函数调用嵌套类。

Welcome to the Newbiego.com

匿名内部类


匿名内部类是一个非常好的概念,它使程序员的生活变得非常轻松。每当我们实现一个接口时,匿名内部块的概念就会出现。使用运行时对象引用创建接口对象的概念称为匿名类。在下面的示例中,我们将创建一个接口,并使用匿名内部类机制创建该接口的对象。

fun main(args: Array<String>) {
    var programmer :Human = object:Human // 创建接口的实例 {
        override fun think() { // 覆盖think方法
            print("I am an example of Anonymous Inner Class ")
        }
    }
    programmer.think()
}
interface Human {
    fun think()
}

上面的代码将在浏览器中产生以下输出。

I am an example of Anonymous Inner Class

类别名


类别名是 Kotlin 编译器的一个属性。它提供了为现有类型创建新名称的灵活性,它不创建新类型。如果类型名称太长,你可以轻松引入一个较短的名称,并在将来使用时使用相同的名称。类型别名对于复杂类型真的很有帮助。在最新版本中,Kotlin 取消了对类型别名的支持,但是,如果你使用的是旧版本的 Kotlin,你可能会像下面这样使用它:

typealias NodeSet = Set<Network.Node>
typealias FileTable<K> = MutableMap<K, MutableList<File>>