接口提供默認(rèn)實(shí)現(xiàn)的方法
以前 Java 中骑冗,我們要是在接口中增加一個(gè)方法,那么所有實(shí)現(xiàn)這個(gè)接口的類都必須要重寫(xiě)這個(gè)方法湾盒,但是在 Kotlin 中我們可以定義一個(gè)帶有方法實(shí)現(xiàn)的接口,那么之前實(shí)現(xiàn)過(guò)該接口的類埋哟,就可以不用實(shí)現(xiàn)這個(gè)新方法钠导。例如:
interface Test {
fun sayHi();
fun code(){
print("coding")
}
}
//實(shí)現(xiàn)接口坐梯,我們可以不實(shí)現(xiàn)接口里已經(jīng)默認(rèn)實(shí)現(xiàn)的方法
class MainActivity : AppCompatActivity(),Test {
override fun sayHi() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
by lazy , lateinit
by lazy:
1.變量必須是引用不變的徽诲,不能通過(guò) var 來(lái)聲明
2.首次調(diào)用時(shí),被賦值烛缔,一旦被賦值馏段,后續(xù)不能更改
3.系統(tǒng)會(huì)默認(rèn)給 lazy 屬性加上同步鎖轩拨,也就 LazyThreadSafetyMode.SYNCHRONIZED,當(dāng)然也可以更改践瓷。
/**
* Locks are used to ensure that only a single thread can initialize the [Lazy] instance.
*/
SYNCHRONIZED,
/**線程并行執(zhí)行
* Initializer function can be called several times on concurrent access to uninitialized [Lazy] instance value,
* but only the first returned value will be used as the value of [Lazy] instance.
*/
PUBLICATION,
/**不做線程保證
* No locks are used to synchronize an access to the [Lazy] instance value; if the instance is accessed from multiple threads, its behavior is undefined.
*
* This mode should not be used unless the [Lazy] instance is guaranteed never to be initialized from more than one thread.
*/
NONE,
多繼承問(wèn)題
1.內(nèi)部類
關(guān)鍵字 inner,因?yàn)閮?nèi)部類可以繼承一個(gè)與外部類無(wú)關(guān)的類
2.使用委托代替多繼承
通過(guò)關(guān)鍵字 by 實(shí)現(xiàn)委托亡蓉,替代多繼承
(類似Java實(shí)現(xiàn)多接口)晕翠,委托是用一個(gè)具體的類去實(shí)現(xiàn)方法的邏輯
data class
簡(jiǎn)化 Java Bean,其中多了 copy,componentN
copy:
看看下面熟悉的代碼,猜猜會(huì)打印什么
Test t1 = new Test("blue");
Test t2 = t1;
t2.setColor("red")
System.out.println(t1.getColor());
//red
理由 t2 引用了 t1砍濒,也就是淺拷貝淋肾,除了基本類型,其他都是只是一個(gè)引用而已爸邢,那么一個(gè)設(shè)置了值另外一個(gè)自然也就更著變了樊卓。
在 koltin 中 copy 是提供了一個(gè)簡(jiǎn)潔的復(fù)制一個(gè)對(duì)象的做法,它也是淺拷貝的一種方式杠河,所以在使用的時(shí)候要主要 數(shù)據(jù)的屬性使用 var 還是 **val碌尔,如果是 可變屬性 **var 的話浇辜,就不能保證會(huì)不會(huì)出現(xiàn)引用更改。
val test = Test("blue")
val test2 = test.copy("red")
componentN
可以理解為類的屬性的值唾戚,N 代表第幾個(gè)值柳洋,比如 component1 就是代表第一個(gè)參數(shù)。作用就是可以將類的屬性賦值給變量叹坦。
看看 Java 代碼:
String test = "say_hi"
String[ ] value= test .split("_")
String valueOne = value[0]
取一個(gè)值要分好幾步熊镣,那么在 Kotlin 中呢
val(valueOne,valueTwo) = test .split("_")
伴生對(duì)象
跟 Java 中的 static 修飾符效果一樣绪囱,全局只有一個(gè)單例毕箍,需要聲明在類的內(nèi)部而柑,相較于 Java 事類中的結(jié)構(gòu)更加清晰
companion object{
//類中的所有靜態(tài)變量和靜態(tài)方法都可以聲明在這里
}
單例:
既然全局只有一個(gè)單例荷逞,那么就可以用做 單例模式來(lái)使用了,單例模式的特點(diǎn),構(gòu)造方法私有涩澡,提供一個(gè)靜態(tài)方法來(lái)創(chuàng)建一個(gè)單例的對(duì)象坠敷,那么結(jié)合 by lazy 我們就可以創(chuàng)建一個(gè)線程安全的單例了:
class Singleton private constructor() {
companion object {
val instance: Singleton by lazy { Singleton() }
}
}
object 表達(dá)式
解決匿名內(nèi)部類的問(wèn)題,例如寫(xiě)的最多的就是 各種監(jiān)聽(tīng)事件了膝迎,用 object 可以讓匿名內(nèi)部類更加的優(yōu)雅
var testClick = object : View.OnClickListener {
override fun onClick(v: View?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
不過(guò)有人會(huì)說(shuō) 使用 lambda 表達(dá)式不是更優(yōu)雅嘛芒涡,確實(shí)费尽,在這種只需要實(shí)現(xiàn)一個(gè)方法的時(shí)候 lambda 會(huì)更優(yōu)雅一點(diǎn)旱幼,但是在有多個(gè)方法的時(shí)候柏卤,為覺(jué)得 object 表達(dá)式的優(yōu)勢(shì)就出來(lái)了
animator.addListener(testAnimator)
var testAnimator = object : Animator.AnimatorListener {
override fun onAnimationRepeat(animation: Animator?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onAnimationEnd(animation: Animator?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onAnimationCancel(animation: Animator?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onAnimationStart(animation: Animator?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
這樣看起來(lái)就很舒服了叹誉。