Kotlin关键字二——constructor和init

Kotlin构造函数原理:从语法糖到JVM字节码深度解析 Kotlin构造函数并非Java的简单映射,而是一套融合语法声明、编译期契约与JVM字节码规范的三层机制。其核心在于参数前缀(val/var)决定字段生成与访问控制,主次构造函数通过强制委托保障初始化一致性,而编译器自动注入的空安全检查(如checkNotNullParameter)和@Metadata元数据则构成ABI兼容性基石。这些设计直接影响Java互操作、ProGuard混淆、反射调用及序列化行为——例如@JvmOverloads本质是生成多签名字节码构造函数,init块则被编译器内联至每个<ini 阅读详情

在关键字一——var和val中最后提到了构造函数,这里就学习下构造函数相关的关键字: constructor和init。

主要构造(primary constructor)

kotlin和java一样,在定义类时就自动生成了无参构造

// 会生成默认的无参构造函数
class Person{
}

与java不同的是,当kotlin的构造函数中必须带参数时,则需要在类名后面直接添加参数:

class Person(var name:String, var age:Int){
}

这种在类名后面添加参数(包含无参)的构造方法就称为主要构造(primary constructor)

次要构造(secondary constructor)

当类包含多个构造函数时,需要通过次要构造实现, 次要构造需要用constructor关键字修饰:

// primary constructor
class Person(var age: Int, var name: String) {
	// secondary constructor
    constructor(name: String) : this(18, name = name)
}

次要构造使用上需要注意:

  • 次要构造需要直接或间接调用主要构造
    // primary constructor
    class Person(var age: Int, var name: String) {
    	// 会提示: Primary constructor call expected
        constructor(name: String)
    }
    
  • 次要构造中不能声明类的属性,即不能使用var或val
    class Person(var age: Int, var name: String) {
        constructor(name: String) : this(age = 18, name)
        
    	// 提示'var' on secondary constructor parameter is not allowed
        constructor(var address:String, name: String):this(name)
    }
    

init

kotlin提供了一个方法init,当有多个构造方法,无论使用哪个构造方法都会调用到init方法:

// 调用 Person("xiao ming")或者 Person(16, "小明")后 都会输出
// I am a person
class Person(var age: Int, var name: String) {
    constructor(name: String) : this(age = 18, name)
    
    init {
        System.out.println("I am a person")
    }
}

可以看下实现原理:

public final class Person {
   public Person(int age, @NotNull String name) {
      super();
      this.age = age;
      this.name = name;
      // init方法
      System.out.println("I am a person");
   }

   public Person(@NotNull String name) {
      this(18, name);
   }
}

可以看到kotlin构造的执行顺序是
主构造——>init()——>次要构造

Kotlin构造函数原理与实战排障:从字节码到Android ViewModel初始化 Kotlin构造函数不是Java语法糖,而是决定对象生命周期、反射行为和跨语言互操作的核心机制。其主构造、次构造与init块构成三层初始化契约,直接影响属性初始化顺序、继承委托链和JVM字节码生成。理解这一机制,是解决Android中ViewModel实例化失败、NoSuchMethodError、superclass access check failed等高频问题的关键。它支撑着@JvmOverloads的重载生成逻辑、data class的copy安全机制,以及inline函数对lambda逃逸的编译 阅读详情

相关推荐

【UV打印机】PrintExp打印软件教程(二)-主界面介绍

PrintExp软件主界面如下图所示PrintExp软件的主界面主要包括主菜单区,工具栏区,界面显示区,状态栏。以下是上述部分的介绍。

Print World的专栏 6299

Kotlin - 构造函数 constructor

有可见性修饰或注解的时候,constructor 不能省略。写法和Java类似。次构造不能委托给主构造,因为没有主构造。主构造使用默认参数简化次构造重载。次构造使用委托调用主构造。

HugMua的博客 4980

【论文精度】生成式预训练模型——BART(Bidirectional and Auto-Regressive Transformers)

​ BART是一个预训练的seq2seq的去噪自编码(denoising autoencoder)模型,BART以下方式进行训练①用任意的噪声函数(noising function)去破坏文本;②学习一个模型来重建原始文本。它使用一个标准的基于transformer的神经机器翻译架构,可以看作是BERT(双向编码器)、GPT(left-to-right解码器)以及其他预训练方案的推广。

weixin_45828972的博客 7446

Kotlin的构造函数Constructor

一、构造函数 kotlin里面的构造函数分为主构造函数和次构造函数。主构造函数只能有一个,次构造函数个数不限制,可以有一个或者多个。 1.主构造函数 //一般的主构造写法 class Student constructor(){ } //当主构造方法没有任何注解或者可见性修饰符时,可以省略(),写成下面这样 class Student { } //主构造方法如下,跟在类名后面,有参数 class Student constructor(name:String)...

sunbinkang的博客 6617

Accelstepper 库中的参数计算公式

要完全调试电机的各个参数,例如最大速度,加速度等,就需要了解其计算公式和原理。 以下是代码注释: /// This code uses speed calculations as described in /// "Generate stepper-motor speed profiles in real time" by David Austin/// http://fab.cba.mi...

wenguitao的博客 4455

DCA决策曲线的解读和代码实现

0.决策曲线 决策曲线分析法(Decision Curve Analysis,DCA)是个与ROC曲线相提并论的相对比较新的模型评价方法。 关于它的原理,长篇大论的医学统计学知识解读实在不是我的强项,放上两个链接偷偷懒: https://www.plob.org/article/12455.html https://www.iikx.com/news/statistics/1622.html 如果想看文章,这篇里的fig7就是:https://www.ncbi.nlm.nih.gov/pmc/artic

weixin_42960896的博客 1万+

Kotlin构造函数(constructor)完全解析

简要介绍 Kotlin的类必须有一个主构造函数,可以有多个次要构造函数. 主构造函数 1. 写法一(主构造函数初始化代码在init块中) class User constructor(name: String) { val name: String init { this.name = name } } 2. 精简写法 class User constructor(name: String) { ...

蓝不蓝编程 1万+

Calibre提参实战:如何用hcell和xcell文件精准屏蔽模块(附避坑指南)

本文详细解析了Calibre提参过程中hcell和xcell文件的应用技巧,帮助工程师精准屏蔽模块以优化寄生参数提取。通过对比hcell与xcell的核心差异、图形界面与命令行操作指南,以及常见问题排查方法,提升芯片后端设计效率。附避坑指南,解决EETOP论坛热议的模块丢失问题。

weixin_26795617的博客 438

Kotlin中init代码块和构造方法以及伴生对象中代码的调用时机及执行顺序

在Kotlin中,init代码块的到底是什么时候执行的呢,和构造方法以及伴生对象一起使用时顺序又是怎样的呢?下面我们来详细看一下

喻志强的博客 4万+

ADS谐波平衡仿真自动优化报错?三步搞定HB控件设置(附常见错误排查)

本文针对ADS谐波平衡仿真在自动优化中常见的报错问题,提供了三步核心排查法。首先检查并禁用HB控件中可能导致冲突的小信号仿真模式,其次合理化仿真频率与扫描参数设置,最后审视优化变量与目标的定义。通过精准配置HB控件以适配自动优化流程,能有效解决大多数仿真失败问题,确保非线性电路设计顺利进行。

c2d3e4f的博客 787

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.5 RTC设备编写与实现

4. Linux kernel RTC子系统goldfish_rtc driver分析。电脑,会需要时间,还比如 我们的手机、平板,都需要时间;驱动基本就是应用层需要什么数据你给什么数据就行,基本必须实现的就是。3.2 Linux kernel RTC 设备描述符讲解。中看到他的具体实现,也可以根据他的寄存器描述直接在。5. 将驱动添加进kernel和测试RTC驱动。系统来说,时间是一个非常重要的功能;之类的函数接口,接下来我们就开始讲解如何写。,所以我们直接移植设备树即可。,他的寄存器很简单,你可以从。

DSMGUOGUO的博客 568

kotlin中 init、constructor、companion object 调用顺序

fun main() { Human() Human.instance } class Human { private var work: String = "医生" constructor() { println("主构造方法 constructor") } constructor(name: String) { println("带参数构造方法 constructor $name") } i...

Dream It Possible 2304

汽车安全新防线|基于AI的入侵检测系统开发(全网独家复现),CNN-BiLSTM融合改进篇 强化CAN总线数据感知、助力多类型入侵检测、实时响应预警、车载场景有效落地

基于AI的入侵检测系统是汽车网络安全领域的重要技术突破,能够有效应对日益复杂的网络攻击威胁。随着AI技术的不断发展和普及,AI入侵检测系统将在汽车安全领域发挥越来越重要的作用。对于汽车制造商和供应商来说,实施AI入侵检测系统不仅是保障车辆安全的需要,也是提升市场竞争力的重要手段。未来,AI入侵检测系统将成为智能汽车的标准配置,为用户提供更加安全、可靠的驾驶体验。

getusushu的博客 85

Kotlin--constructor构造函数

一:class className([car/val] property: Type…) 这种方式和上面一种方式多加了一组括号,代表构造函数,我们把这样的构造函数称之为primary constructor。这种方式声明一个类的主要做了一下几件事: 会生成一个构造方法,参数就是括号里的那些参数 会根据括号的参数生成对应的属性 会根据val和var关键字来生成setter、getter方法 关键字...

u012693479的博客 1478

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Kotlin系列课程——关键字

fun :表示定义一个函数或者方法fun main(){}var: 表示可变变量var name :String ="小郭"val:表示不可变变量val age :Int =18in : 表示区间范围,必须从小大 in 1..4 表示1234step:表示区间增值范围in 1..5 step 2 表示135until :排除区间最后一位值in 1..5 until 表示1234init :表示

android_gjw的博客 565

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Kotlin基础之构造方法

kotlin 构造函数

liuqinhou的博客 1359

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

kotlin的主次构造函数初识

对Kotlin语法的初识,了解kotlin的主次级构造方法,并且与java的语法进行对比。

Homjay的博客 914

kotlin开发Android入门篇二类的使用与创建

讲解类基本使用以及抽象类数据类枚举类嵌套类等用法以及类中一些常用的关键字是用

易庞宙的博客 1万+

Kotlin入门(四)——类

参考         官网 class         通过class关键字定义一个类。         Kotlin中所有的类都继承于Any类,Any类中只有hashCode,toString以及equals三个方法。         一个类由类名、类头以及类的主体——被大括号包裹起来的就是类的主体——三部分组成。其中类头,类主体是可选的。如果没有类主体,则大括号可以省略。如:

飞鸟 1008

十一、Kotlin学习之构造方法

一、初始化类:主构造方法和初始化语句块 通常来讲,类的所有声明应该在花括号里面。这里面被括号括起来的叫主构造方法 class Animal(val name: String) 主构造方法主要目的: 1.表明构造函数参数; 2.定义使用这些参数初始化属性 让我们来揭示他的工作原理: class Animal constructor(_name: String) {//带一个参数的主构造函数 ...

lynnlee_36的博客 333

Kotlin学习-构造函数

Kotlin学习-构造函数

转载和创作优秀的博客 537

Kotlin 基础教程二

扩展 可以给成员属性加上指定函数 比如 需传入Float 可以写成 fun Float.getValue(){this == Float}然后可以1f.getValue 如果和之前定义的函数名和参数相同 一般会执行之前的函数, 静态解析。:: 传入方法 函数, fun setClick(listener : (View) -> Unit) --- v.setOnClick(::Click): "data"?forEach 遍历 {值 : List ->} 可以简化为 {it , it=值}

qq_29769851的博客 898

Kotlin类继承语法与最佳实践详解

面向对象编程中的继承机制是实现代码复用的核心技术,Kotlin通过独特的语法设计提升了类型安全性。与Java不同,Kotlin默认所有类都是final的,必须显式使用open关键字才能被继承,这种设计有效避免了脆弱基类问题。方法重写必须使用override关键字明确标记,属性重写则遵循val/var的特定规则。在实际工程中,合理运用密封类(sealed class)可以构建类型安全的代数数据类型,而类委托机制则提供了比多重继承更灵活的解决方案。掌握Kotlin的继承特性对于Android开发和后端服务构建都

weixin_30915275的博客 373

Kotlin构造函数

Kotlin构造函数

Chasingthewinds的博客 516

Kotlin笔记—类

类 1.1 类的构造 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_m...

ljt2724960661的博客 911
上一篇: NPOI中获取单元格内容无效
下一篇: Kotlin关键字三——fun与方法
得食猫
博客等级 码龄11年 50粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

得食猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值