欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門教程網(wǎng)!

Android

當(dāng)前位置:主頁(yè) > 軟件編程 > Android >

Kotlin中的對(duì)象表達(dá)式和對(duì)象聲明的具體使用

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:Android|點(diǎn)擊: 次

Kotlin的對(duì)象表達(dá)式與Java中的匿名內(nèi)部類的主要區(qū)別:匿名內(nèi)部類只能指定一個(gè)父類型,但對(duì)象表達(dá)式可以指定0~N個(gè)膚類型。

一、對(duì)象表達(dá)式

對(duì)象表達(dá)式的語(yǔ)法格式如下:

object [: 0~N個(gè)父類型]{
  //對(duì)象表達(dá)式的類體部分
}

對(duì)象表達(dá)式還有如下規(guī)則:

  • 對(duì)象表達(dá)式不能是抽象類,因?yàn)橄到y(tǒng)在創(chuàng)建對(duì)象表達(dá)式時(shí)會(huì)立即創(chuàng)建對(duì)象。因此不允許將對(duì)象表達(dá)式定義成抽象類。
  • 對(duì)象表達(dá)式不能定義構(gòu)造器。但對(duì)象表達(dá)式可以定義初始化塊,可以通過(guò)初始化塊來(lái)完成構(gòu)造器需要完成的事情。
  • 對(duì)象表達(dá)式可以包含內(nèi)部類,不能包含嵌套類。
package `0705`

interface Outputable {
  fun output(msg: String)
}

abstract class Product(var price: Double) {
  abstract val name: String
  abstract fun printInfo()
}

fun main(args: Array<String>) {
  //指定一個(gè)父類型(接口)的對(duì)象表達(dá)式
  var ob1 = object : Outputable {
    override fun output(msg: String) {
      for (i in 1..6) {
        println("<h${i}>${msg}</h${i}>")
      }
    }
  }
  ob1.output("隨便輸出點(diǎn)什么吧")
  println("-----------------------------------------------")
  //指定零個(gè)父類型的對(duì)象表達(dá)式
  var ob2 = object {
    //初始化塊
    init {
      println("初始化塊")
    }

    //屬性
    var name = "Kotlin"

    //方法
    fun test() {
      println("test方法")
    }

    //只能包含內(nèi)部類,不可以包含嵌套類
    inner class Inner
  }
  println(ob2.name)
  ob2.test()
  println("-----------------------------------------------")
  //指定兩個(gè)父類型的對(duì)象表達(dá)式
  var ob3 = object : Outputable, Product(1.23) {
    override fun output(msg: String) {
      println("輸出信息:${msg}")
    }

    override val name: String
      get() = "激光打印機(jī)"

    override fun printInfo() {
      println("高速極光打印機(jī)們支持自動(dòng)雙面打??!")
    }
  }
  println(ob3.name)
  ob3.output("Kotlin慢慢學(xué)")
  ob3.printInfo()
}

輸出結(jié)果:

<h1>隨便輸出點(diǎn)什么吧</h1>
<h2>隨便輸出點(diǎn)什么吧</h2>
<h3>隨便輸出點(diǎn)什么吧</h3>
<h4>隨便輸出點(diǎn)什么吧</h4>
<h5>隨便輸出點(diǎn)什么吧</h5>
<h6>隨便輸出點(diǎn)什么吧</h6>
-----------------------------------------------
初始化塊
Kotlin
test方法
-----------------------------------------------
激光打印機(jī)
輸出信息:Kotlin慢慢學(xué)
高速極光打印機(jī)們支持自動(dòng)雙面打?。?br />

Kotlin的對(duì)象表達(dá)式可分為兩種情形:

  • 對(duì)象表達(dá)式在方法的局部范圍內(nèi),或使用private修飾的對(duì)象表達(dá)式,Kotlin編譯器可識(shí)別對(duì)象表達(dá)式的真實(shí)類型。
  • 非private修飾的對(duì)象表達(dá)式與Java的匿名內(nèi)部類相似,編譯器只會(huì)把對(duì)象表達(dá)式當(dāng)成它所繼承的父類或所實(shí)現(xiàn)的接口處理。如果它沒有父類型,系統(tǒng)當(dāng)它是Any類型。
package `0705`

class ObjectExprType {
  private val ob1 = object {
    val name: String = "Kotlin"
  }
  internal val ob2 = object {
    val name: String = "Kotlin"
  }
  private fun privateBar()=object {
    val name:String="Java"
  }
  fun publicBar()=object {
    val name:String="Java"
  }
  fun test(){
    //ob1是private對(duì)象表達(dá)式,編譯器可識(shí)別它的真實(shí)類型
    println(ob1.name)
    //ob2是非private對(duì)象表達(dá)式,編譯器當(dāng)它是Any類型
//    println(ob2.name)
    //privateBar是private函數(shù),編譯器可識(shí)別它返回的對(duì)象表達(dá)式的真實(shí)類型
    println(privateBar().name)
    //publicBar是非private函數(shù),編譯器將它返回的對(duì)象表達(dá)式當(dāng)成Any類型
//    println(publicBar().name)
  }
}

fun main(args: Array<String>) {
  ObjectExprType().test()
}

輸出結(jié)果:

Kotlin
Java

Kotlin編譯器可以識(shí)別private對(duì)象表達(dá)式的真實(shí)類型。

Kotlin的對(duì)象表達(dá)式可訪問或修飾其作用域內(nèi)的局部變量。

fun main(args: Array<String>) {
  var a = 20
  var obj = object {

    fun change() {
      println("change()方法修改變量a的值")
      a++
    }
  }
  obj.change()
  println(a)
}

輸出結(jié)果:

change()方法修改變量a的值
21

Kotlin的對(duì)象表達(dá)式比Java的匿名內(nèi)部類增強(qiáng)了三個(gè)方面:

  • 對(duì)象表達(dá)式可指定多個(gè)父類型
  • Kotlin編譯器能更準(zhǔn)確地識(shí)別局部范圍內(nèi)private對(duì)象表達(dá)式的類型。
  • 對(duì)象表達(dá)式可訪問或修改其所在范圍內(nèi)的局部變量

二、對(duì)象聲明和單例模式

對(duì)象聲明的語(yǔ)法格式如下:

object ObjectName [: 0~N個(gè)父類型]{
  //對(duì)象表達(dá)式的類體部分
}

對(duì)象聲明與對(duì)象表達(dá)式的語(yǔ)法很相似,區(qū)別在于:對(duì)象表達(dá)式在object關(guān)鍵字后沒有名字;而對(duì)象聲明需要在object關(guān)鍵字后指定名字。

兩者還有如下區(qū)別:

  • 對(duì)象表達(dá)式是一個(gè)表達(dá)式,可以被賦值給變量;而對(duì)象聲明不是表達(dá)式,不能用于賦值。
  • 對(duì)象聲明可包含嵌套類,不能包含內(nèi)部類;而對(duì)象表達(dá)式可包含內(nèi)部類,不能包含嵌套類。
  • 對(duì)象聲明不能定義在函數(shù)和方法內(nèi);但對(duì)象表達(dá)式可嵌套在其他對(duì)象聲明或非內(nèi)部類中。
package `0705`

interface Outputable {
  fun output(msg: String)
}

abstract class Product(var price: Double) {
  abstract val name: String
  abstract fun printInfo()
}

//指定一個(gè)父類型的對(duì)象表達(dá)式
object MyObject1 : Outputable {
  override fun output(msg: String) {
    for (i in 1..6) {
      println("<h${i}>${msg}</h${i}>")
    }
  }
}

//指定零個(gè)父類型的對(duì)象表達(dá)式
object MyObject2 {
  //初始化塊
  init {
    println("初始化塊")
  }

  //屬性
  var name = "Kotlin"

  //方法
  fun test() {
    println("test方法")
  }

  //只能包含嵌套類,不可以包含內(nèi)部類
  class Inner
}

//指定兩個(gè)父類型的對(duì)象表達(dá)式
object MyObject3 : Outputable, Product(1.23) {
  override fun output(msg: String) {
    println("輸出信息:${msg}")
  }

  override val name: String
    get() = "激光打印機(jī)"

  override fun printInfo() {
    println("高速極光打印機(jī)們支持自動(dòng)雙面打??!")
  }
}

fun main(args: Array<String>) {

  MyObject1.output("一起來(lái)學(xué)Kotlin")
  println("-----------------------------------------------")
  println(MyObject2.name)
  MyObject2.test()
  println("-----------------------------------------------")
  println(MyObject3.name)
  MyObject3.output("Kotlin真不錯(cuò)")
  MyObject3.printInfo()
}

輸出結(jié)果:

<h1>一起來(lái)學(xué)Kotlin</h1>
<h2>一起來(lái)學(xué)Kotlin</h2>
<h3>一起來(lái)學(xué)Kotlin</h3>
<h4>一起來(lái)學(xué)Kotlin</h4>
<h5>一起來(lái)學(xué)Kotlin</h5>
<h6>一起來(lái)學(xué)Kotlin</h6>
-----------------------------------------------
初始化塊
Kotlin
test方法
-----------------------------------------------
激光打印機(jī)
輸出信息:Kotlin真不錯(cuò)
高速極光打印機(jī)們支持自動(dòng)雙面打印!

對(duì)象聲明專門用于實(shí)現(xiàn)單例模式,對(duì)象聲明所定義的對(duì)象也就是該類的唯一實(shí)例,程序可通過(guò)對(duì)象聲明的名稱直接訪問該類的唯一實(shí)例。

三、伴生對(duì)象和靜態(tài)成員

在類中定義的對(duì)象聲明,可使用companion修飾,這樣該對(duì)象就變成了伴生對(duì)象。

每個(gè)類最多只能定義一個(gè)伴生對(duì)象,伴生對(duì)象相當(dāng)于外部類的對(duì)象,程序可通過(guò)外部類直接調(diào)用伴生對(duì)象的成員。

package `0705`

interface CompanionTest {
  fun output(msg: String)
}

class MyClass {
  //使用companion修飾的伴生對(duì)象
  companion object MyObject1 : CompanionTest {
    val name = "name屬性值"
    override fun output(msg: String) {
      for (i in 1..6) {
        println("<h${i}>${msg}</h${i}>")
      }
    }
  }
}

fun main(args: Array<String>) {
  //使用伴生對(duì)象所在的類調(diào)用伴生對(duì)象的方法
  MyClass.output("Kotlin必須學(xué)")
  println(MyClass.name)
}

輸出結(jié)果:

<h1>Kotlin必須學(xué)</h1>
<h2>Kotlin必須學(xué)</h2>
<h3>Kotlin必須學(xué)</h3>
<h4>Kotlin必須學(xué)</h4>
<h5>Kotlin必須學(xué)</h5>
<h6>Kotlin必須學(xué)</h6>
name屬性值

伴生對(duì)象的主要作用就是為其所在的外部類模擬靜態(tài)成員,但只是模擬,伴生對(duì)象的成員依然是伴生對(duì)象本身的實(shí)例成員,并不屬于伴生對(duì)象所在的外部類。

四、伴生對(duì)象的擴(kuò)展

伴生對(duì)象也可以被擴(kuò)展。如果一個(gè)類具有伴生對(duì)象,則Kotlin允許為伴生對(duì)象擴(kuò)展方法和屬性。

package `0705`

interface CompanionTest {
  fun output(msg: String)
}

class MyClass {
  //使用companion修飾的伴生對(duì)象
  companion object : CompanionTest {
    val name = "name屬性值"
    override fun output(msg: String) {
      for (i in 1..6) {
        println("<h${i}>${msg}</h${i}>")
      }
    }
  }
}

//為伴生對(duì)象擴(kuò)展方法
fun MyClass.Companion.test() {
  println("為伴生對(duì)象擴(kuò)展的方法")
}

val MyClass.Companion.foo
  get() = "為伴生對(duì)象擴(kuò)展的屬性"

fun main(args: Array<String>) {
  //使用伴生對(duì)象所在的類調(diào)用伴生對(duì)象的方法
  MyClass.output("Kotlin必須學(xué)")
  println(MyClass.name)
  //通過(guò)伴生對(duì)象所在的類調(diào)用為伴生對(duì)象擴(kuò)展的成員
  MyClass.test()
  println(MyClass.foo)

}

輸出結(jié)果:

<h1>Kotlin必須學(xué)</h1>
<h2>Kotlin必須學(xué)</h2>
<h3>Kotlin必須學(xué)</h3>
<h4>Kotlin必須學(xué)</h4>
<h5>Kotlin必須學(xué)</h5>
<h6>Kotlin必須學(xué)</h6>
name屬性值
為伴生對(duì)象擴(kuò)展的方法
為伴生對(duì)象擴(kuò)展的屬性

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:Android自定義View實(shí)現(xiàn)投票進(jìn)度條

欄    目:Android

下一篇:Android自定義View實(shí)現(xiàn)點(diǎn)贊控件

本文標(biāo)題:Kotlin中的對(duì)象表達(dá)式和對(duì)象聲明的具體使用

本文地址:http://mengdiqiu.com.cn/a1/Android/9071.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有