- 如果一个类是工具类,里面全是静态方法,此时我们可以使用对象声明;
- 如果一个类里面有部分静态成员(包括静态变量和方法),此时就可以使用companior object
使用对象声明
/**
* 对象声明
*/
object Utils {
fun getVersion()="1.1.0"
fun getOS():String{
return "linux"
}
}
相当于如下的工具类:
public class Utils{
public static String getVersion(){
return "1.1.0"
}
public static String getOS(){
return "linux"
}
}
/**
* kotlin中对象方法的调用
*/
fun main(args:Array<String>){
println(Utils.getOS())
}
使用伴生对象
伴生对象中的方法可以和外部类中的方法同名,但是他们分属于不同的对象或者类,不属于重载。与Java中不太一样。本身伴生对象和静态方法不同。
/**
* 使用伴生对象
*/
class CompanionDemo {
fun getOS():String{//这个方法属于CompanionDemo类
return "outer method"
}
companion object{
val TYPE:String = "TYPE"
fun getOS():String{//这个方法属于CompanionDemo中Companion类
return "window"
}
}
}
/**
* 测试伴生对象中的方法
*/
fun main(args:Array<String>){
// println(Utils.getOS())
println(CompanionDemo.getOS())//调用伴生对象的方法 ->"window"
print(CompanionDemo.Companion.getOS())//调用伴生对象的方法 ->"window"
println(CompanionDemo().getOS())//调用当前对象方法 ->"outer method"
}
查看调用处的源码
在CompanionDemo
中可以看出,伴生对象中的getOS
与外部类中的getOS
同名但是没有编译错误,在调用的时候也没出现问题。
将Demo文件生成的字节码进行反编译得到如下结果
从图中的对比可以得出结论:类名.伴生对象中的方法(CompanionDemo.getOS()
)省略了中间的Companion
,但是编译器会自动为这种调用添加上中间的Companion。但是他们调用的结果是一致的。