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是空的,抛出异常
}
网友评论