美文网首页
kotlin练习3

kotlin练习3

作者: 冰楓紫憶 | 来源:发表于2023-04-26 15:11 被阅读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是空的,抛出异常
    
    
    }
    
    
    
    

    相关文章

      网友评论

          本文标题:kotlin练习3

          本文链接:https://www.haomeiwen.com/subject/rypvjdtx.html