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
420Tham 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.0Cá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 180Bê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:
AdaThử 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())
}
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
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpHàm khởi tạo chínhKhối init và kiểm tra tính hợp lệHàm khởi tạo phụÔn tập: thẻ thư viện4Kế thừa
Lớp mở và lớp conGhi đè thành viênsuper và hàm khởi tạoLớp trừu tượngÔn tập: Danh bạ nhân viên2Thuộc tính và tính đóng gói
Trình truy cập tùy chỉnhBộ sửa đổi phạm vi truy cậpSetter riêng tưlazy và lateinitÔn tập: tài khoản ngân hàng5Giao diện
Khai báo giao diệnPhương thức mặc địnhNhiều giao diệnGiao diện như kiểu dữ liệuÔn tập: Phương thức thanh toánTự luyện tập: Playground Kotlin