美文网首页kotlinkotlin
Kotlin-简约之美-基础篇(一):变量的声明和使用

Kotlin-简约之美-基础篇(一):变量的声明和使用

作者: 门心叼龙 | 来源:发表于2020-02-27 18:53 被阅读0次

@[toc]

变量声明

只读变量

可理解为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]的类,顶级变量就在其中。

变量的getter和setter

我们先定义各种可见性的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)

getter和setter的可见性

  • 对于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]}

相关文章

网友评论

    本文标题:Kotlin-简约之美-基础篇(一):变量的声明和使用

    本文链接:https://www.haomeiwen.com/subject/mevxhhtx.html