类与对象(一)
了解 Kotlin 中面向对象编程的基础知识。
概述
Kotlin 中的类相较于 Java 提供了诸多改进,使代码更加简洁、清晰且高效。
与 Java 一样,Kotlin 是一种面向对象的编程语言,同时融合了大量函数式编程特性。
Kotlin 支持封装、继承、多态等所有面向对象的核心概念,这些特性在 Java 中同样存在。
另一方面,Kotlin 的语法略有不同,使得代码更紧凑、更易读,整体上编写起来更加高效。
一个简单的类示例
1class Person { 2 val firstName = "Alex" 3 val lastName = "Prufrock" 4}
与 Java 类似,类的声明以关键字 class 开始,后接类名 Person。
在本例中,Person 类包含两个字段。更准确地说,它们是类型为 String 的属性,分别命名为 firstName 和 lastName。
由于使用了字符串字面量进行初始化,编译器会自动推断出
String类型。你也可以手动声明类型,例如:val firstName : String = "Alex"。
公共访问是默认值
与 Java 不同的是,这些属性的可见性默认为 public。在 Java 中,若未指定访问修饰符,则默认为包私有(package-private),而 Kotlin 默认将未显式声明的属性和函数设为公开可访问。
然而,这个类极其僵化,几乎毫无实际意义。两个属性的值在实例创建时就被固定,且由于它们是不可变的(val),无法被重新赋值。
因此,类需要引入构造函数:
构造函数
与 Java 不同,Kotlin 区分主构造函数和任意数量的次构造函数。
类的主构造函数可以非常简洁地通过直接将参数附加到类名后的方式定义:
1class Person(fn: String, ln: String) { // 主构造函数 2 val firstName = fn 3 val lastName = ln 4}
这里的参数 fn 和 ln 可在类体内部使用,因此在创建实例时可以为每个人指定不同的姓名。
在构造函数中直接声明属性
在大多数情况下,我们希望将构造函数的参数直接赋给类的属性。Kotlin 提供了一种极为简洁且实用的语法:
1class Person(val firstName: String, val lastName: String)
这不仅定义了一个带有两个参数的主构造函数,还通过 val 或 var 前缀直接将这两个参数声明为类的属性。因此,该写法与前一个例子完全等价。
类的定义已经变得如此简短,以至于甚至可以省略整个类体(包括大括号 {})。尽管如此,它仍然是一个合法的 Kotlin 类。为了更清晰易读,可以适当添加换行:
1class Person ( 2 val firstName: String, 3 val lastName: String 4) 5// 主函数在此处创建上述类的实例 6fun main() 7{ 8 val p1 = Person("Alex", "Prufrock") 9 println(p1.firstName) 10 println(p1.lastName) 11}