刚开始自学Kotlin,因为和Java很像,基础部分还是比较容易理解的,但是Kotlin有自己的特性。
在Kotlin里面我们发现没有静态变量和方法的说法,习惯了Java中使用静态方法还真有点不适应。
开始在网上查找资料时大多会说使用伴生对象的方法来模拟静态。后来在官方文档中发现其实这种方式不是最好的实现方法。
那首先看下在Java中静态方法和静态变量的使用方式:
public class StaticDemo {
public static int number = 1;
public static int getId(){
return 2;
}
}
使用也很简单
public static void main(String[] args){
int number = StaticDemo.number;
int id = StaticDemo.getId();
}
那Kotlin中的写法呢?
我们使用伴生对象的方式看下:
class KtStatic {
var number1 = 10
fun getId1():Int{
return 11
}
//伴生对象
companion object{
var number2 = 20
fun getId2():Int{
return 21
}
}
}
在看下在Kotlin中使用和Java中使用有什么不同
//Kotlin中
fun main(args: Array) {
// 不可直接访问number1
// var number1 =KtStatic.number1
// 同样不能直接访问getId1
// var id1 = KtStatic.getId1()
// 使用下面方式看起来和在Java中使用的是一样的
var number2 = KtStatic.number2
var id2 = KtStatic.getId2()
}
Java中使用有了变化
public static void main(String[] args) {
// 不可访问,好理解
// int number1 = KtStatic.number1;
// 也不可访问,
// int number2 = KtStatic.number2;
// 正确访问方式,意外吧,呵呵
int number = KtStatic.Companion.getNumber2();
int id = KtStatic.Companion.getId2();
}
这种方法实际Companion相当于内部类
那么下面来说另一种写法:
package com.yiifox.demo
var number = 1
fun getId():Int{
return 2
}
//方便知道我写的文件名
class Kt2Static
Kotlin中使用
package com.yiifox.demo.test
import com.yiifox.demo.KtStatic
import com.yiifox.demo.getId
import com.yiifox.demo.number
fun main(args: Array) {
// 使用很简单,但是要注意导包
var number2 = number
var id = getId()
}
那么在Java中呢?
public static void main(String[] args) {
// 注意,原来写的类名是Kt2Static,使用时却多了个尾巴Kt
int number = Kt2StaticKt.getNumber();
int id = Kt2StaticKt.getId();
}
这种就是比较符合我们的使用了。
关于在Kotlin中明明定义的是
var number = 1
Java中却使用的是getNumber();是因为Kotlin在转化为Java时会自动进行get、set包装。