Kotlin入門(一):變量的聲明和使用



變量聲明

  • 只讀變量
    可理解為Java中常量,使用 val 關(guān)鍵字修飾
val a: Int = 1  //在聲明的時候直接賦值
val b = 2   // 類型是明確的,變量類型Int可省去
val c: Int  // 在聲明時沒有賦值,變量類型Int不可省去
c = 3       // 只可賦值一次,此后c值不能再變
  • 易變變量
    可理解為Java中的普通變量,用 var 關(guān)鍵字修飾,與 val 變量的區(qū)別是變量的值可變:
var a=0
a=1
a=3
  • 成員變量
    與Java一樣,通過對象.變量名的方式調(diào)用:
fun main(args: Array<String>) {
    print(Test().property)
}

class Test{
    var property="property"
}
  • 靜態(tài)變量
    用companion object{}包裹,與Java一樣通過類名.變量名的方式調(diào)用,關(guān)于companion object后面會詳細講解:
fun main(args: Array<String>) {
    print(Test.com)
}

class Test{
    companion object{
        var com="com"
    }
}

  • 頂級變量
    在類的外部聲明,可理解為Java中的靜態(tài)成員變量。
    通過包名.變量名的方式來調(diào)用
    樣例:
package a.b.c
var top = "top"
fun main(args: Array<String>) {
    print(a.b.c.top)
}
  • 靜態(tài)變量與頂級變量的區(qū)別:
    通過反編譯可以知道,其實他們不在一個類中。
    當(dāng)文件中有頂級變量,編譯時會新生成一個[文件名+kt]的類,頂級變量就在其中。

Getters and Setters

我們先定義各種可見性的var類型成員變量:

    private var privateField = ""
    internal var internalField = ""
    protected var protectedField = ""
    var publicField = ""

然后反編譯看看對應(yīng)的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會生成對應(yīng)的setter和getter方法,internal也生成了特殊的對應(yīng)方法。
所以對于protected和public的成員變量,我們不能自己創(chuàng)建對應(yīng)的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的可見性和變量的可見性相同,無需重復(fù)添加修飾符。非要多此一舉添加,如果和變量的修飾符不一樣,將會報錯,如:
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>]

當(dāng)給變量賦值時會調(diào)用setter方法,調(diào)用變量得到的是getter中的返回值
樣例:

var name: String = "111"
    get() {
        return "{$field}"
    }
    set(value) {
        field = "[$value]"
    }

fun main(args: Array<String>) {
    println(name)
    name = "222"
    print(name)
}

結(jié)果:

{111}
{[222]}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的!! 因為Scala是基于Java虛擬機,也就是...
    燈火gg閱讀 3,608評論 1 24
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,692評論 9 118
  • 一、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計...
    子非魚_t_閱讀 4,562評論 1 44
  • 目標:不停追求(卓)、不斷翱翔(菲 ) 雨 放學(xué)練舞蹈 晚上完成了畫 哪個姑娘不喜歡光彩照人? ——沒有,其實我也...
    逆風(fēng)追夢人閱讀 190評論 0 0
  • 一個人的時候, 走走停停, 賞花時想你, 望月時想你, 水中都是你, 仿若你就在我身邊,這感覺就像你不在我身邊,身...
    無涯荒野_閱讀 299評論 2 1

友情鏈接更多精彩內(nèi)容