kotlin练习3

2023-04-26  本文已影响0人  冰楓紫憶
package com.zsw.myandroidlearnapplication.kotlin

import com.zsw.myandroidlearnapplication.java.BaseGouzhao

/**
 *@author zengsuwa
 *@date 2023/4/26
 *@desc 主构造函数
 * 主构造函数 规范来说,都是增加 _XXX 的方式,临时输入类型,不能直接使用,需要接收下来,成为变量才能用
 *
 */
class Base05(_name: String, _sex: Char, _age: Int, _info: String) {
    var name = _name
        //前面不写,默认被public修饰
//        private get() = field //get 不能被private修饰,因为变量被public修饰了,所以get不能私有化
        get() = field
        private set(value) {
            field = value
        }

    fun show() {
//        _name//直接使用报错,临时输入变量,不能直接使用,需要接收下来,成为变量才能用
        println(name)
    }

}

//一步到位的方式 可直接使用
class Base05_1(var name: String, val sex: Char, var age: Int, val info: String) /*主构造*/ {
    fun show() {
        println(name)
        println(sex)
        println(age)
        println(info)
    }
}

//次构造函数
class Base05_2(var name: String = "liyuanba") {

    constructor(name: String = "derry", sex: Char = 'M') : this(name) {
        //会先调用主构造函数再执行以下的代码
        println("2个参数的构造函数name = $name, sex=$sex ")
    }

    constructor(name: String, sex: Char, age: Int) : this(name) {
        println("3个参数的构造函数name = $name, sex=$sex,age=$age")
    }

    constructor(name: String, sex: Char, age: Int, info: String) : this(name) {
        println("4个参数的构造函数name = $name, sex=$sex,age=$age,info = $info")
    }

    fun show() {
        println(name)
//        sex 报错,没有接收
    }
}

class Base05_3(name: String, sex: Char, age: Int) {

    //这个不是Java 的static{}
    //相当于是Java的{} 构造代码块
    //初始化代码块 init块
    init {
        //init中可以使用主构造函数中的变量
        println("init 主构造函数被调用了 $name ,$sex,$age,")

        // require 函数 如果第一个参数是false,就会调用第二个参数的lambda
        require(name.isNotBlank()) {
            "你的name是空的,抛出异常"
        }

        //注意()这里面的条件是反的,当条件不满足时才会执行后面的匿名函数
        require(age > 0) {
            "你的年龄是负数,抛出异常"
        }

        require(sex == '男' || sex == '女') {
            "你的性别很奇怪,抛出异常"
        }
    }

    constructor(name: String) : this(name, '男', 87) {
        println("次构造函数1 被调用了")
    }

    constructor(name: String, sex: Char, info: String) : this(name, sex, 87) {
        println("次构造函数2 被调用了")
    }

    fun show() {
//        println(name) 报错
    }
}

//当调用次构造函数时,会先调用主构造第一步:生成val sex: Char
class Base05_4(name: String, val sex: Char) {
    //第二步生成 val mName = name
    val mName = name//由于你是写在init代码块前面所以先生成你,其实类成员和init代码块是同时生成的

    init {
        //第三步生成 val nameValue
        val nameValue = name
        println("init代码块答应nameValue:$nameValue")

    }

    constructor(name: String, sex: Char, age: Int) : this(name, sex) {
        //第五步生成
        println("name=$name,sex=$sex,age=$age")
    }

    //第四步生成
    val derry = "AAA"
}

/**
 * public Base05_4(@NotNull String name, char sex) {
 * Intrinsics.checkNotNullParameter(name, "name");
 * super();
 * this.sex = sex;
 * this.mName = name;
 * String var4 = "init代码块答应nameValue:" + name;
 * System.out.println(var4);
 * this.derry = "AAA";
 * }
 *
 * public Base05_4(@NotNull String name, char sex, int age) {
 * Intrinsics.checkNotNullParameter(name, "name");
 * this(name, sex);
 * String var4 = "name=" + name + ",sex=" + sex + ",age=" + age;
 * System.out.println(var4);
}
 */


fun main() {
    val base05 = Base05("zhangsan", '男', 15, "一直在学习")
//    base05.name = "" 报错,因为name的set方法私有化了
    val base051 = Base05_1("zhangsan1", '男', 15, "一直在学习")
    base051.show()

    val base052 = Base05_2("zhangshan1")//调用主构造
    val base0520 = Base05_2("zhangsan2", '男')
    val base0521 = Base05_2("zhangsan3", '男', 13)
    val base0522 = Base05_2("zhangsan4", '男', 13, "一直在学习")
    val base0523 = Base05_2()//到底调用哪一个 构造函数 是次构造还是主构造 答:优先调用主构造
    val baseGouzhao = BaseGouzhao()
    val baseGouzhao2 = BaseGouzhao()
    //打印  静态代码块只调用一次,构造代码块比构造方法先调用
    // 这里是静态代码块
    // 这里是构造代码块
    // 这里是构造方法
    // 这里是构造代码块
    // 这里是构造方法

    val base053 = Base05_3("zhangsan3", '男', 13)//主构造
    //打印
    // init 主构造函数被调用了
    val base0531 = Base05_3("zhangsan3")//次构造
    //打印
    // init 主构造函数被调用了
    //次构造函数1 被调用了
    val base0532 = Base05_3("zhangsan3", '男', "hahahah")//次构造
    println("===================")

    //打印
    //init 主构造函数被调用了
    //次构造函数2 被调用了
//    val base0533 = Base05_3("")
    //打印
    //init 主构造函数被调用了  ,M,87,
    //Exception in thread "main" java.lang.IllegalArgumentException: 你的name是空的,抛出异常


}



上一篇下一篇

猜你喜欢

热点阅读