Kotlin内部类

简介: 一、内部类: 定义在类内部的类 与类成员有相似的访问控制 kotlin 默认是静态内部类,非静态用inner关键字 this@outter,this@inner的用法二、匿名内部类 没有定义名字的内部类 类名编译时生产,类似Outter$1.

一、内部类:
定义在类内部的类
与类成员有相似的访问控制
kotlin 默认是静态内部类,非静态用inner关键字
this@outter,this@inner的用法

二、匿名内部类
没有定义名字的内部类
类名编译时生产,类似Outter$1.class

三、看一下Java中的内部类

package net.println.kotlin.chapter4.innerClass;

/**
 * @author:wangdong
 * @description:Java中的内部类
 */
/**外部内*/
public class InnerClassJava {

    private int a;

    //静态内部类和非静态内部类的区别
    //非静态内部类,持有外部类的状态的
    public class Inner{
        public void hello(){
            //可以访问到外部类的成员变量
            System.out.println(a);
            System.out.println(InnerClassJava.this.a);
        }
    }
    //静态内部类
    public static class StaticInner{
        public void hello(){
            //不能访问外部类的成员变量
            //System.out.println(a);
        }
    }

    public static void main(String[] args) {
        //如果要实例化非静态内部类Inner
        //Inner inner = new Inner();  //这样肯定是不行的
        //如果是静态内部类就可以随便new了
        //Inner inner = new Inner();


        //首先要实例化外部类
        InnerClassJava innerClassJava = new InnerClassJava();
        //再用外部类的实例去new内部类
        Inner inner = innerClassJava.new Inner();

        //在Java里面写一个匿名内部类
        View view = new View();
        //在java中,匿名内部类就能继承一个类,不能实现接口
        view.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick() {

            }
        });
    }
}

四、看一下Kotlin中的内部类

package net.println.kotlin.chapter4.innerClass
/**
 * @author:wangdong
 * @description:
 */
/**外部类*/
open class Outter{

    val a: Int = 0
    //默认静态内部类
    //不能访问外部类的成员变量
    class StaticInner{
        fun hello(){
            //println(a)
        }
    }

    //非静态内部类,关键字inner
    //可以访问外部类的成员变量
    inner class Inner{
        fun hello(){
            println(a)
            println(this@Outter.a)
        }
    }
}

/**定义一个点击监听的接口*/
interface OnClickListener{
    fun onClick()
}

/**定义一个View类*/
class View{
    //可变的
    var onClickListener: OnClickListener ?= null
}
fun main(args: Array<String>) {
    //静态内部类实例化
    val staticInner = Outter.StaticInner()
    //非静态内部类实例化
    val inner = Outter().Inner()

    //注册view
    val view = View()
    //这边涉及到一个匿名内部类,就是没有名字的内部类,继承一下Outter类
    //kotlin中匿名内部类,就和普通的类一样,可以继承一个类,实现多个接口
    view.onClickListener = object: Outter(),OnClickListener{
        override fun onClick() {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }
    }
}
目录
相关文章
|
3天前
|
Java Kotlin
Kotlin - 内部类
Kotlin - 内部类
|
21天前
|
Java Kotlin
Kotlin教程笔记(19) - 内部类
Kotlin教程笔记(19) - 内部类
|
1月前
|
Java Kotlin
Kotlin教程笔记(19) - 内部类
Kotlin教程笔记(19) - 内部类
28 1
|
28天前
|
Java 开发者 Kotlin
Kotlin教程笔记(19) - 内部类
本教程笔记详细讲解了Kotlin中的内部类,包括静态和非静态内部类的区别、使用方法及匿名内部类的应用。适合希望深入了解Kotlin内部类机制的开发者。
23 0
|
5月前
|
存储 Java Kotlin
Kotlin中的嵌套类、内部类、枚举类、密封类、数据类、单例类、伴生对象
Kotlin中的嵌套类、内部类、枚举类、密封类、数据类、单例类、伴生对象
|
Java Android开发 图形学
Android修行手册之Kotlin-【Get和Set】、【继承】、【抽象类/嵌套类/内部类】篇
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
790 0
|
25天前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
17 1
|
2月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
73 1
|
3月前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
59 4
|
4月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
144 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?