Kotlin学习笔记(四):抽象类、接口、可见性修饰、重写

本文是Kotlin学习笔记系列的第四篇,还没看过前三篇文章的同学请看下方:

下面直接进入正文。

抽象类

关键字:abstract、override

abstract可以用于类的修饰、或者类成员方法的修饰,能将对应的class或fun声明成为抽象类或者抽象方法。

1
2
3
4
5
6
7
8
9
abstract class A {
abstract fun testAbsFun()
}
class B : A() {
override fun testAbsFun() {
//do sth...
}
}

重写抽象类的方法需在方法体前面加上override关键字声明。

接口

关键字:interface、field、override

Kotlin中的接口需要使用关键字interface进行声明,支持声明属性但不支持备用字段(field),接口中还可以实现方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
interface InterfaceA {
var testAttr: Int//abstract属性
fun first()//abstract方法
fun second() {//可以直接实现方法
//do sth...
}
}
class ClassA : InterfaceA {//覆盖实现接口中的抽象属性和方法
override var testAttr: Int = 0//重写属性提供访问方法
get() = field
set(value) {
field = value
}
override fun first() {
//do sth...
}
}
class ClassB(override var testAttr: Int) : InterfaceA{//在构造函数中重写属性
override fun first() {
//do sth...
}
}

如果接口中声明了抽象属性,则继承实现的类需要在构造函数中对该属性进行初始化重写该属性并提供对应的访问方法

重写

关键字:override、super

重写的关键字是override,前面的接口和抽象类继承已经有所展现,但凡是被重写的属性或方法都需要加上override关键字声明。虽然简单,但任有一些需要注意的规则:

  • 重写属性时,可以用var属性覆盖重写val属性,反之不行。

这点容易理解,var属性是可变属性,val属性为只读属性,如果val属性能覆盖重写var属性,则父类中的方法体对原有的var属性赋值行为必然受到影响,所以val属性不能覆盖重写var属性。

  • 子类继承父类和接口且当同一个成员函数存在多个实现时,子类需明确重写该函数并提供其实现。

假如父类和接口中同时都有名为first的方法,则同时继承它们的子类需要重写first的实现,否则程序则会产生二义性。

1
2
3
4
5
6
7
8
9
10
11
interface InterfaceSample {
fun first() {
println("InterfaceSample...first do sth...")
}
}
abstract class AbstractSample {
open fun first() {
println("AbstractSample...first do sth...")
}
}

最终继承的子类,可以选择使用其中一个父类或接口的实现,或者合并所有父类或接口实现。

1
2
3
4
5
6
7
8
class OverrideSample : InterfaceSample, AbstractSample() {//继承的接口和父类中都有first方法
override fun first() {//重写first方法实现
super<AbstractSample>.first()//选择AbstractSample.first作为子类实现
super<InterfaceSample>.first()//选择InterfaceSample.first作为子类实现
}
}

可见性修饰

关键字:private、protected、internal、public

Kotlin共有四种可见性修饰符:private、protected、internal、public。

  • 可见性修饰可用于函数、属性、类、对象和接口,但不能用于局部变量。
  • 未指定可见性修饰时,默认的可见性修饰符是public。
  • 包级别下声明private时,则只在包含的文件中可见,类级别下声明private,则只在类中可见。
  • protected可见性只用于子类和父类,不可用于包级别(top_level)的函数和属性,父类声明protectde时,仅在子类中可见。
  • internal在本模块中所有的地方均可见。

这里还留有疑问,暂时没能理解Kotlin中的模块指什么,用来用去始终觉得public和internal没什么区别,有能明确解释的童鞋可以告知一二。

本文为技术视界原创作品,转载请注明原文出处:http://blog.coderclock.com/ ,欢迎关注我的微信公众号:技术视界

推荐文章