android對象申明,Kotlin中的對象表達式和對象聲明的具體使用

Kotlin的對象表達式與Java中的匿名內部類的主要區別:匿名內部類只能指定一個父類型,但對象表達式可以指定0~N個膚類型。

一、對象表達式

對象表達式的語法格式如下:

object [: 0~N個父類型]{

//對象表達式的類體部分

}

對象表達式還有如下規則:

對象表達式不能是抽象類,因為系統在創建對象表達式時會立即創建對象。因此不允許將對象表達式定義成抽象類。

對象表達式不能定義構造器。但對象表達式可以定義初始化塊,可以通過初始化塊來完成構造器需要完成的事情。

對象表達式可以包含內部類,不能包含嵌套類。

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) {

//指定一個父類型(接口)的對象表達式

var ob1 = object : Outputable {

override fun output(msg: String) {

for (i in 1..6) {

println("${msg}")

}

}

}

ob1.output("隨便輸出點什么吧")

println("-----------------------------------------------")

//指定零個父類型的對象表達式

var ob2 = object {

//初始化塊

init {

println("初始化塊")

}

//屬性

var name = "Kotlin"

//方法

fun test() {

println("test方法")

}

//只能包含內部類,不可以包含嵌套類

inner class Inner

}

println(ob2.name)

ob2.test()

println("-----------------------------------------------")

//指定兩個父類型的對象表達式

var ob3 = object : Outputable, Product(1.23) {

override fun output(msg: String) {

println("輸出信息:${msg}")

}

override val name: String

get() = "激光打印機"

override fun printInfo() {

println("高速極光打印機們支持自動雙面打印!")

}

}

println(ob3.name)

ob3.output("Kotlin慢慢學")

ob3.printInfo()

}

輸出結果:

隨便輸出點什么吧

隨便輸出點什么吧

隨便輸出點什么吧

隨便輸出點什么吧

隨便輸出點什么吧
隨便輸出點什么吧

-----------------------------------------------

初始化塊

Kotlin

test方法

-----------------------------------------------

激光打印機

輸出信息:Kotlin慢慢學

高速極光打印機們支持自動雙面打印!

Kotlin的對象表達式可分為兩種情形:

對象表達式在方法的局部范圍內,或使用private修飾的對象表達式,Kotlin編譯器可識別對象表達式的真實類型。

非private修飾的對象表達式與Java的匿名內部類相似,編譯器只會把對象表達式當成它所繼承的父類或所實現的接口處理。如果它沒有父類型,系統當它是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對象表達式,編譯器可識別它的真實類型

println(ob1.name)

//ob2是非private對象表達式,編譯器當它是Any類型

// println(ob2.name)

//privateBar是private函數,編譯器可識別它返回的對象表達式的真實類型

println(privateBar().name)

//publicBar是非private函數,編譯器將它返回的對象表達式當成Any類型

// println(publicBar().name)

}

}

fun main(args: Array) {

ObjectExprType().test()

}

輸出結果:

Kotlin

Java

Kotlin編譯器可以識別private對象表達式的真實類型。

Kotlin的對象表達式可訪問或修飾其作用域內的局部變量。

fun main(args: Array) {

var a = 20

var obj = object {

fun change() {

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

a++

}

}

obj.change()

println(a)

}

輸出結果:

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

21

Kotlin的對象表達式比Java的匿名內部類增強了三個方面:

對象表達式可指定多個父類型

Kotlin編譯器能更準確地識別局部范圍內private對象表達式的類型。

對象表達式可訪問或修改其所在范圍內的局部變量

二、對象聲明和單例模式

對象聲明的語法格式如下:

object ObjectName [: 0~N個父類型]{

//對象表達式的類體部分

}

對象聲明與對象表達式的語法很相似,區別在于:對象表達式在object關鍵字后沒有名字;而對象聲明需要在object關鍵字后指定名字。

兩者還有如下區別:

對象表達式是一個表達式,可以被賦值給變量;而對象聲明不是表達式,不能用于賦值。

對象聲明可包含嵌套類,不能包含內部類;而對象表達式可包含內部類,不能包含嵌套類。

對象聲明不能定義在函數和方法內;但對象表達式可嵌套在其他對象聲明或非內部類中。

package `0705`

interface Outputable {

fun output(msg: String)

}

abstract class Product(var price: Double) {

abstract val name: String

abstract fun printInfo()

}

//指定一個父類型的對象表達式

object MyObject1 : Outputable {

override fun output(msg: String) {

for (i in 1..6) {

println("${msg}")

}

}

}

//指定零個父類型的對象表達式

object MyObject2 {

//初始化塊

init {

println("初始化塊")

}

//屬性

var name = "Kotlin"

//方法

fun test() {

println("test方法")

}

//只能包含嵌套類,不可以包含內部類

class Inner

}

//指定兩個父類型的對象表達式

object MyObject3 : Outputable, Product(1.23) {

override fun output(msg: String) {

println("輸出信息:${msg}")

}

override val name: String

get() = "激光打印機"

override fun printInfo() {

println("高速極光打印機們支持自動雙面打印!")

}

}

fun main(args: Array) {

MyObject1.output("一起來學Kotlin")

println("-----------------------------------------------")

println(MyObject2.name)

MyObject2.test()

println("-----------------------------------------------")

println(MyObject3.name)

MyObject3.output("Kotlin真不錯")

MyObject3.printInfo()

}

輸出結果:

一起來學Kotlin

一起來學Kotlin

一起來學Kotlin

一起來學Kotlin

一起來學Kotlin
一起來學Kotlin

-----------------------------------------------

初始化塊

Kotlin

test方法

-----------------------------------------------

激光打印機

輸出信息:Kotlin真不錯

高速極光打印機們支持自動雙面打印!

對象聲明專門用于實現單例模式,對象聲明所定義的對象也就是該類的唯一實例,程序可通過對象聲明的名稱直接訪問該類的唯一實例。

三、伴生對象和靜態成員

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

每個類最多只能定義一個伴生對象,伴生對象相當于外部類的對象,程序可通過外部類直接調用伴生對象的成員。

package `0705`

interface CompanionTest {

fun output(msg: String)

}

class MyClass {

//使用companion修飾的伴生對象

companion object MyObject1 : CompanionTest {

val name = "name屬性值"

override fun output(msg: String) {

for (i in 1..6) {

println("${msg}")

}

}

}

}

fun main(args: Array) {

//使用伴生對象所在的類調用伴生對象的方法

MyClass.output("Kotlin必須學")

println(MyClass.name)

}

輸出結果:

Kotlin必須學

Kotlin必須學

Kotlin必須學

Kotlin必須學

Kotlin必須學
Kotlin必須學

name屬性值

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

四、伴生對象的擴展

伴生對象也可以被擴展。如果一個類具有伴生對象,則Kotlin允許為伴生對象擴展方法和屬性。

package `0705`

interface CompanionTest {

fun output(msg: String)

}

class MyClass {

//使用companion修飾的伴生對象

companion object : CompanionTest {

val name = "name屬性值"

override fun output(msg: String) {

for (i in 1..6) {

println("${msg}")

}

}

}

}

//為伴生對象擴展方法

fun MyClass.Companion.test() {

println("為伴生對象擴展的方法")

}

val MyClass.Companion.foo

get() = "為伴生對象擴展的屬性"

fun main(args: Array) {

//使用伴生對象所在的類調用伴生對象的方法

MyClass.output("Kotlin必須學")

println(MyClass.name)

//通過伴生對象所在的類調用為伴生對象擴展的成員

MyClass.test()

println(MyClass.foo)

}

輸出結果:

Kotlin必須學

Kotlin必須學

Kotlin必須學

Kotlin必須學

Kotlin必須學
Kotlin必須學

name屬性值

為伴生對象擴展的方法

為伴生對象擴展的屬性

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534562.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android+聯系服務器時間,android配置時間服務器+亞洲主要的授時服務器

我們知道,Android是通過連接指定的ntpServer來獲取網絡時間,而不同的服務器帶來的延遲也不盡相同,通常情況下,我們自然是期望盡快獲取時間,那么我們就需要對ntpServer有一定的篩選,尤其是在選擇默認的ntpSe…

android 獲取設備的mac地址,Android編程獲取設備MAC地址的實現方法

本文實例講述了Android編程獲取設備MAC地址的實現方法。分享給大家供大家參考,具體如下:/*** 獲取設備的mac地址** param ac* param callback* 成功獲取到mac地址之后會回調此方法*/public static void getMacAddress(final Activity ac, final SimpleCa…

android 資源如何下沉,關于Android業務模塊下沉的一些實踐及總結

此文已由作者徐銘陽授權網易云社區發布。歡迎訪問前言最近在做需求過程中,一些類似學校選擇、城市選擇等業務相關模塊想單獨抽離出來,遇到一些諸如模塊管理、通信方面的問題來背景最近有一個需求是學校列表,沒錯,就是我們平時總見…

android sqlite存儲數據,Android之SQLite數據存儲

關于SQLite的出生長大和壯大,這里就略去了,只記幾點比較重要的用法:SQLite所支持的數據類型:SQLite,SQLite3支持 NULL、INTEGER、REAL(浮點數字)、TEXT(字符串文本)和BLOB(二進制對象)數據類型,雖然它支持的…

android gridview滾動條位置,Android GridView滾動到指定位置

當一個列表項目很多,并且每個項目可以進入到其它Activity或者Fragment時,保存之前列表的位置是一個比較不錯的功能,今天研究了一下怎么保存瀏覽位置,發現GridView和它的父類中有4個相關的方法:public void smoothScrol…

android studio 跨進程,Android IPC機制(三)在Android Studio中使用AIDL實現跨進程方法調用...

本文首發于微信公眾號「后廠技術官」在上一篇文章Android IPC機制(二)用Messenger進行進程間通信中我們介紹了使用Messenger來進行進程間通信的方法,但是我們能發現Messenger是以串行的方式來處理客戶端發來的信息,如果有大量的消息發到服務端&#xff0…

nubia ui 5.0 android,流暢度爆棚 搭Android 5.0系統新機一覽

近期各品牌新機都不少,而且90%以上都是Android系統的手機,可見安卓手機的主導地位仍在上升。而在系統層次,Android 5.0已經逐步開始普及,近期上市新機百分百均采用了這一系統,值得一提的是定制不再“深度”&#xff0c…

signature=4d4ce610ff2d4a5f2093452c24b70492,Reading Chromatin Signatures

摘要:The article cites a study which uses a combination of chromatin immunoprecipitation and microarray analysis to explore the histone modifications, transcription-factor binding and nucleosome density in 30 megabytes of human genome. It states…

html 百分比正方形,css實現未知寬度的正方形需求

今天群里有哥們問了一下,百分比寬度的正方形如何用css實現。其實就是不定寬的正方形如何用css實現。第一個方法利用圖片的等比例縮放,用base64寫一個1*1的透明png圖片,寬度100%,這樣容器就自動被撐成一個正方形,demo如…

html引用本地圖片不能是桌面的,Img標簽與本地文件:/// URL不顯示在Microsoft Edge Web瀏覽器...

在我的桌面應用程序中,我創建了一個臨時HTML文件(旨在讓用戶打印報告),然后通過默認顯示網頁瀏覽器。這個HTML文件保存在一個臨時文件夾,例如:C:/Users/UserName/AppData/Local/TempImg標簽與本地文件:/// URL不顯示在…

你用計算機做過什么事情,他偷偷干了什么?(電腦)

我一本正經地胡說一下吧。控制面板→管理工具”中找到的“事件查看器”,通過它可以了解系統的喜怒哀樂和一言一行事件查看器相當于一本厚厚的系統日志,可以查看關于硬件、軟件和系統問題的信息,也可以監視Windows XP的安全事件,下…

怎么用計算機算立方數,計算器的使用方法

計算器人們都很熟悉,尤其是從事數據行業的人更要懂得如何使用計算器,那么外行人士想要正確使用計算器該怎么辦呢?今天小編就來為您解圍。計算器包括標準型和科學型兩種,其中標準型使用方法如下:1、鍵入數字時,按下相應…

有計算機知識,計算機基本理論基礎知識總匯

計算機基本理論基礎知識總匯1、計算機按照數據處理規模大小可以分為(巨型計算機)(大型計算機)(小型計算機)(微型計算機)(工作站)等2、計算機的硬件主要由(控制器)(運算器)(存儲器)(輸入輸出設備)以及電源等硬件組成。3、計算機主機是(控制器)(運算器)(存儲器)的總稱&#xff0c…

麻省理工學院計算機科學與工程博士,2020年麻省理工學院博士讀幾年

麻省理工學院(Massachusetts Institute of Technology),簡稱麻省理工(MIT),坐落于美國馬薩諸塞州劍橋市(大波士頓地區) ,是世界著名私立研究型大學、被譽為"世界理工大學之最"。麻省理工學院博士讀幾年麻省理工學院博士一般讀5年&a…

廈門信息計算機專業錄取分數,廈門大學計算機類(含計算機科學與技術、智能科學與技術、網絡專業2016年在福建理科高考錄取最低分數線...

類似問題答案廈門大學計算機類(含計算機科學與技術、智能科學與技術、網絡專業2016年在北京理科...學校 地 區 專業 年份 批次 類型 分數 廈門大學 北京 計算機類(含計算機科學與技術、智能科學與技術、網絡 2016 一批 理科 650 學校 地 區 專業 年份 批次 類型 分數 廈門大學 …

遼寧412想學計算機科學技術,遼寧理工學院計算機科學與技術專業2016年在遼寧理科高考錄取最低分數線...

類似問題答案遼寧理工學院計算機科學與技術專業2016年在河北理科高考錄取最低分數線學校 地 區 專業 年份 批次 類型 分數 遼寧理工學院 河北 計算機科學與技術 2016 二批 理科 443 遼寧理工學院 河北 計算機科學與技術 2016 二批 理科 443 遼寧理工學院 河北 計算機科學與技術…

為什么計算機語言都是英語,編程為什么都是英語 編程為什么沒有漢語

編程為什么都是英語?編程為什么沒有漢語?一些想寫編程但英語又不好的同學想知道編程為什么都是英語,為什么沒有漢語,下面就讓小編為大家介紹一下其實是有漢語編程語言的,感興趣的小伙伴一起來看看吧,有一門…

學計算機隨隨便便上萬,大學“最燒錢”專業排行榜,“家境一般”慎入,“土豪”請隨意...

俗話說“高考七分考,三分報”,而這也意味著在高考當中不僅考試重要,在高考后的填報志愿也是非常重要的,因為填報志愿也代表著在大學期間學習什么專業,也代表著在畢業后會從事什么行業,所以報考專業一定要慎…

flash 用 html 播放,使用flash插件在HTML上播放音頻

原文鏈接:WordPress Audio Player 非插件方式使用方法Standalone versionThe standalone version comes with a JavaScript file to simplify configuring and embedding the player. This file includes theswfobject library.Note: the zip file includes two oth…

蘇大計算機學院在哪,蘇州大學和揚州大學都位于江蘇,這兩所大學,哪一所的實力更強?...

原標題:蘇州大學和揚州大學都位于江蘇,這兩所大學,哪一所的實力更強?一個朋友問我這么一個問題:“蘇州大學和揚州大學都位于江蘇,這兩所大學,哪一所的實力更強?”經常看到這么一句話…