乐趣区

关于java:Kotlin-Class-自定义类

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 小屋
欢送关注集体公众号

退出移动版