Kotlin - Lớp & Đối tượng
Trong chương này, chúng ta sẽ học những kiến thức cơ bản về Lập trình hướng đối tượng (OOP) sử dụng Kotlin. Chúng ta sẽ tìm hiểu về lớp và đối tượng của nó cũng như cách chơi với đối tượng đó. Theo định nghĩa của OOP, một lớp là bản thiết kế của một thực thể thời gian chạy và đối tượng là trạng thái của nó, bao gồm cả hành vi và trạng thái của nó. Trong Kotlin, khai báo lớp bao gồm phần đầu lớp và phần thân của lớp được bao quanh bởi dấu ngoặc nhọn, tương tự như Java.
Class myClass { // class Header
// class Body
}
Giống như Java, Kotlin cũng cho phép tạo một số đối tượng của một lớp và bạn có thể tự do bao gồm các thành viên và chức năng của lớp đó. Chúng ta có thể kiểm soát khả năng hiển thị của các biến thành viên trong lớp bằng cách sử dụng các từ khóa khác nhau mà chúng ta sẽ học trong Chương 10 - Kiểm soát khả năng hiển thị. Trong ví dụ sau, chúng ta sẽ tạo một lớp và đối tượng của nó mà qua đó chúng ta sẽ truy cập các thành viên dữ liệu khác nhau của lớp đó.
class myClass {
// property (data member)
private var name: String = "Tutorials.point"
// member function
fun printMe() {
print("You are at the best Learning website Named-"+name)
}
}
fun main(args: Array<String>) {
val obj = myClass() // create obj object of myClass class
obj.printMe()
}
Đoạn mã trên sẽ mang lại kết quả sau trong trình duyệt, nơi chúng ta đang gọi printMe () của myClass bằng cách sử dụng đối tượng của chính nó.
You are at the best Learning website Named- Tutorials.point
Lớp lồng nhau
Theo định nghĩa, khi một lớp đã được tạo bên trong một lớp khác, thì nó được gọi là một lớp lồng nhau. Trong Kotlin, lớp lồng nhau theo mặc định là tĩnh, do đó, nó có thể được truy cập mà không cần tạo bất kỳ đối tượng nào của lớp đó. Trong ví dụ sau, chúng ta sẽ thấy cách Kotlin diễn giải lớp lồng nhau của chúng ta.
fun main(args: Array<String>) {
val demo = Outer.Nested().foo() // calling nested class method
print(demo)
}
class Outer {
class Nested {
fun foo() = "Welcome to The TutorialsPoint.com"
}
}
Đoạn mã trên sẽ mang lại kết quả sau trong trình duyệt.
Welcome to The TutorialsPoint.com
Lớp bên trong
Khi một lớp lồng nhau được đánh dấu là “bên trong”, thì nó sẽ được gọi là lớp Bên trong. Một lớp bên trong có thể được truy cập bởi thành viên dữ liệu của lớp bên ngoài. Trong ví dụ sau, chúng ta sẽ truy cập thành viên dữ liệu của lớp ngoài.
fun main(args: Array<String>) {
val demo = Outer().Nested().foo() // calling nested class method
print(demo)
}
class Outer {
private val welcomeMessage: String = "Welcome to the TutorialsPoint.com"
inner class Nested {
fun foo() = welcomeMessage
}
}
Đoạn mã trên sẽ mang lại kết quả sau trong trình duyệt, nơi chúng ta đang gọi lớp lồng nhau bằng cách sử dụng hàm tạo mặc định được cung cấp bởi trình biên dịch Kotlin tại thời điểm biên dịch.
Welcome to the TutorialsPoint.com
Lớp bên trong ẩn danh
Lớp bên trong ẩn danh là một khái niệm khá hay khiến cuộc sống của một lập trình viên trở nên rất dễ dàng. Bất cứ khi nào chúng ta đang triển khai một giao diện, khái niệm khối bên trong ẩn danh sẽ xuất hiện. Khái niệm tạo một đối tượng của giao diện sử dụng tham chiếu đối tượng thời gian chạy được gọi là lớp ẩn danh. Trong ví dụ sau, chúng ta sẽ tạo một giao diện và chúng ta sẽ tạo một đối tượng của giao diện đó bằng cách sử dụng cơ chế lớp Anonymous Inner.
fun main(args: Array<String>) {
var programmer :Human = object:Human // creating an instance of the interface {
override fun think() { // overriding the think method
print("I am an example of Anonymous Inner Class ")
}
}
programmer.think()
}
interface Human {
fun think()
}
Đoạn mã trên sẽ mang lại kết quả sau trong trình duyệt.
I am an example of Anonymous Inner Class
Nhập bí danh
Bí danh kiểu là một thuộc tính của trình biên dịch Kotlin. Nó cung cấp sự linh hoạt trong việc tạo tên mới của một kiểu hiện có, nó không tạo ra một kiểu mới. Nếu tên loại quá dài, bạn có thể dễ dàng giới thiệu tên ngắn hơn và sử dụng tên tương tự để sử dụng trong tương lai. Loại bí danh thực sự hữu ích cho loại phức tạp. Trong phiên bản mới nhất, Kotlin đã thu hồi hỗ trợ cho các bí danh loại, tuy nhiên, nếu bạn đang sử dụng phiên bản cũ của Kotlin, bạn có thể sử dụng nó như sau:
typealias NodeSet = Set<Network.Node>
typealias FileTable<K> = MutableMap<K, MutableList<File>>