文章目录

  • I . 主构造函数
  • II . 主构造函数声明属性
  • III . init 初始化代码块
  • IV . 主构造函数参数 和 成员变量访问方式
  • V . 主构造函数 可见性 设置
  • VI . 次构造函数 ( 常用情况 )
  • VII . 次构造函数 ( 没有主构造函数 )
  • VIII . 构造函数 代码执行顺序
  • IX . 调用 主构造函数 / 次构造函数 创建类实例对象

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 = namevar 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 + 1init {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 + 1init {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)

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

  1. 【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )

    文章目录 I . 属性 字段 总结 II . 属性声明 III . 属性初始化器 IV . get / set 属性访问器 V . 属性幕后字段 field VI . 变量和常量的区别 VII . 延 ...

  2. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    构造函数 public HelloA(){//构造函数} 关于构造函数,以下几点要注意: 1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的. 2.构造函数的作用是 ...

  3. [转载] Java静态代码块/构造代码块/构造函数/静态变量/成员变量(相关示例)

    参考链接: Java程序的输出| 构造函数 近期做牛客网的Java开发笔试题,发现这类型的题目较多,很容易混淆,特将相关概念和相关示例整理如下,供大家参考^_^ 1. 静态代码块在类加载时即运行,而且 ...

  4. 静态代码块、构造代码块、构造函数、普通代码块的区别

    本文转自:IT可乐的博客 在Java中,静态代码块.构造代码块.构造函数.普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序. 1.静态代码块 ①.格式 在java ...

  5. java gui构造工具_Java Web框架 静态代码块、构造代码块、构造函数、普通代码块 执行顺序 Decompiler JD-GUI 反编译工具...

    1.下载jd-gui-windows-1.4.0. http://jd.benow.ca/ 2.通过jd-gui.exe查看.class文件,用于分析类编译过程. 3.源文件. // 加载相应的 He ...

  6. 静态代码块、非静态代码块、构造函数执行顺序

    静态代码块.非静态代码块.构造函数执行顺序 /*** 类的实例化顺序,静态代码块.非静态代码块.构造函数.* @author MING*/ class Person {static String na ...

  7. 面向对象2(构造函数、实例对象、原型对象——关系理解)

    参考解释: 对象原型 构造函数与实例对象 构造函数与实例对象 关系: 实例对象是通过构造函数来创建的,创建的过程叫实例化. 示例代码: //1.自定义构造函数 function Person(name ...

  8. 有参构造函数调用无参构造函数,构造代码块会执行两次么?

    测试代码demo: import java.util.concurrent.atomic.AtomicInteger;/*** 有参调用无参方法,构造代码块会执行两次么?*/ public class ...

  9. smali语言详解之static静态代码块的声明与静态变量初始化赋值位置

    smali语言详解之static静态代码块的声明与静态变量初始化赋值位置 一.smali语言的静态代码块声明格式 .method static constructor <clinit>() ...

最新文章

  1. 散列表查找(哈希表)
  2. java判斷素數,算法改進 | java語言中判斷素數
  3. 快醒醒,一大波最新 AI 论文加开源代码来袭!
  4. boost::hana::suffix用法的测试程序
  5. Visual Studio 2008在设计视图和代码视图切换的快捷键F7
  6. 怎么实现阵列装配_第九篇:磁盘阵列和群晖SHR
  7. java提高篇之抽象类与接口
  8. ASP.Net中无刷新执行Session身份验证
  9. Python网络爬虫开发实战,关于过程中的异常处理
  10. oracle用户被锁
  11. 迁移学习中使用下载好的权重
  12. [转载] Java——System.exit()用法及个人理解
  13. SQL:postgresql中查询日期date的方法
  14. java 读取wav采样数据_读取wav文件中的音频数据操作
  15. SharePoint Backup
  16. cad导出pdf_“又”一款免费的CAD批量导出PDF、DWF、PLT神兵利器
  17. mysql jemalloc_MySQL性能测试--jemalloc内存管理
  18. 计算机基础作业题及答案,计算机文化基础习题集(含答案)
  19. Win7进入mysql环境命令_怎样在win7中使用命令行启动mysql数据库服务
  20. SAP在华真相:天价收费与用户之灾

热门文章

  1. 微软在你的计算机里隐藏的秘密
  2. asp.net core mvc 异步表单(Ajax.BeginForm)
  3. [Github]watch和star的区别
  4. Windows下通过MinGW进行WxWidgets的动态编译与静态编译
  5. Java Daemon线程
  6. 基于NHibernate的三层结构应用程序开发初步
  7. chm文件无法正常显示
  8. 【引用】JS刷新当前页面
  9. POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘...
  10. 有用的Python资料