kotlin学习:嵌套类、内部类、对象表达式

2021-03-0311:32:00编程语言入门到精通Comments1,385 views字数 1727阅读模式

嵌套类

一个类可以嵌套在另一个类里面:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

class OuterClass {class NestedClass {funmethod(){println("hello")}}}funmain(){var outerClass = OuterClass.NestedClass()
    outerClass.method()}

内部类

内部类与嵌套类类似,都是声明在另一个类里面,只不过多了一个关键字inner文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

class Outer {var str ="hello"innerclass InnerClass {funmethod(){println(str)println(this@Outer.str)}}}funmain(){var outer =Outer().InnerClass()
    outer.method()}

嵌套类与内部类的区别与联系:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

  • 嵌套类:对应java内部的静态内部类(有static关键字修饰)
  • 内部类:对应java内部的非静态内部类(没有static关键字修饰),可以访问外部类的属性。

局部嵌套类:定义在方法内部的类。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

fungetName(): String {class LocalNestedClass {var name ="morris"}var localNestedClass =LocalNestedClass()return localNestedClass.name
    }

对象表达式

kotlin中的匿名内部类使用对象表达式(object expression:)来创建。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

匿名内部类是没有名字的,需要继承某个父类,或者实现了某个接口:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

interface MyInterface {funprint(i: Int)}funmain(){var myInterface =object: MyInterface {overridefunprint(i: Int){println("print $i")}}

    myInterface.print(1024)}

匿名内部类可以不支持显示的父类,默认为Any。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

var obj =object{funmethod(name: String){println("print $name")}}
obj.method("morris")

匿名内部类可以实现一个父类或多个接口(java只能实现一个)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

interface MyInterface {funprint(i: Int)}abstractclass MyAbstract {abstractval age: Int
    abstractfunmethod(name: String)}funmain(){var myclass =object:MyAbstract(), MyInterface {overridefunprint(i: Int){println("print $i")}overrideval age: Int
            get()=10overridefunmethod(name: String){println("print name=$name age=$age")}}
    myclass.print(1024)
    myclass.method("morris")}

匿名对象只能在局部变量范围内或者被private修饰的成员变量范围内才能真正识别出其具体类型,如果匿名对象作为一个public方法的返回值或者public的属性,那么外部能识别到的只有该匿名对象的父类型,如果没有声明任何父类型,那么就是默认的Any,在这种情况下,匿名对象中声明的任何成员都是无法访问的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

class MyClass {privatevar obj =object{funhello(){println("hello")}}funtest(){
        obj.hello()}}

与java中的匿名内部类不同,kotlin中的内部类可以修改外部的变量,外部的变量也不需要设置为final。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

funmain(){var age =10var obj =object{funhello(){println("print ${++age}")}}
    obj.hello()}

如果接口是一个函数式接口,使用lambda表达式更简洁:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html

val listener = ActionListener {println("clicked")}
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/21001.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/21001.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定