kotlin笔记 八 (五)嵌套类和内部类.md

嵌套类

嵌套类、内部类与外部类访问修饰符不同:嵌套类、内部类相当于外部类的成员变量所以除了可以使用private、public、internal还可以使用protected修饰,表示嵌套类、内部类可以在其外部类的子类中被访问;

Kotlin中的嵌套类相当于Java中的静态内部类;Koltlin中取消了"static"关键字,Kotlin类中成员除了嵌套类,其他成员都是非静态成员,(按照java中静态成员不能访问非静态成员的原则),嵌套类不能访问外部类中除其他嵌套类以外的其他任何成员;

嵌套类***相当于外部类的静态成员***,外部类的所有方法、属性、初始化块都可以使用嵌套类来定义变量、创建对象;外部类不能直接访问嵌套类成员,但是可以使用嵌套类对象作为调用者来访问嵌套类成员;

Kotlin中除了嵌套类是静态成员变量外,其他都是实例变量;嵌套类只能访问外部类的其他嵌套类;而外部类所有的方法、属性、初始化块都可以使用嵌套类来定义变量、创建对象;

在接口中可以定义嵌套类,但是不能定义内部类;且只能是public或者private修饰符,如果省略访问修饰符,默认是public

1.1、在外部类以外使用嵌套类

  1. 定义嵌套类变量

    var/val oi:OutClass.InnerClass

  2. 创建嵌套类实例

     OutClass.InnerClass()
    

2、内部类

相当于java中的非静态内部类,使用“inner”关键字修饰;

可以直接访问外部类的私有数据,因为内部类***被当成其外部类实例成员***,同一个类的成员之间可以相互访问,但是***外部类不能访问内部类的实现细节***,如内部类的属性;

2.1 关于内部类方法内变量查找顺序

在内部类方法中使用某个变量时:

  1. 首先,查找该方法内是否存在该名字的局部变量,不存在则执行2
  2. 到该内部类中查找是否存在该名字的属性,不存在,则执行步骤3
  3. 到外部类中查找是否有该名字的属性,不存在,则报错

如果外部类、内部类、方法内存在同名的变量,可以通过“this@类名.属性”来进行限定区分到底调用的是哪个属性

this@Outer(外部类类名).属性名

Kotlin中this使用

  1. 在类方法或属性中,this代表该方法或者属性的对象
  2. 在类的构造器中,this代表该构造器即将返回的对象
  3. 在扩展函数或带接收者的函数字面值中,this表示点(.)左边的接收者
  4. 如果省略this,那么它优先代表包含该this的最内层接收者,并且会自动向外搜索。如果要让this明确引用特定的接收者,可以使用标签限定符,如内部类中:this.name表示引用的内部类name属性,this@OuterClass.name表示的引用的外部类的name属性;name:如果在内部类方法中调用,首先在方法中查找该局部变量,没有就到内部类查找该属性(this.name),没有就像外部类中查找该name属性(this@OuterClass.name)

2.2、在外部类以外使用内部类

  1. 定义内部类变量

    var oi:OutClass.InnerClass

  2. 创建内部类实例

     OutClass().InerClass()
    

3 局部嵌套类

如果把一个嵌套类放在方法或者函数中,则这个嵌套类就是一个局部嵌套类;

作用范围:只在该方法或函数中有效;

访问修饰符:有不能在方法或函数以外使用,因此***不能使用修饰符***

3.1 使用局部嵌套类

局部嵌套类只能在定义该类的方法或者函数中使用(创建实例、调用其方法)

继承局部嵌套类

布局嵌套类只在定义该类的方法或者函数中获得,所以,子类也只能定义在该方法或者函数中

	fun test(){

		open NestedBase{
		
				}

		open NestedSub:Base(){


		}

}
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嵌套内部类非常相似,但在某些情况下,使用嵌套的语法可能更清晰和直观。例如,使用嵌套可以更清楚地表示一个嵌套结构,而内部类则更适合实现接口或封装内部数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值