Kotlin面向?qū)ο笾R點講解
類和對象
創(chuàng)建一個Person類
open class Person {
/**
* 姓名
*/
var name = ""
/**
* 年齡
*/
var age = 0
/**
* 人的吃飯方法
*/
fun eat() {
print(name + " is eating. He is" + age +"years old.")
}
}
在main函數(shù)中創(chuàng)建Person對象,對字符進行賦值,調(diào)用類中的方法
fun main() {
val p = Person();
p.name = "張三"
p.age = 10
p.eat()
}
注意在Kotlin當中創(chuàng)建對象不需要new關鍵字
繼承和構造函數(shù)
- 繼承是面向?qū)ο蟮囊淮筇匦?/li>
- 在Kotlin中和java不同的是,在Koitlin中任何一個非抽象類都是默認不可以被繼承的,就相當于在java中給一個類加上了final關鍵字
- 因為在一本名為Effective Java中的書明確提到,如果一個類不是專門為了繼承而設計的,那么他就應該加上final聲明,禁止它可以被繼承,這個屬于就是編程規(guī)范了
- 在Kotlin當中的抽象類和java并沒有什么區(qū)別
- 在Kotlin中如果想要一個類可以被繼承,只需要在這個類的前面加上open關鍵字即可
- 如果一個類要繼承一個類的話,在java當中使用的是extends關鍵字,在Kotlin當中使用的是 : 這個關鍵字,而且父類不僅僅要寫出類名還要帶上一對括號
class Student : Person() {
var sno = ""
var grade = 0
}
Kotlin中類的主構造函數(shù)
每個類都會默認有一個不帶參數(shù)的主構造函數(shù),但是我們也可以顯示的給他指定參數(shù),主構造函數(shù)的特點是沒有函數(shù)體,直接定義在類名的后面即可
class Student(val sno: String, val grade: Int) {
}
上面這行代碼就表示Student的主構造函數(shù)有兩個參數(shù),分別是sno和grade
在主構造函數(shù)當中沒有函數(shù)體,那么我們想要在主構造函數(shù)當中編寫一些代碼邏輯也是可以的,我們可以通過init結(jié)構體來進行實現(xiàn)
class Student(val sno: String, val grade: Int) {
init {
println("sno is " + sno)
println("grade is" + grade)
}
}
通過init結(jié)構體就可以擴展的為主構造函數(shù)執(zhí)行一些代碼邏輯
那么子類在繼承父類的時候,為什么父類名后面要跟上一對括號呢,原因是,子類在繼承父類的時候,子類的構造函數(shù)必須調(diào)用父類的構造函數(shù),所以子類的主構造函數(shù)調(diào)用父類的那個構造函數(shù),就是由這個()來進行指定的.
class Student : Person() {
var sno = ""
var grade = 0
}
在這里Person類后面一對空括號表示Student類的主構造函數(shù)在初始化的時候會調(diào)用Person類的無參構造函數(shù)
次構造函數(shù):在Kotlin當中,每一個類只能有一個主構造函數(shù),但是可以有多個次構造函數(shù),次構造函數(shù)也可以實例化一個類,區(qū)別就是主構造函數(shù)沒有函數(shù)體,次構造函數(shù)有函數(shù)體
Kotlin規(guī)定,在一個類當中如果同時存在主構造函數(shù)和次構造函數(shù)的時候,所有的次構造函數(shù)必須調(diào)用主構造函數(shù)(包含間接調(diào)用)
次構造函數(shù)通過construtor關鍵字來進行聲明
class Student(val sno: String, val grade: Int, name: String, age: Int) :
Person(name, age) {
//次構造函數(shù)1:直接調(diào)用本類的主構造函數(shù),這個次構造函數(shù)有兩個參數(shù)分別是nanem和age,然后他在調(diào)用本類的主構造函數(shù)的時候直接實例化了主構造函數(shù)中的sno和grade兩個參數(shù),然后將自己的name和age傳給了調(diào)用了的主構造函數(shù)
constructor(name: String, age: Int) : this("", 0, name, age){
}
//次構造函數(shù)2:不接收任何的參數(shù),然后沒有直接調(diào)用本類的主構造函數(shù),而是調(diào)用了次構造函數(shù)1,相當于間接調(diào)用了本類的主構造函數(shù)
constructor() : this("張三", 18)
}
當Student類通過上述方式編寫之后,我們就可以使用主構造函數(shù)或者此構造函數(shù)對其進行實例化了,那么對Student類進行實例化的方式就有了三種
//使用主構造函數(shù)對Student類進行實例化
val student1 = Student("123", 1, "張三", 18)
//使用次構造函數(shù)1對Student進行實例化
val student2 = Student("張三", 18)
//使用次構造函數(shù)2對Student進行實例化
val student3 = Student()
還有一種比較特殊的情況,類中只包含次構造函數(shù),沒有主構造函數(shù),這種情況雖然少見,但是在Kotlin當中是允許的,當一個類沒有顯示的定義主構造函數(shù)但是定義了次構造函數(shù)的時候,它就是沒有主構造函數(shù)的
class Student : Preson {
constructor(name: String, age: Int) : super(name, age) {
}
}
在上面的代碼中,首先Student類后i按沒有顯示的定義主構造函數(shù),同時又定義了次構造函數(shù),所以Student類是沒有主構造函數(shù)的,因為沒有主構造函數(shù),所以就不牽扯子類的主構造函數(shù)調(diào)用父類的主構造函數(shù)這一說,所以說Person類的后面沒有加()
另外,由于沒有主構造函數(shù),此構造函數(shù)只能直接調(diào)用父類的構造函數(shù),所以在次構造函數(shù)在調(diào)用方法的時候?qū)his關鍵字換成了super關鍵字
接口
Kotlin當中的接口和java當中的接口幾乎完全是一致的,接口是用于多態(tài)編程的重要組成部分,java是單繼承語言,但是可以實現(xiàn)多個接口,Kotlin中也同樣是這樣
定義一Study接口
interface Study {
fun readBooks()
fun doHomeWork()
}
Student實現(xiàn)Study接口
class Student : Person(), Study{
var sno = ""
var grade = 0
override fun readBooks() {
println("讀書")
}
override fun doHomeWork() {
println("做作業(yè)")
}
}
在java當中繼承使用的關鍵字是extends,實現(xiàn)使用的是impls關鍵字,而在Kotlin當中繼承和實現(xiàn)統(tǒng)一使用的是 : ,如果即做了繼承又進行了實現(xiàn),使用,進行隔開
在上面的代碼中,Student實現(xiàn)了Study接口,那么他就必須要實現(xiàn)Study中的兩個方法,在Kotlin當中使用override關鍵字來重寫父類或者實現(xiàn)接口中的方法.
多態(tài)編程的特性
fun main() {
val student = Student()
doStudy(student)
}
fun doStudy(study: Study) {
study.readBooks()
study.doHomeWork()
}
因為Student實現(xiàn)了Study接口,在doStudy方法中,需要傳遞的參數(shù)是Study類型,所以也可以傳遞一個Student的實例
還有一點就是在Kotlin當中可以對接口中的抽象方法進行默認的實現(xiàn)
interface Study {
fun readBooks()
//在Kotlin的接口中可以對方法進行默認實現(xiàn)
fun doHomeWork() {
println("do homework")
}
}
如果接口中的一個函數(shù),擁有了函數(shù)體,這個函數(shù)中的內(nèi)容就是他的默認實現(xiàn),現(xiàn)在一個類去實現(xiàn)Study接口的時候,只會強制要求實現(xiàn)readBooks方法,而doHomeWork方法可以自由選擇進行實現(xiàn),不是先是就會自動使用默認的實現(xiàn)邏輯
訪問修飾符
在java當中的訪問控制符一種有四種:public,private,protected,defaule(什么都不寫)
在Kotlin當中也有四種訪問控制符:public,private,protected和internal,需要使用那種修飾符號的時候直接在fun關鍵字前面進行添加即可
private修飾符在java和Kotlin當中的作用是一摸一樣的,都表示對當前類的內(nèi)部進行可見
public修飾符作用雖然也是一致的,表示對所有的類都可見,但是在java中default是默認項,但是在Kotlin當中public才是默認項
protected關鍵字在java中表示在該類和該類的子類以及同一包中可見,但是在Kotlin當中值表示對該類和子類可見
Kotlin當中拋棄了java中的defualt權限(同一個包路徑下可見)而是引入了一種新的權限internal
internal表示在同一個模塊中的類可見.比如我們開發(fā)一個模塊給別人用,但是有一些函數(shù)只允許在模塊的內(nèi)部進行調(diào)用,不想暴露給外部,那么就可以將這些函數(shù)用internal關鍵字進行修飾
數(shù)據(jù)類和單例
數(shù)據(jù)類通常需要重寫equals,hashCode,toString方法,其中equals方法用于判斷兩個數(shù)據(jù)是否相等,hashCode方法是equals方法的配套方法,toString方法用來打印更為清晰的日志,否則數(shù)據(jù)打印出來就是一串地址
在java當中就要一一的實現(xiàn)這些方法
但是在Kotlin當中,只需要使用date關鍵字就可以解決
data class Cellphone(val brand: String, val price: Int)
在上面這行代碼中,我就定義了一個數(shù)據(jù)類,當一個date關鍵字放在class前面的時候,就表明自己希望這個類是一個數(shù)據(jù)類,Kotlin會根據(jù)主構造函數(shù)中的參數(shù)幫這個類將equals,hashCode,toString方法進行了重寫,另外當一個類中沒有任何代碼時候,類的{}可以進行省略
接下來就是單例類,單例模式是一種基礎的設計模式,當我們在開發(fā)的過程中,希望某個類在全局最多只能有一個實例,這樣就可以使用單例模式,單例模式使用java語言的編寫方式有很多種,雖然簡單,但是在Kotlin中還有更加簡單的方法
在Kotlin當中創(chuàng)建一個單例類十分簡單,只需要將class關鍵字改成object關鍵字即可,在創(chuàng)建類的時候直接選擇object不要選擇class即可
object Singleton {
}現(xiàn)在Singleton就已經(jīng)是一個單例類,我們可以直接在這個類當中編寫需要的函數(shù),比如加上一個singletonTest方法
object Singleton {
fun singletonTest() {
println("this is a singleTon.")
}
}
可以看到在Kotlin當中我們不需要私有化構造函數(shù),也不需要提供getInstance()這樣的靜態(tài)方法,只需要將class關鍵字修改該成為object關鍵字即可
上述代碼在調(diào)用的時候直接使用Singleton.singletonTest()即可,這種寫法看上去像是靜態(tài)方法調(diào)用,但是實際上Kotlin在背后自動幫我們創(chuàng)建了一個Singleton類的實例
到此這篇關于Kotlin面向?qū)ο笾R點講解的文章就介紹到這了,更多相關Kotlin面向?qū)ο髢?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
android studio logcat 無篩選 顯示全部日志 無應用包名區(qū)分方式
這篇文章主要介紹了android studio logcat 無篩選 顯示全部日志 無應用包名區(qū)分方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Android實現(xiàn)在子線程中更新Activity中UI的方法
這篇文章主要介紹了Android實現(xiàn)在子線程中更新Activity中UI的方法,涉及Android線程與activity操作的相關技巧,需要的朋友可以參考下2016-04-04
Android 自定義View實現(xiàn)任意布局的RadioGroup效果
這篇文章主要介紹了Android 自定義View實現(xiàn)任意布局的RadioGroup,需要的朋友可以參考下2018-11-11
Android自定義ViewGroup打造各種風格的SlidingMenu
這篇文章主要介紹了Android自定義ViewGroup打造各種風格的SlidingMenu的相關資料,需要的朋友可以參考下2016-02-02

