首页 > 其他分享 >Kotlin-嵌套类_内部类_匿名内部类

Kotlin-嵌套类_内部类_匿名内部类

时间:2023-11-03 18:12:45浏览次数:37  
标签:Outer 内部 Kotlin 嵌套 Inner fun bar foo class

Kotlin-嵌套类&内部类&匿名内部类

1. 嵌套类

类可以被嵌套在其它类中:

class Outer {
    private val bar: Int = 1

    class Nested {
        fun foo() {
            println("foo in Outer#Nested#foo() ")
        }

        fun test() {
            // println("Nested: bar value: $bar") // 报错:Unresolved reference: bar
        }
    }
}


fun main() {
    Outer.Nested().foo()
}

运行:

foo in Outer#Nested#foo() 

注意:嵌套类不能访问外部类的成员变量,方法test()是无法执行的,编译器会报错:Unresolved reference: bar

您还可以使用带有嵌套的接口。类和接口的所有组合都是可能的:您可以在类中嵌套接口、在接口中嵌套类、以及在接口中嵌套接口。

interface OuterInterface {
    class InnerClass
    interface InnerInterface
}

class OuterClass {
    class InnerClass
    interface InnerInterface
}

上述语法结构在kotlin中都是允许的。

2. 内部类 inner class

class Outer {
    private val bar: Int = 1

    class Nested {
        fun foo() {
            println("foo in Outer#Nested#foo() ")
        }

        fun test() {
            // println("Nested: bar value: $bar") // 报错:Unresolved reference: bar
        }
    }

    inner class Inner {
        fun foo() {
            println("foo in Outer#Inner#foo() ")
        }

        fun test() {
            println("Inner: bar value: $bar")
        }

        fun test2() {
            val outer = this@Outer // 获取外部类的引用
            println("outer: $outer")
        }
    }
}


fun main() {
    Outer.Nested().foo()
    Outer().Inner().foo()
    Outer().Inner().test()
    Outer().Inner().test2()
}

运行:

foo in Outer#Nested#foo() 
foo in Outer#Inner#foo() 
Inner: bar value: 1
outer: com.yongdaimi.kotlin.Outer@2503dbd3

kotlin中的内部类使用 inner class 关键字来修饰,内部类是可以访问外部类的成员的(包括成员函数和成员属性),如 Outer().Inner().test()方法,且内部类也可以获取外部类的引用,使用 this@外部类名的语法,

注意:调用内部类方法时,不能使用 Outer.Inner().foo()的语法:

image-20231103175101085

外部类必须加上括号。

3. 匿名内部类

匿名内部类使用object 表达式创建,即:object: 类名()的形式:

package com.yongdaimi.kotlin

class Outer {
    private val bar: Int = 1

    class Nested {
        fun foo() {
            println("foo in Outer#Nested#foo() ")
        }

        fun test() {
            // println("Nested: bar value: $bar") // 报错:Unresolved reference: bar
        }
    }

    inner class Inner {
        fun foo() {
            println("foo in Outer#Inner#foo() ")
        }

        fun test() {
            println("Inner: bar value: $bar")
        }

        fun test2() {
            val outer = this@Outer // 获取外部类的引用
            println("outer: $outer")
        }
    }

    abstract class BaseAdapter {
        abstract fun getPosition(position: Int)
    }

    fun setAdapter(adapter: BaseAdapter) {

    }
}


fun main() {
    Outer.Nested().foo()
    Outer().Inner().foo()
    Outer().Inner().test()
    Outer().Inner().test2()

    val outer = Outer()
    outer.setAdapter(object : Outer.BaseAdapter() {
        override fun getPosition(position: Int) {

        }
    })
}

上文的 object : Outer.BaseAdapter() 就是一个匿名内部类。

标签:Outer,内部,Kotlin,嵌套,Inner,fun,bar,foo,class
From: https://www.cnblogs.com/yongdaimi/p/17808138.html

相关文章

  • Kotlin语言基础入门到熟悉:Lambda 表达式
    什么是Lambda表达式?Lambda表达式,其实就是匿名函数。而函数其实就是功能(function),匿名函数,就是匿名的功能代码了。在Kotlin当中,函数也是作为类型的一种出现的,尽管在当前的版本中,函数类型的灵活性还不如Python这样的语言,不过它也是可以被赋值和传递的,这主要就体现在Lambda表......
  • 深入Hystrix执行时内部原理
    Hystrix最基本的支持高可用的技术:资源隔离+限流。创建command;执行这个command;配置这个command对应的group和线程池。开始执行command,调用了这个command的execute()方法之后,Hystrix底层的执行流程和步骤以及原理是什么。步骤一:创建command一个HystrixCommand或HystrixObservableCo......
  • Springboot Cache @Cacheable 类内部调用时不生效,解决办法
    出现问题的原因:Springcache的实现原理是基于AOP的动态代理实现的:即都在方法调用前后去获取方法的名称、参数、返回值,然后根据方法名称、参数生成缓存的key(自定义的key例外),进行缓存。this调用不是代理对象的调用,所以aop失效,注解失效。解决办法就是,我们获取当前Bean,由它来调......
  • 加入事务和嵌套事务
    加入事务和嵌套事务是事务处理中的两个概念。加入事务是指在一个已经存在的事务中,开启一个新的事务,新的事务会成为已有事务的子事务。在加入事务的情况下,如果主事务回滚,那么子事务也会回滚,如果子事务回滚,则只会影响到子事务本身,不会影响到主事务。嵌套事务是指在一个已经存在的事......
  • Kotlin语言基础入门:Kotlin的常用写法
    Kotlin的常用写法1.方法参数的默认值可以给方法的参数指定默认值funsomeFunction(a:Int=0,b:String=""){/*方法实现*/}2.过滤列表找出列表中满足某个条件的所有元素。使用filter方法。其中x是自己定义的参数名。vallist=Arrays.asList(1,2,3,4,5,6,7)val......
  • Python中的字典的循环和嵌套
     字典进阶操作--循环和嵌套dic={"赵四":"特别能歪嘴","刘能":"老,老四啊...","大脚":"跟这个和那个搞对象","大脑袋":"瞎折腾....",}1.可以用for循环,直接拿到keyforkeyindic:print(key,dic[key])......
  • 双层while嵌套循环导致 500internal server error
    在编写从文本文件中提取有用信息的过程中,使用到了双层while嵌套循环(其实内循环就是8,9次数据处理,时间复杂度并不高,为O(n))。奇怪现象:第一次进入内层while循环,函数会成功执行,但是不能正确退出,且浏览器页面不显示任何内容,只是一个劲儿地转圈圈,随后(大约6,7秒钟之后,会出现:500internals......
  • FreeRTOS深入教程(队列内部机制和源码分析)
    (文章目录)前言本篇文章主要来为大家分析队列的内部机制和源码实现。一、队列结构体分析在FreeRTOS中队列会使用一个结构体来表示:1.int8_t*pcHead和int8_t*pcWriteTo:这些指针指向队列存储区的头部和下一个可写入的位置。队列存储区是一个用于存储队列中数据项的缓冲......
  • Java流程控制_03死循环、循环嵌套
    1、死循环 2、循环嵌套 ......
  • java for循环内部使用线程
    /***1、业务场景* 1、定时执行时,可能出现数据量大,执行不完,线程直接被终止掉,丢数据。*/importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;/***1、首先创建线程池,针对线程池开......