Kotlin中的面向对象(二)

原创 2017年06月06日 18:27:49

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中,同时也欢迎大家关注我的专栏hello kotlin,一起学习与讨论Kotlin~
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/steveyg/article/details/72879411

Kotlin笔记(二) : Kotlin与Java对比

Kotlin笔记 Kotlin与Java语法对比
  • seemygoandroid
  • seemygoandroid
  • 2017-05-31 16:48:15
  • 319

Kotlin从小白到大牛第2篇 【Kotlin】面向对象视频课程

本视频是智捷课堂推出的一套“Kotlin语言学习立体教程”的视频第二部分,主要内容包括:面向对象基础、继承与多态、抽象类与接口等。
  • 2017年12月25日 14:07

Kotlin学习笔记(二):Kotlin与Java对比

Kotlin学习笔记 Kotlin与Java的对比
  • VRoymond
  • VRoymond
  • 2017-05-31 16:45:21
  • 689

Kotlin学习笔记(二)——示例篇一

介绍了基本的一些语法,现在用最真实的Demo,来进行深入学习KotLin! 参考链接是:https://try.kotl.in 在Intellij IDEA 开发环境里,新建一个kt文件, 即可...
  • zouchengxufei
  • zouchengxufei
  • 2015-10-12 17:18:47
  • 2295

Kotlin 官方学习教程之属性和字段

Kotlin 官方学习教程之属性和字段
  • jim__charles
  • jim__charles
  • 2017-06-03 14:21:37
  • 923

10面向对象高级特性三

抽象类 v      抽象类:用abstract关键字来修饰一个类时,该类叫做抽象类; §        抽象类必须被继承。 §        抽象类不能被直接实例化。它只能作为其它类的超类,这...
  • kuangfengbuyi
  • kuangfengbuyi
  • 2011-12-10 00:25:17
  • 600

C++面向对象(二)

C++面向对象(二):类对象生存周期,函数返回对象,临时量的产生
  • Cassie_Yan
  • Cassie_Yan
  • 2017-06-18 16:46:22
  • 97

深入理解 Kotlin Coroutine (一)

Coroutine 被翻译成了“协程”,意思就是要各个子任务协作运行的意思,所以大家一下就明白了它被创造出来是要解决异步问题的。...
  • axi295309066
  • axi295309066
  • 2017-09-22 20:08:39
  • 1648

重新认识java(二) ---- 面向对象之封装!

如果你认为封装仅仅是private + getter and setter,那你就大错特错了!
  • qq_31655965
  • qq_31655965
  • 2016-11-28 19:16:13
  • 2906

UML面向对象的设计原则

UML面向对象的设计原则 里氏替换原则 不满足LSP的方案 CS游戏中的枪械类图,士兵使用枪杀敌,具体用什么枪,调用的时候才知道。有一种玩具手枪,增加一个类ToyGun,射不出子弹,业务调用类出...
  • tingary
  • tingary
  • 2016-12-03 16:05:07
  • 213
收藏助手
不良信息举报
您举报文章:Kotlin中的面向对象(二)
举报原因:
原因补充:

(最多只允许输入30个字)