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.mzph.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…

苏大计算机学院在哪,苏州大学和扬州大学都位于江苏,这两所大学,哪一所的实力更强?...

原标题:苏州大学和扬州大学都位于江苏,这两所大学,哪一所的实力更强?一个朋友问我这么一个问题:“苏州大学和扬州大学都位于江苏,这两所大学,哪一所的实力更强?”经常看到这么一句话…