Kotlin学习(二)

来源:互联网 发布:网络工程施工与验收 编辑:程序博客网 时间:2024/06/05 02:42

Kotlin学习(二)


类的定义

class Abc {}

带构造函数的

class Person constructor(firstName: String) {}

如果构造函数有注解或可见性修饰符,这个 constructor 关键字是必需的,并且这些修饰符在它前面,若没有则可以省略

主构造函数不能包含任何的代码。初始化的代码可以放到以 init 关键字作为前缀的初始化块(initializer blocks)中,主构造的参数也可以在初始化块中使用

class Customer(name: String) {    init {        logger.info("Customer initialized with value ${name}")    }}

init{} 中为构造函数函数体

也可以在类体内声明的属性初始化器中使用

class Customer(name: String) {    val customerKey = name.toUpperCase()}

声明属性以及从主构造函数初始化属性,Kotlin 有简洁的语法

class Person(val firstName: String, val lastName: String, var age: Int) {    // ……}

主构造函数中声明的属性可以是可变的(var)或只读的(val)


创建类的实例

val invoice = Invoice()//带构造方法的val customer = Customer("Joe Smith")//javaInvoice invoice = new Invoice();Customer customer = new Customer("Joe Smith");

kotlin没有new关键字


类继承
默认任何类都是基础继承自Any(Any 不是 java.lang.Object;尤其是,它除了 equals()、hashCode()和toString()外没有任何成员,要使用其他的 要用到扩展函数),所有的类默认都是不可继承的(final),所以我们只能继承那些明确声明open或者abstract的类

类上的 open 标注与 Java 中 final 相反,它允许其他类从这个类继承。默认情况下,在 Kotlin 中所有的类都是 final

class Person(name: String, surname: String) : Animal(name)

: 代替extends 并且被继承的类要加上()
如果该类有主构造函数,其基类型必须 用(基类型的)主构造函数参数就地初始化
当我们只有单个构造器时,我们需要在从父类继承下来的构造器中指定需要的参数。这是用来替换Java中的super调用的。


函数

fun onCreate(savedInstanceState: Bundle?) {}

用fun 函数名()进行定义
若没有指定它的返回值,它就会返回Unit,与Java中的void类似,但是Unit是一个真正的对象。

你当然也可以指定任何其它的返回类型

fun add(x: Int, y: Int) : Int {    return x + y}

: 数据类型
形参也是通过 形参名 : 数据类型 定义

若函数返回的结果可以使用一个表达式计算出来,可以不使用大括号而是使用等号:

fun add(x: Int,y: Int) : Int = x + y

函数重载
通过给参数指定一个默认值使得它们变得可选,这样就只需要指定一个函数即可实现同名不同参数的函数重载

 fun add(x:Int,y:Int=0,z:Int) : Int{        return x+y+z    }

使用:

// 这里可以跳过y变量去使用a和z val a = add(3,z = 4) val b = add(3,4,5) Log.i("a", a.toString()) Log.i("b", b.toString())

函数覆盖
Kotlin 需要显式标注可覆盖的成员(open)和覆盖后的成员:

open class Base {    **open** fun v() {}    fun nv() {}}class Derived() : Base() {    **override** fun v() {}}

调用超类实现
使用 super 关键字调用其超类的函数与属性访问器的实现

open class Foo {    open fun f() { println("Foo.f()") }    open val x: Int get() = 1}class Bar : Foo() {    override fun f() {         super.f()        println("Bar.f()")     }    override val x: Int get() = super.x + 1}

抽象类
类和其中的某些成员可以声明为 abstract。 抽象成员在本类中可以不用实现,默认为open的,因为抽象类就是为了继承而产生的


接口

interface MyInterface {    fun bar()    fun foo() {      // 可选的方法体    }}

一个类或者对象可以实现多个接口

class Child : MyInterface {    override fun bar() {        // 方法体    }}


原创粉丝点击