Kotlin 知识点总结:类、继承,高级安卓面试题

fun click()

}

// 实现类

class MeButton : Clicker{

override fun click() {

println(“not implemented”)

}

}

// 调用

fun main(args: Array) {

var button:MeButton = MeButton()

button.click()

}

上述代码,我们看到 kotlin 中 使用 “:” 代替了 java 中的 extends 和 implements , 和 java 相同的,kotlin 也是单继承,但是可以实现多个接口。

和java 中的 @override 相同,override 用来注释 继承父类的方法,或者 接口的方法或属性,不同的是 kotlin 中的 override 是强制添加上的,这样可以避免先写实现方法 在添加抽象方法 造成的重写。 kotlin 接口中可以有默认实现的方法,但是java 中则需要在方法中表明 default 关键字,而kotlin中是不用添加 关键字的。

interface Clicker{

fun click()

fun staticClick(){

println(“默认实现”)

}

}

如果你 实现了这个接口,你也可以继承该方法,对他进行修改,当然你也可以不实现该方法。

1.如果 你分别继承两个 接口,两个接口有相同的默认实现函数,如果不显式的指明调用哪一个,运行的时候会报错。 2.解决办法就是 实现两个接口中相同名称的函数,在函数中指明引用, 2.1 super< AInterface >.click(); super< BInterface >.click(); 而在java中的表达方式则是 AInterface .super.click(); 表现方式不太一样

2. 继承


2.1 继承函数

java 中的父类默认都是 可以继承的,所以我们在写 BaseActivity 或者 BaseFragment 的时候都要慎重的设计,因为一不小心 就会让子类实现很多没有的类。所以 kotlin中 的方法默认都是 final ,如果需要子类继承就要特地标记 open 修饰符。

class MeButton : Clicker{

override fun click() { // 实现 Clicker 方法 默认 为open 可继承

println(“not implemented”)

}

fun dieable(){} // 默认为 final

open fun openClass(){} // 明确表明 为open 可继承

}

如果是实现 基类的方法 或者 接口的方法,默认是open 的,如果希望改变,可以自己添加修饰符 final 。

Kotlin 中所有类都有一个共同的超类 Any,这对于没有超类型声明的类是默认超类

2.2 继承属性

继承属性和继承函数差不多,在父类中声明然后在子类中重新声明的属性必须以 override 开头,并且它们必须具有兼容的类型。每个声明的属性可以由具有初始化器的属性或者具有 getter 方法的属性覆盖。    注意: var 属性可以继承自一个 val 属性 ,反之则不可以。(var 属性不能 让val 继承 )

interface Foo {

val count: Int

}

class Bar1(override val count: Int) : Foo

class Bar2 : Foo {

override var count: Int = 0

}

上述代码,我们在主构造函数中也可以使用 override 。

2.3 abstract

我们通过一段代码 来了解一下 abstract

// 抽象类,不能创建实例

abstract class abClas{

// 抽象方法 默认就是open(此处省略) 不能实例,必须继承实现

abstract fun ab1()

//抽象类中的 方法 不是默认open的,所以需要标明

open fun ab2(){}

fun ab3(){}

}

其他地方和 java 的都比较相似,这里就不多赘述

2.4 重载函数

由于在Java中是没有默认值参数的概念,当我们需要从Java中调用Kotlin中的默认值重载函数的时候,必须显示的指定所有参数值。但是这个绝对不是我们想要,否则Kotlin就失去了重载的意义了不能和Java完全互操作。所以在Kotlin给出了另一个方案就是使用**@JvmOverloads**注解这样就会自动生成多个重载方法供Java调用。

@JvmOverloads

fun joinString(

collection: Collection = listOf(),

separator: String = “,”,

prefix: String = “”,

postfix: String = “”

): String {

return collection.joinToString(separator, prefix, postfix)

}

//调用的地方

fun main(args: Array) {

//函数使用命名参数可以提高代码可读性

println(joinString(collection = listOf(1, 2, 3, 4), separator = “%”, prefix = “<”, postfix = “>”))

println(joinString(collection = listOf(1, 2, 3, 4), separator = “%”, prefix = “<”, postfix = “>”))

println(joinString(collection = listOf(1, 2, 3, 4), prefix = “<”, postfix = “>”))

println(joinString(collection = listOf(1, 2, 3, 4), separator = “!”, prefix = “<”))

println(joinString(collection = listOf(1, 2, 3, 4), separator = “!”, postfix = “>”))

println(joinString(collection = listOf(1, 2, 3, 4), separator = “!”))

println(joinString(collection = listOf(1, 2, 3, 4), prefix = “<”))

println(joinString(collection = listOf(1, 2, 3, 4), postfix = “>”))

println(joinString(collection = listOf(1, 2, 3, 4)))

}

3. 修
饰符


和 java 的大多数修饰符是一样的,但是java 默认为 private ,但是kotlin 中默认为 public ,并且 kotlin中没有 包可见,新添加的修饰符为 :internal ,表示只在模块内部可用。

è¿éåå¾çæè¿°

1.在kotlin 中 public 是不可以访问 低可见性 internal 的。 2.另外还要注意的是 protected ,在java 中他的访问范围是 包中,但是在kotlin 中则是 局限到 类 或者子类中, 3. 类的扩展函数 是访问不到 private 和 protected 的。

4. 嵌套类 内部类


和java 一样,kotlin 也是可以在类中 包 类,但是 内部类是不可以访问 外部类的属性的 ,除非你做 了特殊的 安排。

class MeButton : Clicker {

private var a: Int = 1

override fun click() {

println(“not implemented”)

}

fun dieable() {}

open fun openClass() {}

// inner 关键字是重点

inner class CButton {

var b: Int = a

}

}

从上述代码中看到,我这里在 类 MeButton 中新添加了一个 类 CButton ,如果在没有添加 inner 的情况下,称之为 嵌套类,CButton 中是无法获取到外部类的引用的。   如果添加上 inner 后,则算是内部类,可以获取到外部类的引用。

5. 类
ck() {

println(“not implemented”)

}

fun dieable() {}

open fun openClass() {}

// inner 关键字是重点

inner class CButton {

var b: Int = a

}

}

从上述代码中看到,我这里在 类 MeButton 中新添加了一个 类 CButton ,如果在没有添加 inner 的情况下,称之为 嵌套类,CButton 中是无法获取到外部类的引用的。   如果添加上 inner 后,则算是内部类,可以获取到外部类的引用。

5. 类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值