類與對象之間的關(guān)系
直接進(jìn)入主題。
類:對象的模板
對象:類的實(shí)現(xiàn)
類只有通過(new Instance)對象實(shí)例后才能調(diào)用該類中定義的字段、方法!
通俗理解就是,類表示法律,對象就必須要遵守這個(gè)法律。如果不遵守Exception
以上就是面向?qū)ο笏枷耄?/strong>
在java與kotlin類的定義近乎相同,都是使用關(guān)鍵字是class作為定義類的標(biāo)識符:
<public> class JavaFile{...}
public是可省略的,在java中如果舍去了public那么默認(rèn)標(biāo)識符就是default
然而在kotlin中,如果省去了public那么默認(rèn)的就是public。
*在kotlin中是可以使用java的可見性修飾符的,只不過默認(rèn)是被隱藏的

網(wǎng)上找了一張圖片,大家可以看看。
但是……你以為類的定義僅僅是這樣么?
嘖嘖,太天真了!
在kotlin中,還存在一個(gè)空類的概念:
//定義一個(gè)空類
class Empty
沒錯(cuò),就這樣,沒有類體!
一. 構(gòu)造器
java中我們定義類,通常是這樣的:
public class JavaFile{
private String name;
public JavaFile(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
雖然在kotlin中也有類似的寫法。
class KtFile {
private var name: String = ""
constructor(name: String) {
this.name = name
}
fun getName(): String {
return name
}
fun setName(name: String) {
this.name = name
}
}
但是,一般不這么寫,kotlin之所以有簡潔、高效這一說法,那么我們就來看看簡潔、高效的寫法。
一步一步來!
//這樣寫
class KtFile1{
constructor(name: String) {
var name: String = name
}
}
//這樣寫
class KtFile2(name: String) {
var name: String = name
}
//還能這樣寫
class KtFile3(var name: String) {}
怎么樣?沒想到吧?
來看第三種寫法(最簡寫法),在第三種寫法中,kotlin直接將類當(dāng)做方法來寫,只是修飾符不同,一個(gè)是fun一個(gè)是class
那么既然構(gòu)造器已經(jīng)寫在類名后面了,如果我有一系列初始化操作,該怎么辦呢?
1). init{}
init{}
kotlin中提供了一個(gè)init{}寫法
class KtFile3(var name: String) {
init {
name = "姓名=$name"
}
}
2). 次要構(gòu)造器
同時(shí)kotlin中頁提供了一個(gè)次構(gòu)造器的說法 可以用java中的方法重載來理解
class KtFile3(val name: String) {
constructor (name: String, age:Int) : this(name) {
}
}
如果你聲明了一個(gè)次要構(gòu)造器,那么就需要讓它代理主構(gòu)造器了,也就是上面的:this(name)
3). 私有構(gòu)造器
在java中構(gòu)造器的私有就是直接將private加在構(gòu)造方法上,kotlin中也一樣
class KtFile4 private constructor(){
……
}
這么寫就代表了這是一個(gè)私有構(gòu)造器
二. get、set方法
在java中創(chuàng)建get/set方法很簡單,就如上面所寫
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
在kotlin中其實(shí)已經(jīng)是默認(rèn)了get和set方法,如果需要顯示的寫出來。
class KtFile3(var name: String) {
var age: Int = 0
get() = field
/*get(){
return field
}*/
set(value) {
if (value > 100)
field = 100
else if (value < 1)
field = 1
else
field = value
}
}
使用則是與正常的賦值相同:
fun main(args: Array<String>) {
val k = KtFile("k")
val k2 = KtFile2("k2")
val k3 = KtFile3("k3")
println(k.getName())
println(k2.name)
println(k3.name)
k3.age = 101
println(k3.age)
}
結(jié)果:

*這里之所以會用field代替變量名,是因?yàn)橐坏┦褂迷兞?code>age將會造成無限遞歸。另外就是get和set中并不是不允許有var,只是不能有與該變量相同名稱的var
還有一點(diǎn)值得注意的是如果修飾符是val那么該變量(常量)是沒有set方法的

最后一點(diǎn):get、set方法只能被public修飾

三. 對象的創(chuàng)建
在上面其實(shí)也已經(jīng)寫出來了。
在kotlin中,對象的創(chuàng)建并不需要new關(guān)鍵字
fun main(args: Array<String>) {
val k = KtFile("k")
var k2 = KtFile2("k2")
}
這樣就直接得到一個(gè)對象。
總結(jié)
- kotlin中存在空類體的定義方式
- kotlin中構(gòu)造器可以直接寫成
class 類名 (var 字段1:類型, val 字段2:類型){……}的方式。 - kotlin中允許出現(xiàn)子(次)構(gòu)造器,但是必須代理主構(gòu)造器,關(guān)鍵字
this - kotlin中
get、set方法默認(rèn)隱式,也可以顯示寫在字段下方;引用字段需使用field代替,不能直接使用字段名,會造成死遞歸;以val所修飾的字段不允許有set方法。 - kotlin中對象的創(chuàng)建不需要
new關(guān)鍵字