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.
        }
    }
}
目录
相关文章
|
12月前
|
安全 Java 编译器
Kotlin | 理解泛型使用
泛型,指的是具体的类型泛化,多用在集合中(如`List`、`Map`),编码时使用符号代替,在使用时再确定具体类型。
123 0
|
Java 开发者 Kotlin
Kotlin中lambda表达式详解
lambda运算时java后面版本引进的,所以实现的仅仅是从形式上简化代码,内部的优化并不是非常出色,而Kotlin一开始就支持函数式编程,使得其lambda表达式具有性能上的优势,同时Kotlin简洁的风格也给lambda表达式进一步简化提供了一个良好的实现方式,下面带大家具体看看他们之间的区别以及如何更好的使用Kotlin的极简化lambda表达式
134 0
Kotlin中lambda表达式详解
|
存储 API Kotlin
Kotlin 之反射详解
Kotlin 之反射详解
Kotlin 之反射详解
|
安全 Java C#
Kotlin 之泛型详解
Kotlin 之泛型详解
|
存储 Java 编译器
Kotlin | 浅谈 Reified 与泛型 的三两事
背景 在业务中,或者要写某个技术组件时,我们无可避免会经常使用到 泛型 ,从而让代码更具复用性与健壮性。 但相应的,由于Java泛型存在 类型擦除 的实现机制,所以某些情况下就会显得力不从心。而在 Kotlin 中,由于最终也会被编译为java字节码,所以无可避免也存在这上述问题🙂。
175 0
|
安全 Java 编译器
kotlin泛型
kotlin泛型
127 0
|
IDE Java 编译器
Kotlin 1.5 新特性:密封接口比密封类强在哪?
Kotlin 1.5 推出了密封接口(Sealed Interface),这与密封类(Sealed Class)有什么区别呢?
343 0
Kotlin 1.5 新特性:密封接口比密封类强在哪?
|
Java Kotlin
【Kotlin】Kotlin 面向对象 ( 类 | 成员变量 | 成员方法 | 封装 | 继承 | 多态 )
【Kotlin】Kotlin 面向对象 ( 类 | 成员变量 | 成员方法 | 封装 | 继承 | 多态 )
105 0
|
Java Kotlin
Kotlin系列之Kotlin与Java语法区别
打印日志 Java System.out.print("Amit Shekhar"); System.out.println("Amit Shekhar"); Kotlin print("Amit Shekhar") println("Ami...
1578 0
|
Kotlin
Kotlin密封类
一、密封类非常简单 package net.println.kotlin.chapter4 import net.println.
1061 0