- Kotlin系列
0.【翻译】Using Kotlin for Android Development
1.Kotlin入门(一):变量的声明和使用
2.Kotlin入门(二):方法的定义和使用
3.Kotlin入门(三):if, when, for, while
4.Kotlin入门(四):null安全(“?”,“?:”,“!!”)
5.Kotlin入门(五):类与继承
6.Kotlin入门(六):内联方法
7.Kotlin入门(七):enum,data,sealed,object
变量声明
-
只读变量
可理解为Java中常量,使用 val 关键字修饰
val a: Int = 1 //在声明的时候直接赋值
val b = 2 // 类型是明确的,变量类型Int可省去
val c: Int // 在声明时没有赋值,变量类型Int不可省去
c = 3 // 只可赋值一次,此后c值不能再变
-
易变变量
可理解为Java中的普通变量,用 var 关键字修饰,与 val 变量的区别是变量的值可变:
var a=0
a=1
a=3
-
成员变量
与Java一样,通过对象.变量名的方式调用:
fun main(args: Array<String>) {
print(Test().property)
}
class Test{
var property="property"
}
-
静态变量
用companion object{}包裹,与Java一样通过类名.变量名的方式调用,关于companion object后面会详细讲解:
fun main(args: Array<String>) {
print(Test.com)
}
class Test{
companion object{
var com="com"
}
}
-
顶级变量
在类的外部声明,可理解为Java中的静态成员变量。
通过包名.变量名的方式来调用
样例:
package a.b.c
var top = "top"
fun main(args: Array<String>) {
print(a.b.c.top)
}
-
静态变量与顶级变量的区别:
通过反编译可以知道,其实他们不在一个类中。
当文件中有顶级变量,编译时会新生成一个[文件名+kt]的类,顶级变量就在其中。
Getters and Setters
我们先定义各种可见性的var类型成员变量:
private var privateField = ""
internal var internalField = ""
protected var protectedField = ""
var publicField = ""
然后反编译看看对应的java代码:
@NotNull
public final String getInternalField$app() {
return this.internalField;
}
public final void setInternalField$app(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.internalField = var1;
}
@NotNull
protected final String getProtectedField() {
return this.protectedField;
}
protected final void setProtectedField(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.protectedField = var1;
}
@NotNull
public final String getPublicField() {
return this.publicField;
}
public final void setPublicField(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.publicField = var1;
}
可知,protected和public会生成对应的setter和getter方法,internal也生成了特殊的对应方法。
所以对于protected和public的成员变量,我们不能自己创建对应的getter和setter方法,如:
var name:String?
fun setName(name:String){}
将会报错:
Platform declaration clash: The following declarations have the same JVM signature (setName(Ljava/lang/String;)V)
-
Visibility Modifiers
对于getter
getter的可见性和变量的可见性相同,无需重复添加修饰符。非要多此一举添加,如果和变量的修饰符不一样,将会报错,如:
var field: String = ""
private get //报错: Getter visibility must be the same as property visibility
-
对于setter
setter的可见性必须小于等于变量自身的可见性,否则报错,如:
private var name=""
public set //error:Setter visibility must be the same or less permissive than property visibility
我们也可以自定义getter和setter方法
- 语法
<var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]
当给变量赋值时会调用setter方法,调用变量得到的是getter中的返回值
样例:
var name: String = "111"
get() {
return "{$field}"
}
set(value) {
field = "[$value]"
}
fun main(args: Array<String>) {
println(name)
name = "222"
print(name)
}
结果:
{111}
{[222]}