// Person 类, 有主构造器, 用于初始化 name 属性
class Person(val name: String) {
// Body 部, 包含 age 属性
var age: Int = 0
}
fun main() {
// 调用构造器, 创建 Person 类的实例
val person = Person("Alice")
// 访问实例的属性
println(person.name)
// 输出结果为: Alice
println(person.age)
// 输出结果为: 0
}
以下代码声明了一个 Person 类, 它有一个属性来存储姓名. 还演示了如何使用默认构造器的值和特定的值来创建实例:
// 类头部有一个主构造器, 用默认值初始化 name
class Person(val name: String = "Sebastian")
fun main() {
// 使用构造器的默认值创建实例
val anonymousUser = Person()
// 传入特定的值创建实例
val namedUser = Person("Joe")
// 访问两个实例的 name 属性
println(anonymousUser.name)
// 输出结果为: Sebastian
println(namedUser.name)
// 输出结果为: Joe
}
// 类的主构造器包含 name 和 age 的默认值
class Person(val name: String = "John", var age: Int = 30)
fun main() {
// 使用默认值创建实例
val person = Person()
println("Name: ${person.name}, Age: ${person.age}")
// 输出结果为: Name: John, Age: 30
}
在 Body 部中, 可以直接使用主构造器参数, 初始化额外的类属性:
// 类的主构造器包含 name 和 age 的默认值
class Person(
val name: String = "John",
var age: Int = 30
) {
// 使用主构造器参数, 初始化 description 属性
val description: String = "Name: $name, Age: $age"
}
fun main() {
// 创建 Person 类的实例
val person = Person()
// 访问 description 属性
println(person.description)
// 输出结果为: Name: John, Age: 30
}
// 类的主构造器初始化 name 和 age
class Person(val name: String, var age: Int) {
init {
// 初始化代码块在创建实例时运行
println("Person created: $name, age $age.")
}
}
fun main() {
// 创建 Person 类的实例
Person("John", 30)
// 输出结果为: Person created: John, age 30.
}
你可以根据需要添加任意数量的初始化代码块(init {}). 它们按照在 Body 部中出现的顺序运行, 与属性初始化代码一起执行:
//sampleStart
// 类的主构造器初始化 name 和 age
class Person(val name: String, var age: Int) {
// 第一个初始化代码块
init {
// 创建实例时首先运行
println("Person created: $name, age $age.")
}
// 第二个初始化代码块
init {
// 在第一个初始化代码块之后运行
if (age < 18) {
println("$name is a minor.")
} else {
println("$name is an adult.")
}
}
}
fun main() {
// 创建 Person 类的实例
Person("John", 30)
// 输出结果为:
// Person created: John, age 30.
// John is an adult.
}
//sampleEnd
可以在初始化代码块中使用主构造器参数. 例如, 上面的代码中, 第一个和第二个初始化代码块都使用了主构造器的 name 和 age 参数.
// 类头部有一个主构造器, 初始化 name 和 age
class Person(
val name: String,
var age: Int
) {
// 直接委托给主构造器的次级构造器
constructor(name: String) : this(name, 0) {
println("Person created with default age: $age and name: $name.")
}
// 使用间接委托的次级构造器:
// this("Bob") -> constructor(name: String) -> 主构造器
constructor() : this("Bob") {
println("New person created with default age: $age and name: $name.")
}
}
fun main() {
// 根据直接委托创建实例
Person("Alice")
// 输出结果为: Person created with default age: 0 and name: Alice.
// 根据间接委托创建实例
Person()
// 输出结果为:
// Person created with default age: 0 and name: Bob.
// New person created with default age: 0 and name: Bob.
}
// 抽象类, 主构造器声明 name 和 age
abstract class Person(
val name: String,
val age: Int
) {
// 抽象成员
// 不提供实现, 必须由子类实现
abstract fun introduce()
// 非抽象成员(有实现)
fun greet() {
println("Hello, my name is $name.")
}
}
// 子类, 为抽象成员提供实现
class Student(
name: String,
age: Int,
val school: String
) : Person(name, age) {
override fun introduce() {
println("I am $name, $age years old, and I study at $school.")
}
}
fun main() {
// 创建 Student 类的实例
val student = Student("Alice", 20, "Engineering University")
// 调用非抽象成员
student.greet()
// 输出结果为: Hello, my name is Alice.
// 调用被覆盖的抽象成员
student.introduce()
// 输出结果为: I am Alice, 20 years old, and I study at Engineering University.
}