Kotlin入门(一):变量的声明和使用



变量声明

  • 只读变量
    可理解为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]}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 8,859评论 1 24
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,588评论 9 118
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 9,871评论 1 44
  • 目标:不停追求(卓)、不断翱翔(菲 ) 雨 放学练舞蹈 晚上完成了画 哪个姑娘不喜欢光彩照人? ——没有,其实我也...
    逆风追梦人阅读 1,391评论 0 0
  • 一个人的时候, 走走停停, 赏花时想你, 望月时想你, 水中都是你, 仿若你就在我身边,这感觉就像你不在我身边,身...
    无涯荒野_阅读 1,859评论 2 1

友情链接更多精彩内容