object修饰类,表示产生类的对象,即单例
object修饰变量,匿名内部类的对象

1.object expression
替代java中的匿名内部类,但是比那个更强大,来证明自己不是没有感情的复制粘贴
1.可以实现多个接口甚至不实现接口
2.访问外部类变量不要求用final修饰

  1. private void Example(Window window){
  2. int i = 0;
  3. window.addMouseListener(new MouseAdapter() {
  4. @Override
  5. public void mouseClicked(MouseEvent e) {
  6. super.mouseClicked(e);
  7. //错误,i必须声明为final的
  8. i++;
  9. }
  10. });
  11. }

2.code

一般形式

interface MyInterface {
    fun myPrint(var1: Int)
}


fun main(args: Array<String>) {
    var myObject = object: MyInterface {
        override fun myPrint(var1: Int) {
            println(var1)
        }
    }
    myObject.myPrint(100)
}

不实现任何接口的

    var myObject2 = object {
        init {
            println("init...")

        }
        var myobject2var1 = "myobject2var1"
        fun myobject2fun() = "myobject2fun"
    }

继承或者实现多个接口的

interface MyInterface {
    fun myPrint(var1: Int)
}

interface  MyInterface2 {
    fun myPrint2()
}

fun main(args: Array<String>) {
    var myObject = object : MyInterface, MyInterface2 {
        override fun myPrint(var1: Int) {
            println(var1)
        }

        override fun myPrint2() {
            TODO("Not yet implemented")
        }
    }
    myObject.myPrint(100)
}

注意
1.1、匿名对象只能在局部变量范围内或者被private修饰的成员变量范围内才能被识别出来其真正的类型,其中“被识别出真正的类型”的含义是指能正常的调用匿名内部类中的方法或成员变量

2、如果将匿名对象当做一个public方法的返回类型或是public属性的类型,那么该方法或是属性的真正类型就是该匿名对象所声明的父类型,如果没有声明任何父类型,那么其类型就是Any;在这处情况下,匿名对象中所声明的任何成员都是无法访问的。
对象表达式 - 图1
https://www.cnblogs.com/webor2006/p/11352421.html