Kotlin专题「十六」:嵌套和内部类

前言:努力想要得到什么东西,其实只要沉着冷静、实事求是,就可以轻易地、神不知鬼不觉地达到目的。而如果过于使劲,闹得太凶,太幼稚,太没有经验,就哭啊,抓啊,拉啊,像一个小孩扯桌布,结果却是一无所获。只不过把桌子上的好东西都扯在地上,永远也得不到了。

一、嵌套类

类可以嵌套在其他类:

    class Outer {
        private val number: Int = 1

        class Nested {
            fun foo() = 2
            //嵌套类不能访问外部了的私有或公有成员
        }
    }

	//调用
	 val nest = Outer.Nested().foo()//nest == 2

调用格式为:外部类.嵌套类().嵌套类方法/属性。

类 Nested 嵌套在类 Outer 内部,称为嵌套类;类 Outer 相对于类 Nested 来说是外部类。嵌套类能通过外部类直接访问,但是不能访问外部了的私有或公有成员。

二、内部类

在 Kotlin 中,只有被 inner 标记的嵌套类才叫内部类,其他在类内部写的类统称为嵌套类。内部类可以访问其他外部类的成员,内部类引用外部类的对象:

    class Outer {
        private val number: Int = 0

		//被 `inner` 标记的嵌套类才叫内部类
        inner class Inner {
            fun foo() = number//内部类可以访问外部类私有成员
        }
    }

    val inner = Outer().Inner().foo()//inner == 0

内部类只能通过外部类实例进行访问,它可以访问外部类成员。调用格式为:外部类().内部类().内部类方法/属性。

三、匿名内部类

我们不再通过显式定义一个父实现的子类来创建对象,而是直接通过父实现来创建一个没有名字的对象,这个对象就是匿名内部类,这里是指接口或者抽象类。匿名内部类实例是使用对象表达式创建的:

   //抽象类
  abstract class MyAdapter {
        open fun mouseClicked() {}//open 修饰,子类可重写
    }

	//调用匿名内部类
	fun test(){
	    object : MyAdapter() {//Kotlin 匿名内部类的写法:object + 冒号":" + 类名
            override fun mouseClicked() {
                println("MyAdapter == mouseClicked")
            }
        }
	}

Kotlin 对于匿名内部类的实现引入了 object 关键字,此关键字并不是 Java 中的 Object 类,相关用法后面会讲解。

注意:在JVM上,如果对象是一个函数式 Java 接口的实例(即一个带有单一抽象方法的 Java 接口),你可以使用一个 lambda表达式来创建它,该表达式前缀为接口的类型:

val listener = View.OnClickListener { println("View.OnClickListener") }

View.OnClickListener 具有单一抽象方法。

四、局部类

Kotlin 中的局部类和 Java 中的局部类一致,即定义在方法(函数)中的类。

    class Outer {
        private val number: Int = 0

        fun memberMethod() {
            class Part {//局部类
                var numPart = number
                var name: String = "Part"

                fun partMethod() {
                    println("我是局部类中的方法")
                }
            }

            val part = Part()
            println("name == $name  |  numPart == " + part.numPart)
            part.partMethod()
        }
    }
    
	//调用
	Outer().memberMethod()

打印数据如下:

name == Kotlin  |  numPart == 0
我是局部类中的方法

局部类只能在定义该局部类的方法中使用。定义在实例方法中的局部类可以访问外部类的所有变量和方法,但不能修改。

源码地址:https://github.com/FollowExcellence/KotlinDemo-master

点关注,不迷路


好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才

我是suming,感谢各位的支持和认可,您的点赞就是我创作的最大动力,我们下篇文章见!

如果本篇博客有任何错误,请批评指教,不胜感激 !

要想成为一个优秀的安卓开发者,这里有必须要掌握的知识架构,一步一步朝着自己的梦想前进!Keep Moving!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值