Kotlin学习(3)类
声明类和接口:
//类 class A{ } //接口,接口中的方法可以有默认实现 interface B{ fun show(){ print("i'm B") } } //用冒号代替extends和implements,可以实现多个接口,只能继承一个类 class C:A,B{ } //带参数且有继承的类,参数如果带val,即这个参数在类中默认被初始化,如果不带,这个参数需要在类中自己初始化 class D(val d:Int):A{ } class D(_d:Int){ private val d=_d } //从构造方法 class D{ constructor(d:Int){ //..... } } //带默认参数的类 class E(val e:Int=5){ fun re(){ println(e)} } >>>E(6).re() //打印6 >>>E(5).re() //打印5 >>>E().re() //打印5 //继承的接口拥有同名方法,如F/G接口都有show()方法,则必须重写这个方法,或者指定用哪一个接口方法 class H:F,G{ override fun show(){ //下面的写法会同时调用f和g的show方法 super<F>.show() super<G>.show() } } //抽象类 abstract class I{ //抽象函数,没有实现方法,必须被子类重写 abstract fun i() //抽象类中的方法默认是open的,但也可以标注 open fun i2(){ } }
类中访问修饰符:
修饰符 | 相关成员 | 评注 |
final | 不能被重写 | 类中成员默认使用 |
open | 可以被重写 | 需要明确的表明 |
abstract | 必须被重写 | 只能在抽象类中使用;抽象成员不能有实现 |
override | 重写父类或接口中的成员 | 如果没有使用final表明,重写的成员默认是open的 |
可见性修饰符:
修饰符 | 类成员 | 顶层声明 |
public(默认) | 所有地方可见 | 所有地方可见 |
internal | 模块中可见 | 模块中可见 |
protected | 子类中可见 | ----- |
private | 类中可见 | 文件中可见 |
getter和setter:
可以自定义gtter和setter方法,在每次设置和得到属性之前做一些操作
//每次set都会输出11111 class A{ vae a:String="aaaa" set(value:String){ println("11111") a=value } }
数据类:
data class Client(val name:String, val postalCode:Int) ,这行代码生成了一个数据类。这个类会自动生成equals() toString() HashCode() 等方法。
Object关键字:
这个关键字定义一个类并同时创建一个实例。也就是说,当你定义了这个类,它就已经被声明了。
可以用来创建单例。(单例和顶层函数都是为了可以全局访问,单例的好处是可以继承或实现一些类或接口,可以子类重写方法等)
Object A(){ val a1="aaa" fun a2(){ pintln("aaaaaaa") } } //不用A(), A()实际上相当于Java中new了一个新的对象 >>>A.a1 >>>A.a2()
伴生对象:工厂方法:
Kotlin中并没有static关键字,而是使用顶层函数来使函数被全局访问。但是顶层函数不能访问类的private属性。为了解决这个问题,可以使用工厂方法来替代static。
class A{ companion object(){ fun bar(){ println("it is companion object") } } } >>>A.bar() it is companion object