【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )(一)

简介: 【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )(一)

I . 主构造函数


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 ;




目录
相关文章
|
7月前
|
IDE Java 编译器
Kotlin属性访问器与方法签名冲突的问题
Kotlin属性访问器与方法签名冲突的问题
51 0
|
8月前
|
API Kotlin
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
75 0
|
8月前
|
安全 Java Kotlin
Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解
Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解
84 0
|
8月前
|
Java 编译器 Kotlin
Kotlin 中变量,类型,表达式,函数详解
Kotlin 中变量,类型,表达式,函数详解
68 0
|
4月前
|
XML JSON Android开发
[Android]使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换
[Android]使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换
54 0
|
4月前
|
Kotlin
kotlin获取属性注解
kotlin获取属性注解
49 0
|
6月前
|
Cloud Native Go Kotlin
Kotlin 环境下解决属性初始化问题
Kotlin 环境下解决属性初始化问题
27 0
|
6月前
|
存储 Java 编译器
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(下)
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(下)
32 0
|
6月前
|
Java Android开发 开发者
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上)
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上)
44 0
|
8月前
|
安全 Java 编译器
Kotlin 学习笔记(一)—— 基本类型、函数、lambda、类与对象的写法
Kotlin 作为 Android 开发的首选语言,其基础语法和特性需要重点学习。本文概括总结了 Kotlin 的基本类型、关键字、函数、闭包、高阶函数、类与对象等核心知识点,并给出示例代码进行讲解。
150 0
Kotlin 学习笔记(一)—— 基本类型、函数、lambda、类与对象的写法