Kotlin Class 自定义类

1.Kotlin 结构器写法有4种

1.1 第一种写法 相似Java
/** * 默认类  就是 public类型,并且成员变量也是 public类型 */class Dog {    //成员必须 初始化 ,不像Java    var name: String = ""    var age: Int = 0    //结构器第一种写法 相似Java    constructor(name: String, age: Int) {        this.name = name        this.age = age    }}
1.2 第二种写法,间接在类名前面写
/** * 结构器的第二种写法 间接写在类名的前面 */class Dog2 constructor(name: String, age: Int) {    var name = name    var age = age}
1.3 第三种写法,间接把constructor 省略
/** * 结构器的第三种写法, 相似下面的,间接把constructor省略 */class Dog3(name:String,age:Int){    val name =}
1.4 举荐!间接在结构器中定义了接管参数
/** * 举荐!!! * * 结构器的第四种写法, 间接在结构器中定义好参数 省略了自定义参数接管结构器 */class Dog4(var name:String, var age: Int){}

2. 应用自定的Class

/** * 自定义定义Class */fun main(args: Array<String>) {    val candyDog = Dog("candy", 23)    println(candyDog.age)    println(candyDog.name)            //举荐的写法 ,它能够间接定义进去成员变量 name 和 age     val candyDog4 = Dog4("candy",25)    println(candyDog4.name)    println(candyDog4.age)    val candyDog3 = Dog3("candy",25)    //println(candyDog3.name)// 报错,因为没有自定义name变量}

3.自定义接口

省区了public ,默认都是public

interface SimpleInfo{    fun simpleMethod()}

实现: 通过 :接口名称 去实现

class SimpleClass(var x:Int) :SimpleInfo{    //override 强制须要,揭示你复写了什么办法    override fun simpleMethod() {    }}java中@Override 并且不是强制的

4. 抽象类

abstract class AbsClass{      //形象办法 不须要办法体,须要被重写    abstract fun absMethod()        //默认是 final 办法 子类不能重写    fun abspriviteMethod2(){}        //open关键字 示意子类能够去重写    open fun absPublicMethod3(){}}
open class AbsChild(var x: Int) : AbsClass() , SimpleInfo{    override fun simpleMethod() {        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.    }    override fun absMethod() {        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.    }    //给该办法指定了 final 则 子类AbsChild2 无奈重写它    final override fun absPublicMethod3() {    }}class AbsChild2(var y: Int) : AbsChild(y) {    override fun simpleMethod() {    }    override fun absMethod() {    }      //无奈重写absPublicMethod3 }

5.Property

java 定义类中的属性

public class Person {    private int age;    private String name;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

kotlin只须要这样写 即实现了get set

class Person(age: Int, name: String) {    var age: Int = age    var name: String = name}

kotlin中类的属性 和Java中有点区别 (kotlin的幕后属性才和java的field对应)

接口不能有

age是一个property类型,它外部的field才和java的属性对应,age 默认会带有get set办法,也能够重写get set办法

class Person(age: Int, name: String) {    var age:Int = age    get() {        println("get field $field")        return field    }    set(value) {        println("set field $field")    }    var name:String=name //name 这个 property 曾经默认带了 get set 办法}

属性援用:

属性援用和办法援用相似 通过 类名::属性/对象::属性

val noReceiverAgeRef = Person::age //这种是没有绑定receiver的 属性援用

val receiverAgeRef = person::age //这种是绑定了receiver的 属性援用

fun main(args: Array<String>) {    //实例化    val person = Person(23, "Johnny")    println(person.age) //间接办法属性    println(person.name)      //绑定了receiver 的 援用    val ageRef = person::age    //通过property去掉用get set    ageRef.set(25)    println(ageRef.get())        //未绑定receiver    val noReceiverAgeRef = Person::age    val person2 = Person(99, "candy")    //未绑定receiver时候 调用set get须要先绑定    noReceiverAgeRef.set(person2, 55)    println(noReceiverAgeRef.get(person2))}
欢送大家拜访 集体博客 Johnny小屋
欢送关注集体公众号