0

Kotlin dễ ẹc - Lớp vs đối tượng: Lớp nested và inner

Lớp nested

  • Một lớp có thể lồng vào lớp khác:

        class Outer {
            private val bar: Int = 1
            class Nested {
                fun foo() = 2
            }
        }
        val demo = Outer.Nested().foo() // == 2
    
  • Không thể truy cập biến thành viên của lớp Outer

    fun foo() = bar // sẽ báo lỗi

  • Có thể dùng interface cùng với lớp nested. Có thể lồng interface trong lớp, lớp trong interface, interface trong interface.

     interface OuterInterface {
         class InnerClass
         interface InnerInterface
     }
     class OuterClass {
         class InnerClass
         interface InnerInterface
     }
    

Lớp inner

  • Một lớp nested được đánh dấu là lớp inner có thể truy cập vào thành phần của lớp outer của lớp đó. Và lớp này chứa tham chiếu đến một đối tượng của một lớp outer.
    class Outer {
        private val bar: Int = 1
        inner class Inner {
            fun foo() = bar
        }
    }
    val demo = Outer().Inner().foo() // == 1
    
  • Lớp inner không cho phép interface.
      class Outer {
          private val bar: Int = 1
          inner class Inner {
              fun foo() = bar
              interface InnerInterface
          }
      }
    
Khi biên dịch sẽ gây lỗi Interface is not allowed here

So sánh nhẹ cái nhỉ

  • Giống nhao: đều được khai báo bên trong lớp outer.

    Lớp nested lớp inner
    Dùng từ khóa class như khai báo lớp bình thường Thêm từ khóa inner trước class
    Cho phép khai báo interface trong lớp nested Không cho phép interface trong lớp inner
    Không truy cập được biến thành viên của lớp outer Truy cập được biến thành viên của lớp outer
    Gọi lớp nested Outer.Nested() Gọi lớp inner Outer().Inner()

Lớp inner ẩn danh

  • Instance của lớp inner ẩn danh được tạo bằng object expression
    window.addMouseListener(object : MouseAdapter() {
    
        override fun mouseClicked(e: MouseEvent) { ... }
    
        override fun mouseEntered(e: MouseEvent) { ... }
    })
    

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí