object修饰类,表示产生类的对象,即单例
object修饰变量,匿名内部类的对象
1.object expression
替代java中的匿名内部类,但是比那个更强大,来证明自己不是没有感情的复制粘贴
1.可以实现多个接口甚至不实现接口
2.访问外部类变量不要求用final修饰
private void Example(Window window){int i = 0;window.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);//错误,i必须声明为final的i++;}});}
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;在这处情况下,匿名对象中所声明的任何成员都是无法访问的。
https://www.cnblogs.com/webor2006/p/11352421.html
