热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

详解Kotlin中的面向对象(二)

这篇文章主要介绍了详解Kotlin中的面向对象(二)的相关资料,需要的朋友可以参考下

详解Kotlin中的面向对象(二)

在Kotlin中的面向对象(一)中,介绍了Kotlin类的相关操作,本文将在上文的基础上,继续介绍属性、接口等同样重要的面向对象的功能。

属性

class AttrDemo{ 
 private var attr1 : String = ""; 
 protected var attr2 : String = ""; 
 public var attr3 : String = ""; 
 
 var varattr : String = ""; 
 val valattr : String = ""; 
 
 var attr = 1; 
} 

属性是每个对象中最基本的单位,也是必不可少的一部分,与Java一样,Kotlin也提供了private、protected、public三种声明变量的方式,不同的是,在Kotlin中如果没声明访问权限,默认认为是public类型,即在其他任何地方都可以访问。同时,Kotlin提供了var和val用来表示属性的读写权限,var是可读写的变量,val则是只读变量,类似于Java中的final。

需要注意,Kotlin对于空安全的要求非常严格,所以对于所有的属性都需要进行初始化,因此也可以通过直接赋值的方式说明属性的类型,不一定非在后面通过冒号的方式追加。不过对于习惯Java语法的开发者而言可能还是会注明属性的类型,而习惯脚本语言的开发者可能会倾向于直接赋值。

在Kotlin中,get和set方法不是必须的,因为Kotlin会自动对get和set方法进行处理,变成直接调用属性的方式(可参考Kotlin的第一行代码中的说明),但Kotlin还是有自己独特的使用get和set的方式

private var attr1 : String 
get() = attr1.toString() 
set(value) { 
 attr1 = value 
} 
 
protected var attr2 : String 
get() { 
 //TODO GET 
 return attr2.toString() 
} 
set(value) { 
 attr2 = value 
} 

Kotlin提供了多种设置get和set的方法,上面的代码中展示了两种get方法和一种set方法,有时当你希望改变get、set的访问权限或是使用注解时,也可以直接对get、set进行操作

var attr4 : String = "" //一定要初始化 
private set 

接口

和Java类似,Kotlin使用interface作为接口的关键词,和抽象类相比,他们都可以包含抽象的方法以及方法的实现,但接口无法保存状态。

interface mInterfaceDemo{ 
 fun function1() 
 fun function2(){ 
   
 } 
} 

和继承的方式类似,实现接口也是使用冒号“:”,不过方法略有不同

class InterfaceDemoImpl : mInterfaceDemo{ 
 override fun function1() { 
  TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 
 } 
 
} 

我们可以在接口中申明属性,但接口中的属性要么是抽象的,要么提供访问器的实现。接口属性不可以有后备字段,而且访问器不可以引用它们。

泛型

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。像 java 一样,Kotlin 中的类可以拥有类型参数

class GenericDemo(t : T){ 
 var value = t 
} 

通常来说,我们需要这样构建一个对象

val generic: GenericDemo = GenericDemo(1) 

但如果类型是需要推断的,也可以通过传入忽略类型的参数进行创建

val generic = GenericDemo(1) 

嵌套类

Kotlin中的类也可以嵌套在别的类中

class Outer { 
 private val bar: Int = 1 
 class Nested { 
  fun foo() = 2 
 } 
} 

可以通过inner修饰符增加一个对外部类的引用,使得内部类可以调用外部类的属性

class Outer { 
 private val bar: Int = 1 
 inner class Inner { 
  fun foo() = bar 
 } 
} 
 
val demo = Outer().Inner().foo() //==1 

对于匿名内部类,通过对象表达式进行创建

mvp_button.setOnClickListener(object : View.OnClickListener{ 
 override fun onClick(v: View?) { 
  TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 
 } 
}); 

如果对象是函数式的 java 接口的实例(比如只有一个抽象方法的 java 接口),我们可以用一个带接口类型的 lambda 表达式创建它。

mvp_button.setOnClickListener { 
 startActivity(Intent(MainActivity@this,MVPActivity::class.java)) 
} 

枚举类

枚举类最基本的用法就是实现类型安全的枚举,每个自举常量都是一个对象。枚举常量通过逗号分开。

enum class Direction { 
 EAST,NORTH,SOUTH,WEST 
} 

因为每个枚举对象都是一个实例,所以我们可以对其进行初始化

enum class Color(val rgb: Int) { 
 RED(0xFF0000), 
 GREEN(0x00FF00), 
 BLUE(0x0000FF) 
} 

当我们需要调用枚举对象的内容时,可以通过valueof获取某个枚举对象的值,或者通过values获取所有枚举对象

Direction.EAST 
Direction.valueOf("EAST"); 
Direction.values() 

需要注意,如果指定的名字在枚举类中没有任何匹配,那么valueOf()方法将会抛出参数异常

Kotlin中核面向对象相关的内容就介绍到这里,相关的代码均提交在github中,

本文源码下载:http://xiazai.jb51.net/201706/yuanma/helloKotlin-master(jb51.net).rar

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • 本文详细介绍了Objective-C中的面向对象编程概念,重点探讨了类的定义、方法的实现、对象的创建与销毁等内容,旨在帮助开发者更好地理解和应用Objective-C的面向对象特性。 ... [详细]
  • 本文档旨在提供C语言的基础知识概述,涵盖常量、变量、数据类型、控制结构及函数定义等内容。特别强调了常量的不同类型及其在程序中的应用,以及如何正确声明和使用函数。 ... [详细]
  • 本文详细介绍了如何在Windows和Linux系统上配置Openfire服务器,包括安装步骤、数据库配置及端口映射等关键环节。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • Java高级工程师学习路径及面试准备指南
    本文基于一位朋友的PDF面试经验整理,涵盖了Java高级工程师所需掌握的核心知识点,包括数据结构与算法、计算机网络、数据库、操作系统等多个方面,并提供了详细的参考资料和学习建议。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 本文介绍如何在Caffe框架中运行ResNet模型,包括通过Caffe内置工具创建LMDB数据集的方法,以及相关参数的详细说明。 ... [详细]
  • 本文介绍了如何通过Git日志查找特定的提交记录,并使用git reset --soft命令撤销指定版本的提交,同时保留工作目录中的更改。最后,文章还说明了如何通过强制推送更新远程仓库。 ... [详细]
  • 使用IntelliJ IDEA高效开发与运行Shell脚本
    本文介绍了如何利用IntelliJ IDEA中的BashSupport插件来增强Shell脚本的开发体验,包括插件的安装、配置以及脚本的运行方法。 ... [详细]
  • 深入解析Nacos服务自动注册机制
    本文将探讨Nacos服务自动注册的具体实现方法,特别是如何通过Spring事件机制完成服务注册。通过对Nacos源码的详细分析,帮助读者理解其背后的原理。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • 本文提供了一个详尽的前端开发资源列表,涵盖了从基础入门到高级应用的各个方面,包括HTML5、CSS3、JavaScript框架及库、移动开发、API接口、工具与插件等。 ... [详细]
  • 深入理解iOS中的链式编程:以Masonry为例
    本文通过介绍Masonry这一轻量级布局框架,探讨链式编程在iOS开发中的应用。Masonry不仅简化了Auto Layout的使用,还提高了代码的可读性和维护性。 ... [详细]
author-avatar
海岛迷情
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有