kotlin主构造函数次构造函数默认参数init代码块初始化顺序(代码片段)

安果移不动 安果移不动     2023-03-09     792

关键词:

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里面有一个 static代码块

他是再类加载到虚拟机的时候初始化

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)

 这些代码初始化的地方挺多的 顺序是怎么样的呢

主构造函数里声名的属性。

类级别的属性赋值。

init初始化块里的属性赋值和函数调用

次构造函数里的属性赋值和函数调用

 

kotlin类与对象②(主构造函数|主构造函数定义临时变量|主构造函数中定义成员属性|次构造函数|构造函数默认参数)(代码片段)

...数四、构造函数默认参数一、主构造函数定义临时变量在Kotlin类中,可以在类声明时在类名后定义"主构造函数";在主构造函数中,可以定义成员属性,并为成员属性提供初始值;在主构造函数中,可以定义临时变量,临时变量一般... 查看详情

kotlin类与继承

类Kotlin使用class关键字声明类,类声明由类名、类头(指定其类型参数、主构造函数等)和由大括号包围的类体组成。类头和类体都是可选的,如果一个类没有类体大括号可省略class NoBody类的构造函数一类可以有一个主构造... 查看详情

kotlin类的初始化③(init初始化块|初始化顺序:主构造函数属性赋值->类属性赋值->init初始化块代码->次构造函数代码)(代码片段)

...目录一、init初始化块二、初始化顺序一、init初始化块在Kotlin类中,可以定义init初始化块,在其中可以为变量赋值,执行一些检查相关的代码,该init初始化块在创建类实例对象时执行;代码示例:在下面的代码中的init初始化块中,对name... 查看详情

kotlin类的初始化③(init初始化块|初始化顺序:主构造函数属性赋值->类属性赋值->init初始化块代码->次构造函数代码)(代码片段)

...目录一、init初始化块二、初始化顺序一、init初始化块在Kotlin类中,可以定义init初始化块,在其中可以为变量赋值,执行一些检查相关的代码,该init初始化块在创建类实例对象时执行;代码示例:在下面的代码中的init初始化块中,对name... 查看详情

kotlin的构造函数看这一篇就够了(代码片段)

在kotlin中,一个标准的继承写法是这样的classAA:BB(),你想过没有,为什么AA后面没有括号,而BB后面有呢?Kotlin和Java中有这样两个特性:1.子类继承父类时,需要在构造函数中调用父类的构造函数2.如果... 查看详情

InjectMocks 不适用于具有默认值的 Kotlin 构造函数参数

】InjectMocks不适用于具有默认值的Kotlin构造函数参数【英文标题】:InjectMocksdoesn\'tworkwithKotlinconstructorargumentswithdefaultvalues【发布时间】:2021-10-2604:47:31【问题描述】:编辑:我用mockito-kotlinhere创建了一张票我有一个这样定义的类... 查看详情

带有 JPA 的 Kotlin:默认构造函数地狱

】带有JPA的Kotlin:默认构造函数地狱【英文标题】:KotlinwithJPA:defaultconstructorhell【发布时间】:2015-11-0908:51:51【问题描述】:根据JPA的要求,@Entity类应该有一个默认(非arg)构造函数,以便在从数据库中检索对象时实例化它们... 查看详情

kotlin类与继承(代码片段)

类kotlin中使用关键字class声明类类声明由类名,类头(指定其类型参数,主构造函数等),花括号包围的类体构成,类头和类体都是可选的。classStudent如果一个类没有类体,则可以省略花括号classEmpty主... 查看详情

python构造函数

一个class只能有一个用于构造对象的__init__函数但python中的变量是无类型的,因此传给__init__的参数可以是任何类python中的函数参数在定义时可以有默认值,可以让__init__函数接受多个参数,在后面的一些参数给出默认值的方法让_... 查看详情

scala-构造函数(代码片段)

/*scala的构造函数分为主构造函数和辅助构造函数。一、主构造函数在Scala中,每个类都有主构造函数,和类的定义交织在一起。一个Scala类的主构造函数包括:1、构造函数的参数;2、类体中调用的方法;3、在类体中执行的语句... 查看详情

kotlin小悟-这个继承有点不一样(代码片段)

今天聊聊kotlin中关于构造函数的一个话题。我们知道,在kotlin中构造函数分为主构造函数和从构造函数,关于详细的内容,可以点击下面的文章链接了解。Kotlin系列之主构造方法和初始化语句块Kotlin系列之从构造方法... 查看详情

IntentService (kotlin) 的默认构造函数

】IntentService(kotlin)的默认构造函数【英文标题】:DefaultconstructorforIntentService(kotlin)【发布时间】:2017-04-0810:49:18【问题描述】:我是Kotlin的新手,并且对intentService有一点点堆栈。清单向我显示了一个错误,即我的服务不包含默... 查看详情

kotlin中定义类field关键字,主构造函数和次构造函数详解(代码片段)

...算属性,和防范竞态条件classStudent//field关键字:Kotlin针对你定义的每个属性,都会产生一个field,一个getter,以及一个setter//field用来存储属性数据,不能直接定义field,kotlin会封装field,保护它里面的数据ÿ... 查看详情

kotlin中定义类field关键字,主构造函数和次构造函数详解(代码片段)

...算属性,和防范竞态条件classStudent//field关键字:Kotlin针对你定义的每个属性,都会产生一个field,一个getter,以及一个setter//field用来存储属性数据,不能直接定义field,kotlin会封装field,保护它里面的数据ÿ... 查看详情

kotlin初学者类和对象(代码片段)

...性次构造器默认值初始化顺序无构造器前言        Kotlin是一门面向对象的开发语言。也有着面向对象语言的特性。而面向对象的三大特性即封装、继承、多态,这是每一门面向对象语言都具有的特性。定义类        使用... 查看详情

kotlin-jpa 插件不生成默认构造函数

】kotlin-jpa插件不生成默认构造函数【英文标题】:kotlin-jpapluginnotgeneratingdefaultconstructor【发布时间】:2019-08-0906:24:09【问题描述】:我正在使用kotlin-jpa为我的kotlin实体生成默认构造函数,但是没有生成:我刚用过:id("org.jetb... 查看详情

深入kotlin-类(代码片段)

类Kotlin中定义类有些地方不同于java。不需要public一个类默认就是public的,所以不用显示地声明一个类为public。不需要花括号如果一个类是空实现,可以不需要classMyClass主构造方法Kotlin规定每个类允许有一个主构造方法和... 查看详情

kotlin语言中的继承与构造函数(详解)(代码片段)

        学习kotlin时,有很多小伙伴无法理解为何有的继承结构父类后面需要加括号,有时候却不用加括号,本篇文章小编将为你们解除这个困惑!顺便为大家详解一下kotlin中的主构造函数和次构造函数。   ... 查看详情