Kotlin基礎<二>
類和屬性
就從JavaBean開始講起吧。讓我們看看在Java當中,JavaBean Person class
是如何書寫代碼的:
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
在Java中,構造器裏面通常是給其字段賦值,然後有一個getter或者setter方法亦或者二者都有。而在Kotlin中:
class Person(val name: String)
只需要這麼一句就可以了。是不是很簡潔呢?你也許會奇怪修飾符public
怎麼不見了,沒錯,這也是Kotlin的特性之一,在Kotlin中,默認的訪問權限就是public
,因此,在這裏並不需要顯式指定public
。
Kotlin幫你搞定了很多事情,比如生成一個getter或者還有一個setter。爲什麼這麼說呢?我們來看一段Kotlin代碼:
class Person(val name: String, var isMan: Boolean)
屬性name
是用val
聲明的,kotlin編譯器會自動爲其生成一個getter方法,而屬性isMan
是用var
聲明的,所以會同時生成getter和setter方法。
他們的用法在kotlin和Java中也是不太一樣的:
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static void main(String...args) {
Person person = new Person("crazypandas");
System.out.println(person.getName());
}
}
//result:
//crazypandas
而在kotlin中是這樣的:
class Person(val name: String)
fun main(vararg args: String) {
val person = Person("crazypandas")//<1>
println(person.name) //<2>
}
//result:
//crazypandas
- <1>你調用了構造器,而且沒有使用
new
關鍵字 - <2>你調用了getter方法並且訪問到了它的值
是不是覺得很神奇?同樣的邏輯代碼,卻簡潔了不少,終於不用整天成噸成噸的寫代碼了。同樣的,如果屬性是var
的話,你可以直接賦值(實質上kotlin編譯器會自動幫你調用setter),例如你有一個person對象,對象有個屬性是isMan:person.isMan = true
。
那麼在kotlin中能否自定義getter和setter呢?當然可以!請看下面代碼:
class Rectangle(val width: Int, val height: Int) {
val isSquare: Boolean
get() { //<1>
return width == height
}
}
fun main(vararg args: String) {
val rectangle = Rectangle(10, 10)
println(rectangle.isSquare)
}
//result
//true
<1>:屬性isSquare的getter聲明
你甚至還可以這麼幹:
class Rectangle(val width: Int, val height: Int) {
val isSquare: Boolean
get() = width == height
}
這也是可以的。
package聲明和import包
在kotlin中,package聲明和import包和Java沒有任何區別(package其實還是有一點區別的,下面會提到),因爲Kotlin和Java百分百兼容,因此,你可以在kotlin中import Java的類庫來使用。
Java和Kotlin的代碼文件
衆所周知,在Java中,類名必須和.Java
文件相同,而在Kotlin中沒有這個限制。在kotlin中,同一個文件可以寫很多個類,並且名字可以是任意的。
在kotlin中,package其實並不完全等價於Java,在Java中,package和文件夾路徑一致,在kotlin中,package 不等價於文件夾路徑,這點是需要注意的。