Kotlin基础 — 嵌套类、内部类

官方文档:Nested and Inner Classes

目录

  1. 嵌套类(静态内部类)
    1. Java版本
    2. Kotlin版本
  2. 内部类 inner (非静态内部类)
    1. Java版本
    2. Kotlin版本
  3. 匿名内部类

嵌套类

  1. Java版本

    public class Outer {
        // 外部类成员变量
        private String name = "Elson";
        //private static String name;//静态成员变量
    
        // 静态(嵌套)内部类
        static class Inner {
    
            public String getName() {
                return name;// 这里会报错,因为无法获取外部类的非静态成员变量
            }
        }
    }
    
    class Main {
        public void main() {
            Outer.Inner inner = new Outer.Inner();
            inner.getName();
        }
    }
  2. Kotlin版本

    class Outer {
        private val name: String = "Elson"
        //嵌套内部类
        class Inner {
            fun getName(): String = name
        }
    }
    
    class Main {
        val inn: Outer.Inner = Outer.Inner()
        inn.getName()
    }

内部类

  1. Java版本

    public class Outer {
        // 外部类成员变量
        private String name = "Elson";
    
        class Inner {
            // 获取外部类成员变量
            public String getName() {
                return name;
            }
        }
    }
    
    class Main {  
        public void main() {
            Outer.Inner inner = new Outer().new Inner();
            inner.getName();//"Elson"
        }
    }
  2. Kotlin版本

    class Outer {
        private val name: String = "Elson"
        //内部类(关键字 inner )
        inner class Inner {
            fun getName(): String = name
        }
    }
    
    class Main {
        val inn: Outer.Inner = Outer().Inner()
        inn.getName()//"Elson"
    }

匿名内部类

Android中常见的匿名内部类就是各种事件的监听

class JokeDetailActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.joke_activity_joke_detail)

        // ctx:扩展属性;
        // 匿名内部类:object:TextWatcher {...}
        EditText(ctx).addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }
        })
    }
}

如果匿名内部类中只有一个抽象方法,可以使用Lambda表达式代替

class Main {
    fun test() {
        // 对应方法一
        setListener {  
            //...
        }

        // 对应方法二:跟Java写法一致
        setListener(object : Listener {
            override fun onClick() {
                //...
            }
        })
    }

    // 方法一:Lambda表达式
    fun setListener(listener: () -> Unit) {}

    // 方法二
    fun setListener(listener: Listener) {}

    interface Listener {
        fun onClick()//单一抽象方法
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值