Kotlin中的類
class Main{
}
class Main1 : AppCompatActivity(){
}
class Main2:AppCompatActivity(),View.OnClickListener{
override fun onClick(v: View?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
open class Main3{
}
open class Main4:AppCompatActivity(){
}
open class Main5:AppCompatActivity(),View.OnClickListener{
override fun onClick(v: View?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
上面代碼中我們聲明了五種類的寫法候生。
在Kotlin中定義一個類碟渺,必須使用class關鍵字來修飾(例如Main);
如果這個類有父類則使用 " : " 來代表繼承(例如Main1);
如果有多重繼承或者有接口來實例化則可以直接在后面用逗號來隔開處理泻骤,而無需寫implements來實現接口(例如Main2)闯睹,接口和父類可以沒有先后關系戏羽,先寫接口然后再寫父類也沒有任何的問題;
在kotlin中有一個關鍵字open楼吃,其代表這個類不為final始花。在kotlin中如果類沒有用open進行修飾,那么kotlin會默認這個類是一個被public final修飾的類孩锡。
構造函數
在kotlin中酷宵,如果想在類中寫入構造函數,并且在構造函數中傳遞參數躬窜,那么我們可以只寫在類的后面跟一個括號浇垦,在括號內填寫相應的參數。
class Person (name:String,age:Int){
private var name:String;
private var age:Int;
init {
this.name = name;
this.age = age;
}
}
我們看到荣挨,在Person這個類后面我們用括號括起來了兩個參數男韧。于是這便是向Person類寫入了一個構造函數朴摊,,而當我們想要在構造函數中執(zhí)行一些語句的話,我們便可以使用init這個關鍵字此虑,這個關鍵字中的語句會在我們執(zhí)行構造函數的時候同時執(zhí)行甚纲。在這里我們在init語句中將兩個參數進行賦值操作。
次級構造函數
當我們在寫一個類的時候可能有時候因為功能的不同朦前,會寫很多個構造函數贩疙。在kotlin中次級構造函數需要使用constructor來修飾,并且次級構造函數必須直接或間接的繼承主構造函數况既。
class Student constructor(username: String, age: Int) {
private val username: String = username
private var age: Int = age
private var address: String
private var isMarried: Boolean
init {
this.address = "Beijing"
this.isMarried = false
}
constructor(username: String, age: Int, address: String) :this(username, age) {
this.address = address
}
constructor(username: String, age: Int, address: String, isMarried: Boolean) : this(username, age, address) {
this.isMarried = isMarried
}
}
可以看到在代碼中这溅,我們寫了兩個次級構造函數,并且每個函數后面都直接或間接的繼承了主構造函數棒仍。
訪問修飾符
在kotlin中總共有四種訪問修飾符
private: 代表這個類中的成員是這個類私有的別的類不能進行訪問悲靴。
public: 代表這個類或者其他所有的類都能夠訪問的到。
protected: 代表這個類或者這個類的繼承類都可以訪問這個成員
internal: 此為kotlin中特有的修飾符莫其,其表示在這個模塊內都能訪問到這個對象癞尚,但是對于跨模塊卻不能訪問到。那么什么叫做模塊呢乱陡?在Android常用編輯器Android Studio中我們有時候會通過文件File去新建一個叫做module的浇揩,而這個module就是一個模塊。而被internal修飾的對象憨颠,只能在這個module中訪問胳徽,不能在其他module中訪問。
伴生對象
在Java中我們常常會去使用一些工具類爽彤,對于工具類的編寫养盗,一般都是直接在一個類中用static去修飾這個方法,然后通過類名.方法名直接調用适篙。
public class Utils {
public static boolean isEmpty(String str){
return str.equals("");
}
}
但是在kotlin中是沒有static這個關鍵字的往核,那么在kotlin中該如何處理這種工具類的編寫呢?方法有兩種嚷节,
一種是之前講的聂儒,可以使用 @JvmStatic 來修飾工具類的方法然后直接調用。
object Utils{
@JvmStatic
fun isEmpty(str:String):Boolean {
return str.equals("");
}
}
fun test1(){
Utils.isEmpty("test");
}
另外一種是使用伴生對象來進行修飾硫痰。
class Utils1{
companion object {
fun isEmpty(str:String):Boolean{
return str.equals("");
}
}
}
fun test1(){
Utils1.isEmpty("test");
}
伴生對象必須要在類中進行使用衩婚。用companion object兩個關鍵字進行聲明,后面用一個大括號括起來需要使用的函數碍论,使用的時候直接通過類名.函數名稱即可谅猾。
那么在Java中該如何調用這個kotlin中的伴生對象呢柄慰?其實也非常簡單鳍悠,可以使用類名 + Companion + 函數名即可税娜。
//java代碼
public class Utils {
public void test(){
Utils1.Companion.isEmpty("test");
}
}
實際上,在kotlin中程序會通過Companion這個關鍵字在編譯的時候生成一個靜態(tài)的對象藏研,然后java通過這個靜態(tài)對象去調用Companion對象內部的一些函數敬矩。
編寫單例
在kotlin中編寫單例的方式有兩種,一種是通過object + @JvmStatic的方式來編寫單例蠢挡。而另外一種單例的編寫我們可以使用伴生對象來實現弧岳。
fun test1(){
var get = SingletonDemo.get()
}
class SingletonDemo private constructor() {
companion object {
private var instance: SingletonDemo? = null
get() {
if (field == null) {
field = SingletonDemo()
}
return field
}
@Synchronized
fun get(): SingletonDemo{
return instance!!
}
}
}
看到,我們通過伴生對象來編寫了一個懶漢式的單例模式业踏。然后直接通過伴生對象的函數來獲取到SingletonDemo這個對象禽炬。
數據類——data
data可以說是在kotlin中常用的關鍵字。這個關鍵字一般是用來修飾一個類的勤家,被修飾的這個類自動會生成get()/set()方法腹尖、toString()方法、hashCode()方法伐脖、equals()方法以及copy()方法热幔,而不需要我們再特意去書寫這些常用的方法,大大節(jié)約了我們的書寫成本讼庇。
data class Person1(var name:String){
}
這里需要注意绎巨,被data修飾的類必須至少需要一個構造方法,且里面需要有至少一個參數蠕啄。如果沒有構造方法的類不能被data修飾或者被修飾了會報錯场勤。 這個其實也很好理解,因為被data修飾之后會有se()/get()方法歼跟,所以如果沒有構造方法來傳遞參數却嗡,那么set()/get()方法根本沒有用。另外嘹承,數據類是一個public final類型窗价,被data修飾的類不能再被open去修飾也不能等被繼承,不然程序會報錯叹卷。
如果覺得我的文章能夠幫助到你撼港,也歡迎關注我的微信公眾號「晨雨細曲」,有新技術和知識會推送在這上面骤竹。