Object

单例模式

在kotlin中,可以非常简单的通过这个关键词实现一个单例类。他可以实现接口,继承类,也可以用扩展方法去扩展类。
他就是一个非常完美的类的声明方法。

当然,同理的作为一个单例类,他并没有构造方法,也就是如果你使用constructor将会直接导致报错。

如果在java中要调用kotlin中的object对象,他需要通过一个字段INSTANCE来实现,具体实例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//kotlin
open class Student:Child{
fun call(){
println("我会叫")
}
}
object child1:Student(){
val name="abc"
}
//java
public class Test {
public static void main(String[] args) {
child1.INSTANCE.walk();
System.out.println(child1.INSTANCE.getName());
}
}

然后实现结果为-2023-07-12-09-18.png)
乱码暂时不晓得怎么解决。

伴生对象

kotlin并没有静态方法的称谓。所以使用伴生对象。他在大多数情况下可以用来代替java中的static方法。
虽然推荐静态方法使用顶层函数,因为他在编译后会直接编译为static类型。但是某些时候不允许这样操作,比如一个类中的私有类无法通过顶层函数访问到。
-2023-07-14-42-18.png)

1
2
3
4
5
6
7
8
class A{
companion object{
var filed = "字母"
fun call(){
print(filed)
}
}
}

声明伴生对象需要使用companion的关键字,他被声明后,可以通过类名直接使用伴生对象中的方法和属性,而不用创建实例。也可以通过类名调用Companion伴生对象然后实现。本质是一样的,例如:

1
2
A.call()
A.Companion.call()

他们实际是一样的操作。

工厂模式

工厂模式下,会将类的构造器私有化,不允许通过构造器去实现创造实例。而是通过在伴生对象中,通过定义不同含义名字的各种方法,来实现生成实例类。
而且伴生对象不能被继承和重写。

作为一个普通对象的伴生对象,他甚至还可以定义伴生对象的名字,就像实现单例类那用。然后可以通过他的类名和他的伴生对象名去调用这个伴生对象。

如果要使用java去调用kotlin中的伴生类,一定需要通过他的默认名称Companion或者伴生对象名去调用该方法。 或者使用注解@JvmStatic将方法声明为静态方法,用@JvmFiele将属性声明为静态属性。这样的话,java可以直接调用,而不用先调用该伴生对象。

匿名内部类

使用object作为匿名内部类,很好理解。就不再多言。