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
原文地址:https://www.cnblogs.com/liumaowu/p/9401445.html