继学习完kotlin的基础知识后就是类与对象了。
- 类
Kotlin 中使用关键字 class 声明类
class Human(var name:String){
fun eat(){
println("$name 在吃饭")
}
}
fun main(args:Array<String>){
var man= Human("小强")
man.eat()
}
2.封装
- 隐藏内部实现的细节
- 隐藏内部实现的细节就是封装
封装就是隐藏内部实现的细节
封装在fun函数前加个private 关键字就ok
3.继承
在 Kotlin 中所有类都有一个共同的超类 Any,这对于没有超类型声明的类是默认超类
要声明一个显式的超类型,我们把类型放到类头的冒号之后
父类必须是open的。如果父类允许子类重写方法的话也需要在fun前面加open,子类重写父类方法需要加override在fun前面
open class Base(p: Int){
open fun v(){}
fun nv(){}
}
class Derived(p: Int) : Base(p){
override fun v(){}
//override fun nv(){} 父类不允许子类重写nv方法
}
4.抽象类和继承
abstract class Human(var name:String){
abstract fun eat()
}
class Man(name:String):Human(name){
override fun eat(){
println("男人在吃饭")
}
}
class Woman(name:String):Human(name){
override fun eat(){
println("女人在吃饭")
}
}
5.接口
Kotlin 的接口与 Java 8 类似,既包含抽象方法的声明,也包含实现。与抽象类不同的是,接口无法保存状态。它可以有属性但必须声明为抽象或提供访问器实现。
使用关键字 interface 来定义接口
interface MyInterface {
fun bar()
fun foo() {
// 可选的方法体
}
}
class Child : MyInterface {
override fun bar() {
// 方法体
}
}
需要理解
**接口是事物的能力
抽象类是事物的本质**
6.委托
委托模式已经证明是实现继承的一个很好的替代方式, 而 Kotlin 可以零样板代码地原生支持它。 类 Derived 可以继承一个接口 Base,并将其所有共有的方法委托给一个指定的对象:
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b
fun main(args: Array<String>) {
val b = BaseImpl(10)
Derived(b).print() // 输出 10
}
Derived 的超类型列表中的 by-子句表示 b 将会在 Derived 中内部存储。 并且编译器将生成转发给 b 的所有 Base 的方法。
请注意,覆盖会以你所期望的方式工作:编译器会使用你的 override 实现取代委托对象中的实现。如果我们为 Derived 添加 override fun print() { print(“abc”) },该程序会输出“abc”而不是“10”。
7.单例模式
把class声名改成object就可以直接实现单例模式
8.枚举
枚举类的最基本的用法是实现类型安全的枚举
enum class Week{
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}
//Week.Monday
9.印章(密封)类
印章类就是指定个数个子类的类型,而不能有任何其他类型。
sealed class Child{
class Son:Child()
class Daughter:Child()
fun too(){
println("xxxxx")
}
}
fun main(args: Array<String>) {
var first:Child = Child.Son()
var second:Child = Child.Daughter()
}