笔记:学习Kotlin——类属性

Kotlin是一个不折不扣的面向对象编程语言。也有类,对象,方法,属性等我们在面向对象编程中所耳熟能详的术语。

于是我们首先来看Kotlin的类结构:

上面的代码定义了一个类IamClassA,它有一个主构造方法,包含2个参数a: Intb: String。并且这两个参数也叫做类的属性。其中a拥有一个默认值,即实例化对象时,可以不用传递a的值()。IamClassA还有4个属性:field0,field1,fieldA,fieldB。

field0:字符串类型,在声明属性时在类型后面加?代表该属性允许为null。其余字段不允许为null所以必须初始化非null值。但是似乎fieldA并没有被初始化呢。当然不是,它在init{}里被初始化了,这个init{}里的代码也被视为构造方法的一部分。

刚刚提到了主构造方法,在这里说明一下,Kotlin的构造方法分为两种,一种是主构造方法,一种是第二构造方法。主构造方法 在类被实例化后一定会被调用。第二构造方法 是看实际情况调用的。

上面的代码中,(var a: Int, val b: String)和init{}块被视为主构造方法。constructor(c: Int)和constructor()被视为第二构造方法,需要注意的是,第二构造方法需要直接或间接的最终调用到主构造方法。上面的代码中constructor()调用了constructor(c: Int),而constructor(c: Int)调用了主构造方法。也就是说你无论通过哪个构造方法实例化对象,最终主构造都会被调用。这样的机制保证了所有类属性一定会被初始化。

所以var ica = IamClassA()(Kotlin中实例化对象不需要new关键字),便会在控制台输出:

需要说一点,Kotlin在主构造方法(除了init{}块)初始化的属性是对外部可视的,kotlin会自动为这些属性生成外部可访问的getter和setter,并且,只有在java中调用时会需要getter和setter,如果是在Kotlin中,则可以直接访问属性。最后在init{}块中可以为private属性做初始化。

OK,今天就讲到这里。

慢着!

谁?怎么回事?

上文说到了只有在java中调用时会需要getter和setter,java可以调用Kotlin?

啊,没错,首先,Kotlin和Java都是JVM语言,其次Kotlin出生就是为java库做一个高级封装,它语言里的大多特性都是间接调用了java库(没错,Kotlin也能直接调用Java)。说到这里就不得不说Scala的特点,Scala就很少依赖java库,而是自己弄了一套API,所以scala程序通常需要额外包含一个比较大的库。
另外,为了方便的编写Kotlin程序或是Kotlin,Java混合程序,使用IntellijIdea或是Android Studio集成开发环境是十分推荐的。


让我们看第二个例子(喂,刚刚不是说结束了吗!):

Kotlin中,类属性可以自定义getter和setter,并且setter的可访问性可以低于属性的可访问性(如上述程序的属性fieldB),这就可以生成一个只读属性
在自定义getter中,必须用field关键字替代该属性的名字,否则会产生无限get最后导致栈溢出
眼尖的读者一定发现了上述程序有个看起来不妥地方,那就是v.substring(0, 1) == “a”,为什么用==而不是equals()方法?那是因为在Kotlin中==在Kotlin中等价于equals(),而===才是其他语言中常用的==。也就是说在Kotlin中,==是结构相等(Structural equality),===是引用相等(Referential equality)

最后贴出上述程序的控制台输出:

OK,这下真的要结束了,让我们下次继续~

You may also like...

1 Response

  1. 说道:

    感觉就是ts的翻版

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.