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

本文详细介绍了Kotlin中的类嵌套,包括外部类与嵌套类的关系,内部类的访问权限,匿名内部类的使用,以及局部类的概念和应用。通过示例展示了各种类的创建和调用方式,强调了它们在访问外部类成员和权限控制方面的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一、嵌套类

类可以嵌套在其他类:

    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!

Kotlin中的嵌套类(Nested Classes)内部类Inner Classes)是非常相似的概念,但有一些细微的区别。以下是对它们的一些基本介绍: 1. **嵌套类(Nested Classes)**:在Kotlin中,嵌套类是一种类,它包含在另一个类的内部。它可以是静态的(static)、非静态的(inner)或者局部的(local)。嵌套类可以从任何访问它的外部类访问字段、方法、构造器嵌套类。这允许一个类的数据可以在嵌套类中被更细粒度地访问控制。 ```kotlin class OuterClass { class NestedClass { // code inside } } ``` 2. **内部类Inner Classes)**:内部类是定义在另一个类内部的类。它可以直接访问外部类的所有成员,包括字段、方法、构造器嵌套类内部类可以包含自己的构造函数,并且可以访问外部类的私有成员。内部类可以嵌套在其他内部类中,形成一个复杂的层次结构。 ```kotlin class OuterClass { inner class InnerClass { // code inside } } ``` 总的来说,内部类在实现接口、继承某个类或封装内部数据结构时特别有用。另一方面,嵌套类提供了一种更灵活的方式来访问外部类的数据方法,即使外部类在不同的包或模块中。 需要注意的是,尽管Kotlin中的嵌套类内部类非常相似,但在某些情况下,使用嵌套类的语法可能更清晰直观。例如,使用嵌套类可以更清楚地表示一个类的嵌套结构,而内部类则更适合实现接口或封装内部数据结构。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值