1 . 构造函数个数 : Kotlin 类定义时需要指定主构造函数 , 还可以指定 0 ~ 多个次构造函数 ;

2 . 主构造函数定义 : 主构造函数与类定义在一起 , 构造函数定义在类名后 , 格式为 constructor( 构造函数参数列表 ) ;

3 . 主构造函数标准定义格式 : 主构造函数与 class 类名 定义在一次 , 紧跟在类名后面 ;

class 类名 constructor( 构造函数参数 ){
	//类成员

4 . 主构造函数省略 constructor 关键字定义格式 : 如果主构造函数 没有 ① 可见性修饰符 或 ② 注解 , 可以省略该关键字 , 类名后面直接跟上构造函数的参数列表 ;

//主构造函数 : 省略了类名后的 constructor 关键字
class 类名 ( 构造函数参数 ){
	//类成员

5 . 主构造函数定义示例 :

① 标准格式的主构造函数 :

标准的主构造函数 class Student constructor(name : String, age : Int){

② 省略 constructor 关键字的主构造函数 :

省略 constructor 关键字的主构造函数 省略 constructor 前提 : ① 主构造函数没有可见性修饰符 , 如 private , public , protected , internal ② 主构造函数没有注解 class Student (name : String, age : Int){

II . 主构造函数声明属性

在类中声明属性可以在类中使用 var / val 属性名称 : 属性类型 声明属性 , 也可以在主构造函数中声明属性 ;

① 正常的主构造函数 : 构造函数是普通的构造函数 , 类属性字段在类体中定义 ;

主构造函数中不声明属性 ; class Student constructor(name : String, age : Int){ var name : String = name var age : Int = age

② 主构造函数中声明属性 : 在主构造函数中 , 可以直接声明类中的属性 , 下面的代码 与 上面的代码是等价的 ;

主构造函数中不声明属性 ; class Student constructor(var name : String, var age : Int){

III . init 初始化代码块

1 . init 代码块引入 : 主构造函数没有函数体 , 不能执行任何代码 ; 主构造函数的初始化相关操作可以放在 init 初始化代码块中 ;

2 . init 初始化代码块 : 一个类中可以定义多个 init 代码块 , 其执行顺序是按照代码顺序从上到下执行 ;

3 . 代码执行顺序 : init 初始化代码块 , 与类的属性定义优先级相同 , 在类对象实例初始化时 , 会按照在类中定义的顺序 , 依次执行类属性初始化和 init 初始化代码块 ;

4 . 代码执行顺序示例 : 类对象初始化时 , 代码执行顺序是 : 代码 ① -> 代码 ② -> 代码 ③ -> 代码 ④

class Student constructor(name : String, age : Int){
	//代码 ① 
    init {
        println("主构造函数参数 : name : ${name} , age : ${age} ;")
    //代码 ② : 等号右边的 name 是构造函数参数值
    var name : String = name + " L"
    //代码 ③ : 等号右边的 age 是构造函数参数值
    var age : Int = age + 1
	//代码 ④ 
    init {
        println("成员变量 : name : ${this.name} , age : ${this.age} ; 主构造函数参数 name : ${name} , age : ${age} ;")

IV . 主构造函数参数 和 成员变量访问方式

1 . 主构造函数参数访问性 : 可以在 类属性字段初始化赋值 init 初始化代码块中 访问主构造函数中的参数变量值 ;

2 . 两种变量的访问方式 : 如果构造函数 与 成员变量重名 , 使用 this.变量名 访问的是成员变量 , 使用 变量名 访问的是 构造函数参数变量 ;

3 . 构造函数参数 与 成员变量访问 示例代码及解析 :

① 构造函数参数访问 : 使用 name 和 age , 访问的是构造函数的参数 , 不能访问成员变量 ;

② 成员变量访问 : 使用 this.name 和 this.age 才能访问对象的成员变量 ;

class Student constructor(name : String, age : Int){
    init {
        println("主构造函数参数 : name : ${name} , age : ${age} ;")
    //等号右边的 name 是构造函数参数值
    var name : String = name + " L"
    //等号右边的 age 是构造函数参数值
    var age : Int = age + 1
    init {
        println("成员变量 : name : ${this.name} , age : ${this.age} ; 主构造函数参数 name : ${name} , age : ${age} ;")
fun main() {
    var student : Student = Student("Tom" , 18)

执行结果 :

主构造函数参数 : name : Tom , age : 18 ;
成员变量 : name : Tom L , age : 19 ; 主构造函数参数 name : Tom , age : 18 ;

V . 主构造函数 可见性 设置

1 . 构造函数可见性 : 主构造函数默认是 public 可见性 , 如果将该构造函数设置成 private , 那么 constructor 关键字必须要有 ;

class 类名 private constructor( 构造函数参数 ){
	//类成员

2 . 可见性修饰符 :

① private : 类内部可见 , 所有其它类不可见 , 包括子类 ;

② protected : 本类 和 子类可见 , 其它类不可见 ;

③ internal : 本模块内 可见 ;

④ public : 所有类都可见 ;

VI . 次构造函数 ( 常用情况 )

1 . 次构造函数格式 :

constructor ( 构造函数参数列表 ) : this ( 主构造函数参数列表 ){
	//次构造函数体

2 . 次构造函数委托主 :

① 委托方式 : 使用 : this ( 被委托的构造函数参数列表 ) 方式 , 直接或间接委托给主构造函数 ;

② 直接委托 : 每个次构造函数必须委托给主构造函数 ( 直接委托主构造函数 ) ,

③ 间接委托 : 委托给其它次构造函数 ( 间接委托主构造函数 ) ;

VII . 次构造函数 ( 没有主构造函数 )

如果类没有主构造函数 , 那么可以直接声明 次构造函数 , 不同委托给主构造函数 ;

class Person {
	constructor ( 次构造函数参数列表 ) {
		//次构造函数体

VIII . 构造函数 代码执行顺序

1 . 代码执行顺序 : 先执行主构造函数 , 此时会初始化成员属性 与 执行 init 初始化代码块 , 然后执行次构造函数内容 ;

2 . 初始化代码块 : init 代码块等同于主构造函数的函数体 , 当次构造函数将操作委托给主构造函数时 , 会先执行 init 初始化代码块 , 然后再运行次构造函数体 ;

IX . 调用 主构造函数 / 次构造函数 创建类实例对象

1 . 创建实例对象 : Kotlin 中没有 new 关键字 , 使用 类名 ( 构造函数参数列表 ) 方式 , 创建类对象实例 ;

2 . 示例代码 :

package construct
    标准的主构造函数
class Student constructor(name : String, age : Int){
    init {
        println("主构造函数参数 : name : ${name} , age : ${age} ;")
    //等号右边的 name 是构造函数参数值
    var name : String = name + " L"
    //等号右边的 age 是构造函数参数值
    var age : Int = age + 1
    init {
        println("成员变量 : name : ${this.name} , age : ${this.age} ; 主构造函数参数 name : ${name} , age : ${age} ;")
    //身高成员变量
    var height : Int = 0;
    constructor(name : String, age : Int, height : Int) : this(name, age){
        this.height = height
    override fun toString(): String {
        return "Student(name='$name', age=$age, height=$height)"
    省略 constructor 关键字的主构造函数
    省略 constructor 前提 :
        ① 主构造函数没有可见性修饰符 , 如 private , public , protected , internal
        ② 主构造函数没有注解
class Student1 (name : String, age : Int){
fun main() {
    //调用主构造函数
    var student : Student = Student("Tom" , 18)
    println(student)
    //调用次构造函数
    var student2 = Student("Jerry", 18, 165)
    println(student2)

3 . 执行结果 :

主构造函数参数 : name : Tom , age : 18 ;
成员变量 : name : Tom L , age : 19 ; 主构造函数参数 name : Tom , age : 18 ;
Student(name='Tom L', age=19, height=0)
主构造函数参数 : name : Jerry , age : 18 ;
成员变量 : name : Jerry L , age : 19 ; 主构造函数参数 name : Jerry , age : 18 ;
Student(name='Jerry L', age=19, height=165)
                    I . 主构造函数II . 主构造函数声明属性III . init 初始化代码块IV . 主构造函数参数 和 成员变量访问方式V . 主构造函数 可见性 设置VI . 次构造函数 ( 常用情况 )VII . 次构造函数 ( 没有主构造函数 )VIII . 构造函数 代码执行顺序IX . 调用 主构造函数 / 次构造函数 创建类实例对象
如果类有一个构造函数,每个构造函数需要委托构造函数, 可以直接委托或者通过别的构造函数间接委托委托到同一个类的另一个构造函数用this关键字即可
这句话就是说如果一个类有构造函数,只要他还有构造函数就必须调用构造函数,方式可以不同
方式1:每个构造函数调用构造函数
class Parent(name: String) {
    var age = 0;
    va...
				
任何一个面向对象编程的语言都会有构造函数的概念,kotlin中也有,但是kotlin构造函数分为了两种:构造函数构造函数 构造函数将会是最常用的构造函数,每个类默认会有一个不带参数的构造函数,当然也可以给他指明参数,构造函数的特点是没有函数体,直接定义在类名后面即可: class Student(val sno: String, val grade: Int) : Person() { 这表明我们在实例化这个类的时候必须传入构造方法中要求的所有参数: val student = Stude
Kotlin中,构造函数Constructor)是一个类似于方法的代码块。 声明构造函数的名称与类的名称相同,后跟括号()。 构造函数用于在创建对象初始化变量。构造函数也叫构造Kotlin 中的构造器类型 在kotlin构造函数分为构造函数(Primary Constructor)和构造函数(Secondary constructory) 构造函数 Primary Constructor 构造函数定义 构造函数用于初始化类,它在类标题中声明,定义如下: class Person co
只要是面向对象的语言,就会有构造函数的概念,那啥是构造函数,其实就是你初始化类时调用的函数,在kotlin构造函数分为构造函数构造函数kotlin构造函数是在类名后面括号表示的,注意这里和java不一样,java中和类名相同的函数就是构造函数,且不分构造函数构造函数。 没有参数的构造函数 当没有参数时,也可以去掉括号,这样默认构造函数为无参构造,但是注意如果此时定义一个下文中说的构造函数,那么此类就没有构造函数了,学过java的就很好理解,java中仅定义个有参构造方法,那么
class MainActivity : AppCompatActivity() class MainActivity : AppCompatActivity(),View.OnClickListener 注意1:Kotlin的类默认都是public f... //临时变量 只是用一推荐使用下划线开头 class Player( _name: String, _age: Int, _isNormal: Boolean //构造参数 //属性 var name = _name get() = field.replaceFirstChar { if (it.isLowerCase...
【错误记录】Android Studio 编译报错 ( Could not resolve com.android.tools.build:gradle:7.4.2. ) ᰔᩚ. 一怀明月ꦿ: 【CSS】课程网站 网格商品展示 模块制作 ③ ( 清除浮动需求 | 没有设置高度的盒子且内部设置了浮动 | 使用双伪元素清除浮动 ) 我是夜阑的狗: 非常实用,博主介绍的非常详细,学到了许多新知识,希望大佬也能对我的文章指点下! 【CSS】课程网站 网格商品展示 模块制作 ③ ( 清除浮动需求 | 没有设置高度的盒子且内部设置了浮动 | 使用双伪元素清除浮动 ) 爱吃饼干的小白鼠: 写的很详细!通俗易懂