Menu
CoddyTech

Hàm khởi tạo chính

Thuộc phần Lập trình hướng đối tượng trong hành trình Kotlin của Coddy. Bài học 3 trên 57.

Hầu hết các lớp Kotlin nhận các giá trị khởi tạo trong hàm khởi tạo chính, được viết trong dấu ngoặc đơn sau tên lớp. Viết val hoặc var trước một tham số cũng biến tham số đó thành thuộc tính:

class Book(val title: String, var pages: Int)

Bên trong main:

val book = Book("Dune", 412)
println(book.title)
book.pages += 8
println(book.pages)

Đầu ra:

Dune
420

Tham số không có val hoặc var chỉ dùng được trong lúc tạo đối tượng, chẳng hạn để tính một thuộc tính. Không thể gán lại thuộc tính val sau khi tạo đối tượng, còn thuộc tính var thì có thể:

class Temperature(celsius: Double) {
    val fahrenheit = celsius * 9 / 5 + 32
}

Bên trong main:

val t = Temperature(100.0)
println(t.fahrenheit)

Đầu ra:

212.0

Các tham số của hàm khởi tạo có thể có giá trị mặc định và được truyền theo tên, vì vậy một hàm khởi tạo đáp ứng nhiều cách tạo instance:

class Timer(val seconds: Int, val label: String = "timer")

Bên trong main:

val egg = Timer(300, "egg")
val quick = Timer(30)
val named = Timer(label = "tea", seconds = 180)
println("${egg.label} ${egg.seconds}")
println("${quick.label} ${quick.seconds}")
println("${named.label} ${named.seconds}")

Đầu ra:

egg 300
timer 30
tea 180

Bên trong thân lớp, this chỉ đối tượng hiện tại. Bạn cần dùng từ khóa này khi tham số của phương thức có cùng tên với thuộc tính:

class Player(var name: String) {
    fun rename(name: String) {
        this.name = name
    }
}

Bên trong main:

val p = Player("anon")
p.rename("Ada")
println(p.name)

Đầu ra:

Ada
challenge icon

Thử thách

Dễ

Khai báo lớp Account với hàm khởi tạo chính: thuộc tính chỉ đọc owner và thuộc tính có thể thay đổi balance, mặc định là 0. Thêm summary(), hàm này trả về Ada has 150.

Code có sẵn đọc tên chủ tài khoản và, khi có dòng thứ hai, đọc số dư ban đầu. Code tạo tài khoản có hoặc không có số dư rồi in ra summary().

Viết code của bạn trong Account.kt. Main.kt chứa code đầu vào/đầu ra có sẵn và bạn không thể chỉnh sửa.

Tự làm thử

fun main() {
    // Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
    val input = generateSequence(::readLine).toList()
    val account = if (input.size > 1) Account(input[0], input[1].toInt()) else Account(input[0])
    println(account.summary())
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Playground Kotlin