1. 前言
有时候我们想要创建一个对当前类有一点小修改的对象,但是不想重新声明一个子类。java用匿名内部类的概念解决这个问题。Kotlin用对象表达式和对象声明巧妙的实现了这一概念。
2.java实现
/**
* Created by maozonghong
* on 2021/2/26
*/
class MyClass {
public String name;
public MyClass(String name){
this.name=name;
}
public void verify(){
System.out.println("verify");
}
}
public class ObjectExpression {
public static void process(MyClass obj){
obj.verify();
}
public static void main(String[] args){
process(new MyClass("Mao"){
@Override
public void verify() {
System.out.println("object verify");
}
});
}
}
输入如下:
object verify
3.Kotlin实现
Kotlin中的对象是为了代替Java中的匿名类
3.1 基本使用
如果父类有构造函数,则必须传递相应的构造函数。多个父类可以用逗号隔开,跟在冒号后面。
open class KotlinClass (var name:String){
open fun verify(){
println("verify")
}
}
interface MyInterface {
fun closeData(){
println("close data")
}
}
open class ObjectExpression {
companion object{
fun process(obj:KotlinClass){
obj.verify()
if(obj is MyInterface){
obj.closeData()
}
}
@JvmStatic
fun main(args: Array<String>) {
process(object:KotlinClass("Mao"),MyInterface{
override fun verify() {
println("object verify")
}
})
foo()
}
//直接建立对象
fun foo(){
val obj=object{
var x:Int=10
var y:Int=20
}
println(obj.x+obj.y)
}
}
}
输出如下:
object verify
close data
30
Process finished with exit code 0
3.2 没有父类的对象
有时候我们只是需要一个没有父类的对象,我们可以这样写:
val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)
3.3 访问封闭域内的对象
像 java 的匿名内部类一样,对象表达式可以访问闭合范围内的变量 (和 java 不一样的是,这些变量不用是 final 修饰的)
fun countClicks(windows: JComponent) {
var clickCount = 0
var enterCount = 0
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
clickCount++
}
override fun mouseEntered(e: MouseEvent){
enterCount++
}
})
}
网友评论