加深对kotlin中类的理解
- kotlin的声明默认是final和public的
- 嵌套类默认并不是内部类:他们并没有包含对其外部类的引用
- kotlin使用冒号代替javad extends 和implements
- kotlin 中使用override修饰符是强制要求的
- 对基类的
kotlin中接口
- kotlin的接口可以包含抽象方法的定义以及非抽象方法的实现
- 接口中的方法可以有一个默认实现
- 接口中不能使用final open 或者abstract
- 接口中的成员始终是open的,不能生命为final
案例:
interface Clickable {
fun click()
fun showOff() = println("I am clickable")
}
- 实现此接口,必须为click提供实现
- 可重新定义showOff()方法,如果对默认行为满意,可以省略。
kotlin中abstract 类
- 和java一样,kotlin有abstract类,这种类同样不能被实例化
- 一个抽象类通常包含一些么有实现,并且必须在子类中重写的抽象成员
- 抽象成员始终是open的,不需要显式的使用open修饰符
示例:
// 这个类是抽象的,不能创建它的实例
abstract class Animated {
//这个函数式抽象的,他没有实现,必须被子类重写
abstract fun animate()
//抽象类中的非抽象函数,并不是默认open的,但是可以标注为open
open fun stopAnimating(){
}
fun animateTwice(){}
}
kotlin中类的继承问题,子类,父类
- java 允许你创建人以类的子类,并重写任意方法。除非显式的使用final关键字进行标注。
- 对基类进行修改会导致子类的不正确的行为,这就是java“”脆弱的基类问题“”
- kotlin的类和方法,默认是final的。即不可被继承(实现)或者被复写
- 如果你想创建父类,需要用open修饰符来标示这个类,此外,每一个可被重写的属性或者方法,都需要添加open修饰符
// 这个类是open的,其他类可以继承他
open class RichButton : Clickable {
//这个函数是final的,不能在子类中重写它
fun disable() {}
//这个函数是open的,可以在子类中重写它
open fun animate() {}
//这个函数重写了一个open函数,并且它本身也是open的
override fun click() {}
//这里final没有被删减是因为,没有final的override意味着是open的。
final override fun click() {}
}
枚举
- kotlin中,enum是一个所谓的软关键字,只有出现在class前才有特殊意义,其他地方可当成普通名称
object
- object关键字,用来表示单例对象,伴生对象,和对象表达式
kotlin的数据类——data
为类添加data 修饰符,会让你的类成为一个方便的数据容器,上面的这些方法会自动生成好。
并会为类生成标准的,toString, equals,hashCode,方法,并为类添加解构声明。
代码:
data class Client(val name: String, val PostalCode: Int)
数据类的属性,可以使用var修饰,但我们强烈建议使用val,让属性只读,让数据类的实例不可变
如果想使用这样的实例作为HashMap 或者类似容器的键,这会是必须的要求,因为如果不这样,被用作键的对象在加入容器后被修改了,容器可能会进入一种无效的状态。
不可变对象同样更容易理解,特别是在多线程代码中:一旦一个对象被创建出来,它会一直保持初始状态,也不用担心在你的代码工作时,其他线程修改了对象的值。
- 为了让使用不可变对象的数据变得容易,kotlin编译器为其多生成了一个方法:一个允许copy类的实例的方法,并可以在copy的同事修改某些属性的值——copy方法
val bob=Client("Bob",973293)
print(bob.copy(postalCode = 382555))
打印结果:
Client(name=Bob,postalCode = 382555)
使用顶层函数和属性消除工具类
- kotlin中,方法不一定会写在类内部。
消除方法:
1.工具类去掉类的包裹,直接全部都是方法
- 类文件的第一行,指明名字即可,如下:
@file:JvmName("AesUtils")
package com.play.myapplication.helper
- java文件中该怎么用怎么用
- 如果是在kotlin文件中,直接写方法即可,前面的“类点”也给省略了