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

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

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


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


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



2 . 可见性修饰符 :



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


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


③ internal : 本模块内 可见 ;


④ public : 所有类都可见 ;




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


1 . 次构造函数格式 :

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

1

2

3


2 . 次构造函数委托主 :



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


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


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

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



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)


目录
相关文章
|
14天前
|
NoSQL Redis Kotlin
Kotlin教程笔记(17) - 属性代理
Kotlin教程笔记(17) - 属性代理
|
2天前
|
NoSQL Redis Kotlin
Kotlin教程笔记(17) - 属性代理
Kotlin教程笔记(17) - 属性代理
10 1
|
4天前
|
NoSQL Redis Kotlin
Kotlin教程笔记(17) - 属性代理
Kotlin教程笔记(17) - 属性代理
|
9天前
|
NoSQL Redis Kotlin
Kotlin教程笔记(17) - 属性代理
Kotlin教程笔记(17) - 属性代理
13 1
|
15天前
|
NoSQL Redis Kotlin
Kotlin教程笔记(17) - 属性代理
Kotlin教程笔记(17) - 属性代理
44 1
|
24天前
|
NoSQL Redis Kotlin
Kotlin教程笔记(17) - 属性代理
Kotlin教程笔记(17) - 属性代理
48 3
|
10天前
|
NoSQL Redis Kotlin
Kotlin教程笔记(17) - 属性代理
Kotlin教程笔记(17) - 属性代理
16 0
|
21天前
|
NoSQL Redis 开发者
Kotlin教程笔记(17) - 属性代理
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速掌握Kotlin语法的读者,建议查看“简洁”系列教程。本文重点介绍了Kotlin的属性代理功能,包括自定义属性代理、延迟属性 `lazy` 和可观察属性 `observable` 及 `vetoable`,并通过示例展示了它们的使用方法和原理。
22 0
|
4月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
139 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
3月前
|
Kotlin
Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
面向对象编程(OOP)是一种编程范式,它通过创建包含数据和方法的对象来组织代码。相较于过程式编程,OOP 提供了更快更清晰的结构,有助于遵守 DRY(Don't Repeat Yourself)原则,使代码更易于维护和扩展。在 Kotlin 中,类和对象是 OOP 的核心。类作为对象的模板,定义了对象的行为和状态;对象则是类的具体实例。例如,`Car` 类可以定义汽车的品牌、型号等属性,以及如驾驶和刹车等功能。通过构造函数可以快速初始化对象的属性。此外,Kotlin 支持继承机制,子类可以从父类继承属性和方法,促进代码重用。
37 2