package set
import java.util.*
import kotlin.math.absoluteValue
//临时变量 只是用一次推荐使用下划线开头
class Player(
_name: String, _age: Int, _isNormal: Boolean //构造参数
) {
//属性
var name = _name
get() = field.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
set(value) {
field = value.trim()
}
//取绝对值
var age = _age
get() = field.absoluteValue
set(value) {
field = age.absoluteValue
}
var isNormal = _isNormal;
}
fun main() {
val p = Player("Jack", 20, true)
p.name = "rose"
println(p.name)
println(p.age)
println(p.isNormal)
}
書き込みを簡略化するために、上記に属性の正方形を配置できます
package set
import java.util.*
import kotlin.math.absoluteValue
//临时变量 只是用一次推荐使用下划线开头
class Player(
_name: String,
var age: Int,
var isNormal: Boolean //构造参数
) {
//属性
var name = _name
get() = field.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
set(value) {
field = value.trim()
}
}
fun main() {
val p = Player("Jack", 20, true)
p.name = "rose"
println(p.name)
println(p.age)
println(p.isNormal)
}
Javaの場合、this.age=ageなどの操作を減らすことです。
よく知られています。javaで複数のコンストラクターを作成できます。kotlinで実装する方法
次に、セカンダリコンストラクタについて説明します。
package set
import java.util.*
import kotlin.math.absoluteValue
//临时变量 只是用一次推荐使用下划线开头
class Player(
_name: String, var age: Int, var isNormal: Boolean //构造参数
) {
//属性
var name = _name
get() = field.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
set(value) {
field = value.trim()
}
//次构造函数
constructor(name: String) : this(name, age = 20, isNormal = false) {
//里面可以对代码进行操作
this.name = name.uppercase(Locale.getDefault());
}
}
fun main() {
val p = Player("Jack", 20, true)
p.name = "rose"
println(p.name)
println(p.age)
println(p.isNormal)
val p2 = Player("Jack Liu")
println(p2.name)
}
セカンダリコンストラクタは、プライマリコンストラクタを呼び出して、デフォルト値を初期化して提供する必要があります。
デフォルトパラメータ
実際、二次コンストラクターの使用シナリオは、二次コンストラクターでは実行されません。コンストラクターで記述できます
package set
import java.util.*
import kotlin.math.absoluteValue
//临时变量 只是用一次推荐使用下划线开头
class Player(
_name: String, var age: Int=20, var isNormal: Boolean=false //构造参数
) {
//属性
var name = _name
get() = field.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
set(value) {
field = value.trim()
}
}
fun main() {
val p = Player("Jack", 20, true)
p.name = "rose"
println(p.name)
println(p.age)
println(p.isNormal)
val p2 = Player("Jack Liu")
println(p2.name)
}
以下のinitコードブロックをご覧ください
以前はJavaに静的コードブロックがありました
クラスが仮想マシンにロードされるときに初期化されます
initの初期化ブロックはいつ実行されますか?
関数が再構築されたときに実行されます。
渡された値を確認するために使用できます
package set
import java.util.*
import kotlin.math.absoluteValue
//临时变量 只是用一次推荐使用下划线开头
class Player(
_name: String, var age: Int = 20, var isNormal: Boolean = false //构造参数
) {
//属性
var name = _name
get() = field.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
set(value) {
field = value.trim()
}
init {
//检查是否
require(age > 0) { "age 必须大于0" }
require(name.isNotBlank()) { "姓名必须设置" }
}
}
fun main() {
val p = Player("Jack", 20, true)
p.name = "rose"
println(p.name)
println(p.age)
println(p.isNormal)
val p2 = Player("Jack Liu")
println(p2.name)
val p3 = Player("Jack Liu", age = 0)
}
これらのコードが初期化される場所が多い順序は何ですか?
プライマリコンストラクタで宣言されたプロパティ。
クラスレベルの属性割り当て。
初期化ブロックでのプロパティの割り当てと関数呼び出し
二次コンストラクターでのプロパティの割り当てと関数呼び出し