当前位置: 移动技术网 > IT编程>开发语言>Java > 详解Kotlin中的面向对象(二)

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

详解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中,

本文源码下载:

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网