如需轉(zhuǎn)載請評論或簡信幢尚,并注明出處弥锄,未經(jīng)允許不得轉(zhuǎn)載
Kotlin系列導(dǎo)讀
Kotlin學(xué)習(xí)手冊(一)類與繼承
Kotlin學(xué)習(xí)手冊(二)屬性與字段
Kotlin學(xué)習(xí)手冊(三)接口
Kotlin學(xué)習(xí)手冊(四)內(nèi)部類
Kotlin學(xué)習(xí)手冊(五)函數(shù)
Kotlin學(xué)習(xí)手冊(六)數(shù)組與集合
Kotlin學(xué)習(xí)手冊(七)for循環(huán)
Kotlin學(xué)習(xí)手冊(八)內(nèi)聯(lián)函數(shù)let殊者、with、run块饺、apply奕枝、also
Kotlin學(xué)習(xí)手冊(九)空類型安全
Kotlin學(xué)習(xí)手冊(十)帶你真正理解什么是Kotlin協(xié)程
目錄
類
.java
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
.kotlin
class Person {
var name: String? = null
}
構(gòu)造函數(shù)
主構(gòu)造函數(shù)
.java
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
.kotlin
在 Kotlin 中的一個類可以有一個主構(gòu)造函數(shù)以及一個或多個次構(gòu)造函數(shù)(constructor
)
主構(gòu)造函數(shù)是類頭的一部分,它跟在類名后
class Person(var name: String?)
次構(gòu)造函數(shù)(構(gòu)造函數(shù)重載)
.java
public class Person {
private String name;
private String address;
public Person(String name) {
this.name = name;
}
public Person(String name,String address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
.kotlin
類也可以聲明前綴有 constructor
的次構(gòu)造函數(shù)
class Person {
var name: String? = null
var address: String? = null
constructor(name: String) {
this.name = name
}
constructor(name: String, address: String) {
this.name = name
this.address = address
}
}
init代碼塊
.java
public class Person {
private String name;
public Person(String name) {
this.name = name;
//添加代碼
System.out.print("My name is " + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
.kotlin
主構(gòu)造函數(shù)不能包含任何的代碼岸夯。初始化的代碼可以放到以 init 關(guān)鍵字作為前綴的初始化塊中
class Person(var name: String?) {
init {
//主構(gòu)造的參數(shù)(name)可以在初始化塊中使用
print("My name is $name")
}
}
注意:如果同時包含init和次構(gòu)造函數(shù)麻献,init會優(yōu)先于次構(gòu)造函數(shù)執(zhí)行
創(chuàng)建類的實例
.java
Person person = new Person("geekholt");
.kotlin
Kotlin 并沒有 new
關(guān)鍵字
val person = Person("geekholt")
繼承
在 Kotlin 中所有類都有一個共同的超類 Any
,這對于沒有超類型聲明的類是默認超類猜扮,類似java中的Object
Any
有三個方法:equals()
勉吻、 hashCode()
與 toString()
。因此旅赢,為所有 Kotlin 類都定義了這些方法
基類只有主構(gòu)造函數(shù)
.java
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Man extends Person {
public Man(String name) {
super(name);
}
}
.kotlin
class Man(name: String) : Person(name)
基類只有次構(gòu)造函數(shù)
.java
public class Person {
private String name;
private String address;
public Person(String name) {
this.name = name;
}
public Person(String name, String address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class Man extends Person {
public Man(String name) {
super(name);
}
public Man(String name, String address) {
super(name, address);
}
}
.kotlin
class Man : Person {
constructor(name: String) : super(name) {}
constructor(name: String, address: String) : super(name, address) {}
}
重寫父類方法
.java
public class Person {
public void sayHello() {
}
}
public class Man extends Person {
@Override
public void sayHello() {
System.out.print("Hello");
}
}
.kotlin
kotlin中如果不加open
關(guān)鍵字齿桃,默認類、方法都是final
的煮盼,即不可被重寫短纵。所以對需要進行重寫的方法要加上open
關(guān)鍵字
open class Person {
open fun sayHello() {
}
}
class Man : Person() {
override fun sayHello() {
print("Hello")
}
}
注意:由于基類會優(yōu)先于派生類進行初始化,也就意味著基類構(gòu)造函數(shù)執(zhí)行時僵控,派生類中聲明或覆蓋的屬性都還沒有初始化香到,所以設(shè)計一個基類時,應(yīng)該避免在構(gòu)造函數(shù)报破、屬性初始化器以及 init
塊中使用 open
成員
抽象類
.java
abstract public class Person {
public abstract void sayHello();
}
.kotlin
我們并不需要用 open
標注一個抽象類或者函數(shù)——因為這不言而喻悠就。
abstract class Person {
abstract fun sayHello()
}