一、顶级属性
顶级属性:将字段放在文件的最顶层,不从属于任何类,属于包内成员
只能用public、internal和private修饰,不能用protected、open、final和abstrast修饰
(1)val修饰
val字段—-kotlin代码
val data = 1 //(默认public)
反编译对应的java代码
private static final int data = 1;
public static final int getData() {
return MyTestKt.data;
}
internal val字段—-kotlin代码
internal val data : Int = 1
反编译对应的java代码
private static final int data = 1;
public static final int getData() {
return MyTestKt.data;
}
private val字段—-kotlin代码
private val data : Int = 1
反编译对应的java代码
private static final int data = 1;//(并没有getter()方法)
(2)var修饰
var字段
var data : Int = 1 //(默认public)
反编译对应的java代码
private static int data;
static {
MyTestKt.data = 1;
}
public static final int getData() {
return MyTestKt.data;
}
public static final void setData2(final int <set-?>) {
MyTestKt.data2 = <set-?>;
}
internal val—-字段
internal val data : Int = 1
反编译对应的java代码
private static int data;
static {
MyTestKt.data = 1;
}
public static final int getData() {
return MyTestKt.data;
}
public static final void setData2(final int <set-?>) {
MyTestKt.data2 = <set-?>;
}
private val—-字段
private val data : Int = 1
反编译对应的java代码
private static int data;
static {
MyTestKt.data = 1;
}//(并没有getter()方法)
(3)const修饰(const只能修饰val)
const字段
const val data : Int = 1
反编译对应的java代码
public static final int data = 1;
internal const—-字段
internal const val data : Int = 1
反编译对应的java代码
public static final int data = 1;
private const—-字段
private const val data : Int = 1
反编译对应的java代码
private static final int data = 1;
总结
对于顶级属性,默认的修饰符是public final,var类型的字段会自动生成getter()、setter()方法,val类型的字段会自动生成getter()方法。加入const的字段相当于java中的public static final字段。
二、类属性
类属性字段的修饰符如下:public|internal|protected|private(四选一,默认为public)和abstract|final|open(三选一,默认为final),var类型的字段会自动生成getter()、setter()方法,val类型的字段会自动生成getter()方法。var字段转为java代码是在构造函数中赋值的,而val字段是之间赋值的。字段前的修饰符在转换为java时,对字段本身的访问权限没有任何影响,都是private的修饰,而是对其getter()、setter()方法的访问权限有影响。
例如
public var data:Int = 2
public val dataVal : Int = 2
在转为java则是
private int data;
private final int dataVal = 2;
public ClassB() {
this.data = 2;
}
public final int getData() {
return this.data;
}
public final void setData(final int <set-?>) {
this.data = <set-?>;
}
public final int getDataVal() {
return this.dataVal;
}
data字段是public var的在转为java后,其字段为private,但其对应的getter()、setter()为public,(若data为private时,不会为其自动生成getter()、setter()方法),而且data的赋值是在构造函数中。
而对于dataVal字段是public val的在转为java后,其字段为private final,但其对应的getter()为public,其直接赋值。