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明确引用特定的接收者,可以使用标签限定符

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

  1. 定义内部类变量

    var oi:OutClass.InnerClass

  2. 创建内部类实例

     OutClass().InerClass()
    

3 局部嵌套类

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

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

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

3.1 使用局部嵌套类

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

继承局部嵌套类

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

	fun test(){

		open NestedBase{
		
				}

		open NestedSub:Base(){


		}

}

你可能感兴趣的:(Kotlin)