可以看出会生成两个.class字节码文件,内部类的类名是外部类类名$内部类类名 然后对这个两个字节码文件反编译看看javap ?...编译器小哥偷偷的做了一些不可告人的事情,首先,内部类中多了个常量引用,准备指向着外部类,而且又偷偷修改了构造方法。传递一个OutClass类型的参数进去。这样内部类就拿到了外部类的引用。...这个时候我做了个方法的测试呀,我们都知道,内部类使用外部类的属性用过外部类类名.this.属性名,所以我写了个测试方法fun public void fun(){ System.out.println...不过对于这点我还有点要说明,编译器很智能,它会扫描内部类,查看是否调用的外部类的私有属性,只有调用了才会生成对应的acess$xxx方法!...结论 在虚拟机中没有外部类内部类之分都是普通的类,但是编译器会偷偷的做点修改,让内部类中多一个常量引用指向外部类,自动修改内部类构造器,初始化这个常量引用,而外部类通过扫描内部类调用了外部类的那些私有属性
这也是内部类的区别之一,如果要在外部类的非静态方法之外获取某个内部类的对象,需要「具体指明这个对象的类型」:OuterClassName.InnerClassName 二、内外相连 内部类存在于外部类里层...,因此也具有一定特权:内部类可以访问外围对象的所有成员,不需要任何特殊条件,此外,内部类还拥有外部类的所有元素的访问权。...,因此必须使用外部类的对象来创建内部类对象。...普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象,然而,当内部类是static的时候,就意味着: 要创建嵌套类的对象,并不需要其外围类的对象 不能从嵌套类的对象中访问非静态的外围类对象 public...九、为什么要使用内部类?
Java内部类与外部类 错误提示: 没有任何类型 TestThread 的外层实例可访问。...同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。 要注意的是,成员内部类不能含有static的变量和方法。...在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象; 而需要创建内部类对象,可以使用outer.inner obj = outerobj.new inner()...声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。...匿名内部类 有时候我为了免去给内部类命名,便倾向于使用匿名内部类,因为它没有名字。
Java内部类与外部类 错误提示: 没有任何类型 TestThread 的外层实例可访问。...同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。 要注意的是,成员内部类不能含有static的变量和方法。...在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象; 而需要创建内部类对象,可以使用outer.inner obj = outerobj.new inner();...声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。...匿名内部类 有时候我为了免去给内部类命名,便倾向于使用匿名内部类,因为它没有名字。
1.1.1 成员内部类的主要特点是: 可以直接访问外部类的成员,包括私有成员。 成员内部类必须寄存在外部类的实例对象中,所以不能在没有外部类实例的情况下创建内部类的实例。...成员内部类通常用于以下情况: 与外部类有密切关联,需要直接访问外部类的成员。 需要创建多个相互独立的内部类对象,每个内部类对象都有自己的状态,但又共享外部类的数据。...需要注意的是,如果成员内部类不需要访问外部类的成员,可以将其定义为静态内部类,这样可以节省一些内存开销。静态内部类与外部类没有直接的关联,可以独立地创建对象。...例如,如果内部类需要访问外部类的成员,可以使用成员内部类;如果内部类只在某个方法中使用,并且不需要访问外部类的非 final 变量,可以使用局部内部类;如果内部类不依赖外部类的实例,可以使用静态内部类。...匿名内部类只能使用一次,不能在其他地方再次使用。
为什么使用内部类: 增强面向对象的封装,可以把一些不想对外的实现细节封装在内部类中,从而隐藏在外部类之内,限制了其他对象的直接访问。 内部类能提高代码的可读性和可维护性。...实例内部类 实例内部类:没有使用static修饰的内部类,实例内部类属于外部类的对象,不属于外部类本身;可以通过外部类对象来访问。其特点是: 1....在实例化内部类之前,必须存在外部类对象,因为要通过外部类对象创建内部类对象,所以存在内部类对象时,一定存在外部类对象; OutterClass.InnerClass in = new OutterClass...; 局部内部类访问的局部变量必须使用final修饰,在Java 8中是自动隐式加上final,但是依然是常量,值不能被改变; 为什么不推荐使用局部内部类?...然而局部内部类是定义在方法中的,在方法中会创建局部内部类对象,局部内部类对象会去访问局部变量;如果当前方法被销毁,局部内部类对象还在堆内存中,依然持有对局部变量的引用,但是方法被销毁的时候方法中的局部变量却被销毁了
可继承父类,实现多个接口,与Java注意区别. kotlin内部类与java 内部类的区别 java的内部类可以直接访问外部类的成员, kotlin的内部类不能直接访问外部类的成员 必须用inner标记之后才能访问外部类的成员...(非静态内部类持有外部类的引用,而静态内部类无法持有外部类的引用,这是因为静态内部类优先于非实例对象而存在) 内部类和静态内部类的区别: 是否持有外部类的状态(也就是非静态内部类中可以调用 外部类.this...说明kotlin中默认是使用静态static内部类的 println(Outter().a) } } inner class Inner1 {...// println(a)//访问不到 说明kotlin中默认是使用静态static内部类的 println(this@Outter.a)//当内外部类重载相同的属性或方法时...密封类的子类是可数,因为子类只能在父类内部或者和父类处于同一个文件,在其他地方是无法创建子类的。
Kotlin代码声明Runnable对象有四种方式,分别对应不同的业务场景,接下来就依次阐述Runnable对象的四种声明方式: 第一种:内部类 内部类方式是最循规蹈矩的,在代码里先书写一个继承自Runnable...以最常见的计数器为例子,每隔一秒便在界面上显示加一后的计数结果,使用内部类方式进行变化的话,就是以下的Kotlin代码: private val handler = Handler() ...此时的声明代码便从内部类方式变成了匿名内部类方式,采取Kotlin编码的话注意使用关键字object占位,表示这是一个匿名内部类,完整的Kotlin代码如下所示: private val counter...,所以处理器直接运行该实例即可启动任务: handler.post(counter) 内部类与匿名内部类这两种方式,其实内部都拥有类的完整形态,故而它们的run方法允许使用关键字this指代这个人物类...因此,本节的任务对象也可使用类似的写法,只要说明该对象是Runnable类型,则多余的run方法就能如愿去除。
Kotlin: Kotlin 里面已经没有类方法的概念了。?不过,Kotlin 中可以用 object 关键字直接定义一个对象,在类内部,我们可以用 companion 为类声明一个伴生对象。...Kotlin: ?,Kotlin 里面还新增了嵌套类的概念,就是可以直接在类体里面另外一个类,其实就是之前 Java 里面的静态内部类。...这种写法在 Java 里面就是定义内部类,在 Kotlin 里面要定义内部类反而要加上 Inner 关键字。 Swift: Swift 没有内部类的概念。? Kotlin: ?...class DontCreateMe private constructor () { } 类的成员 Kotlin 类可以包含下面这些 构造函数和初始化块 函数 属性 嵌套类和内部类 对象声明 继承 我们用...伴生对象 Kotlin 中可以用 object 关键字直接定义一个对象,在类内部,我们可以用 companion 为类声明一个伴生对象。
如果一个类Inner想要访问外部类Outer的成员,可以在这个类前面添加修饰符 inner。...内部类会带有一个对外部类的对象的引用: package com.easy.kotlin class NestedClassesDemo { class Outer { private...跟普通嵌套类直接使用类名访问的方式区分。 4.8.3 匿名内部类 匿名内部类,就是没有名字的内部类。既然是内部类,那么它自然也是可以访问外部类的变量的。...我们使用对象表达式创建一个匿名内部类实例: class NestedClassesDemo { class AnonymousInnerClassDemo { var isRunning...本章小结 本章我们介绍了Kotlin面向对象编程的特性: 类与构造函数、抽象类与接口、继承与组合等知识,同时介绍了Kotlin中的注解类、枚举类、数据类、嵌套类、内部类、匿名内部类、单例object对象等特性类
*/ /*--------------- 4.1.4 内部类和嵌套类:默认是嵌套类 -------------*/ // Kotlin 的嵌套类不能访问外部类的实例,...*/ // Kotlin 中,内部类的默认行为与我们刚刚描述的是相反的 // 代码清单4.11 在Kotlin中使用嵌套类实现View // class Button4...:改变写法的匿名内部类 -------------------------*/ // 代码清单 4.30 使用匿名对象来实现事件监听器 // window.addMouseListener...嵌套类默认不是内部类。使用 inner 关键字来存储外部类的引用。 sealed 类的子类只能嵌套在自身的声明中(Kotlin 1.1 允许将子类放置在同一文件的任意地方)。...伴生对象(与包级别函数和属性 起)替代了 Java 静态方法和字段定义 伴生对象与其他对象一样,可以实现接口,也可以拥有有扩展函数和属性 对象表达式是 Kotlin 中针对 Java 匿名内部类的替代品
给删了,它依然能取到某个 User 对象的 name: name 那么这个隐式地被应用的 User 对象,就是对这个 name 的访问的 implicit receiver,隐式的 receiver。...嵌套的 implicit receiver this,或者说隐式的 receiver,是可以嵌套的,比如在 Java 里我们可以这么写: 我在这个内部类的里面,想访问内部类和外部类的成员都是可以的,是吧...,我是有内部类和外部类的双重 this 的。...但是需要注意,这个 this 它也不是从空气里蹦出来的:当我们这么声明 block 参数的时候,就只有对 IntMultiplier 类型的对象才能调用它。...不管是使用 Kotlin 现成的函数还是我们自己来实现,Kotlin 允许我们通过这种「指定」的方式来手动安插新的 this 到代码里,而不用非得用内部类才能实现。
3 应该好好注意一下伴生对象 伴生对象通过在类中使用 companion object 来创建,用来替代静态成员,类似于 Java 中的静态内部类。...核心意思是:Kotlin 使用 object 代替 Java 匿名内部类实现。 很明显,即便如此,这里的访问应该也是合情合理的。从匿名内部类中访问成员变量在 Java 语言中是完全允许的。...确实,Java 中静态内部类是不允许访问外部类的成员变量的。但,说好的 object 代替的是 Java 的匿名内部类呢?那这里为啥是静态内部类。...这里一定要注意,如果你只是这样声明了一个object,Kotlin认为你是需要一个静态内部类。而如果你用一个变量去接收object表达式,Kotlin认为你需要一个匿名内部类对象。...讲到这,自然也就知道了 Kotlin 对 object 的三个作用: 简化生成静态内部类 生成匿名内部类对象 生成单例对象 咳咳,说了那么多,到底和 @JvmStatic 和 @JvmField 有啥关系呢
Java的嵌套类允许访问外部类的成员,而Kotlin的嵌套类不允许访问外部类的成员。...,相当于把这个嵌套类作为外部类的静态对象使用。...针对该问题,Kotlin另外增加了关键字inner表示内部,把inner加在嵌套类的class前面,于是嵌套类华丽丽转变为了内部类,这个内部类比起嵌套类的好处,便是能够访问外部类的成员。...所以,Kotlin的内部类就相当于Java的嵌套类,而Kotlin的嵌套类则是加了访问限制的内部类。...,再通过外部类的实例调用内部类的构造函数,也就是把内部类作为外部类的一个成员对象来使用,这与成员属性、成员方法的调用方法类似。
数据类不能继承自任何其他类(但可以实现接口) 3.访问数据类的2种方法 和普通类一样"对象名.数据名" 编译器从主构造函数中声明的属性中导出的成员方法componentN()函数群 data class...嵌套类不能使用外部类的属性和成员 2.内部类 声明一个内部类使用inner关键字。...从声明类上看,继承的两个类单独声明,子类通过(子类:父类)继承父类,而内部类必须声明在外部类里面,并且用关键字inner标记 从访问上看,继承的父类不能直接访问子类,外部类可以通过“外部类().内部类...()”访问内部类,继承的子类能直接访问父类公开的成员属性及方法,而内部类值能通过this@外部类的方式访问外部类的属性和方法 从能否覆盖上看,继承的子类能覆盖父类用open标记的属性和方法,内部类不能覆盖外部类的属性和方法...从定义对象的方法看,继承的子类定义为val/var son = Son(),内部类的定义为 val/var inter = Outer().Inter()
介绍:在Kotlin中类可以包含:构造函数和初始化代码块,函数,属性,内部类,对象声明....但是已经有嵌套类了.为什么还有一个内部类? 因为内部类会带有一个对外部类的对象的引用.所以内部类是可以直接访问外部类的属性和函数....加上@可以告诉编译器当前使用的外部类对象的this....匿名内部类 介绍:使用对象表达式来创建匿名内部类: 实例: class Demo9{ var tt="随便的属性" fun setTT(test:TestInterFace){...内部,在同一个模块下可访问 Kotlin的关键字其实和java之中有很多的相识之处.特别是权限访问修饰符.
“this(context,name)”这句代码在Java中要以“super(context,name)”的形式写在函数体内部,在Kotlin中则以冒号开头补充到输入参数后面,这意味着二级构造函数实际上是从主构造函数派生出来的...四、特殊类 4.1 嵌套类 一个类可以在单独的代码文件中定义,也可以在另一个类内部定义,后一种情况叫作嵌套类,即A类嵌套在B类之中,听起来和Java的嵌套类是一样的,但其实有所差别,Java的嵌套类允许访问外部类的成员...,而Kotlin的嵌套类不允许访问外部类的成员,强行访问则会报错。...4.2 内部类 Kotlin限制了嵌套类不能访问外部类的成员,那还有什么方法可以实现此功能呢?...针对该问题,Kotlin另外增加了关键字inner表示内部,把inner加在嵌套类的class前面,然后嵌套类就变成了内部类,所以Kotlin的内部类就相当于Java的嵌套类,而Kotlin的嵌套类则是加了访问限制的内部类
--- 嵌套类和内部类( Nested and Inner Classes ) Java 当中,最常见的嵌套类分为两种:非静态内部类、静态内部类。Kotlin 当中也有一样的概念。...Kotlin 则恰好相反,在默认情况下,嵌套类变成了静态内部类,而这种情况下的嵌套类是不会持有外部类引用的。只有当我们真正需要访问外部类成员的时候,我们才会加上 inner 关键字。...static void main(String[] args) { // 创建Runnable对象并使用匿名内部类重写run方法 Runnable runnable = new...在 Kotlin 当中,我们会使用 object 关键字来创建匿名内部类。...fun run() } @JvmStatic fun main(args: Array) { // 创建Runnable对象并使用匿名内部类重写
本文将详细介绍 C++ 中内部类的定义、使用场景、访问权限及其与外围类(外部类)的相互作用。 内部类的定义 内部类是在一个类的成员部分定义的另一个类。...,内部类可以直接访问 cout部类的普通成员,内部类需要借助外部类对象访问 } }; }; int A::k = 3; 2.外部类访问内部类的成员:...假如内部类受外部类公有限定符限制,需要通过外部类限定符限定的方式创建内部类对象 假如内部类是受外部私有或保护限定符限制,那么在类外无法创建内部类的对象(如果你不想外部可以创建内部类的对象,就可以这么做)...return 0; } 内部类的使用场景 封装和隐藏实现细节:内部类可以隐藏实现细节,使得外围类的接口更加简洁。...其他地方都用不了 实现辅助类:内部类可以作为外围类的辅助类,用于实现一些具体的功能,而不影响外围类的整体结构。
具有引用关系的class优先存放在同一个dex文件中 方法内联 access方法内联 access方法是JVM为了保证让内部类可以访问外部类的私有成员所生成的。...,Method(内部类创建时会持有外部类引用) 实现步骤: 1.遍历所有method,收集access开头并且AccessFlags为 ACC_STATIC, ACC_SYNTHETIC的方法记录 2....标记其访问的Field将其权限修改成public,删除get方法【风险:如果在混淆中被保留代表可能其他地方会访问,删除后会有风险】。...思路: 分析static,final的常量,过滤用来表示序列化对象版本的 serialVersionUID 字段; 还有反射使用到的字段(一般来说不太会有反射访问 final 类型变量的情况,但这里还是会尝试分析代码中对字段的反射调用...R.class内联 R文件在Application和Module的不同处理 application: 常量消除 R文件内部的Field都是使用static,final修饰的。
领取专属 10元无门槛券
手把手带您无忧上云