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

作者:lqh 时间:2021-12-29 03:10:00 

详解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 : T){
var value = t
}

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


val generic: GenericDemo<Int> = GenericDemo<Int>(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

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

来源:http://blog.csdn.net/steveyg/article/details/72879411

标签:Kotlin,面向对象
0
投稿

猜你喜欢

  • Android截屏SurfaceView黑屏问题的解决办法

    2023-10-23 11:12:25
  • 聊聊在Servlet中怎么上传文件

    2022-03-07 17:56:44
  • Android实现3D层叠式卡片图片展示

    2022-04-22 16:39:19
  • Winform开发中使用下拉列表展示字典数据的几种方式

    2022-02-23 11:56:41
  • java实现发送邮件的示例代码

    2023-07-04 17:00:54
  • Java RandomAccessFile的用法详解

    2021-12-22 01:19:40
  • Java 字符终端上获取输入三种的方式分享

    2021-12-31 04:52:45
  • Java单例模式下的MongoDB数据库操作工具类

    2023-11-20 12:55:01
  • C# Soap调用WebService的实例

    2021-06-18 20:27:08
  • C#中Equals和GetHashCode使用及区别

    2023-12-10 14:47:27
  • Android触摸及手势操作GestureDetector

    2023-07-31 14:13:42
  • Java中的AQS同步队列问题详解

    2021-08-16 19:50:23
  • Mybatis 入参类型方式全面详解

    2023-10-16 20:03:40
  • 详解C# Lazy Loading(延迟加载)

    2021-09-02 03:02:58
  • 浅谈Java关闭线程池shutdown和shutdownNow的区别

    2021-12-28 04:43:44
  • C#用链式方法表达循环嵌套

    2023-04-14 06:54:23
  • java读取文件字符集示例方法

    2023-11-09 12:35:39
  • Java使用Hutool实现AES、DES加密解密的方法

    2021-06-03 16:49:57
  • 详解Java的按位操作符

    2022-02-02 10:55:25
  • Java 改造ayui表格组件实现多重排序

    2022-05-15 07:34:15
  • asp之家 软件编程 m.aspxhome.com