kotlin init执行顺序

一 代码

kotlin:

package test.fclass Test1 {
}class TestInit(s: String, i: Int) {var name: String? = nullvar age = 0private var a :Int = 1init {this.name = sthis.age = iprintln("init代码块: $name, $age")}}

转成java

// Test1.java
package test.f;import kotlin.Metadata;@Metadata(mv = {2, 0, 0},k = 1,xi = 48,d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002¨\u0006\u0003"},d2 = {"Ltest/f/Test1;", "", "()V", "untitled"}
)
public final class Test1 {
}
// TestInit.java
package test.f;import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;@Metadata(mv = {2, 0, 0},k = 1,xi = 48,d1 = {"\u0000\u0018\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010\b\n\u0002\b\r\u0018\u00002\u00020\u0001B\u0015\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006R\u000e\u0010\u0007\u001a\u00020\u0005X\u0082\u000e¢\u0006\u0002\n\u0000R\u001a\u0010\b\u001a\u00020\u0005X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\t\u0010\n\"\u0004\b\u000b\u0010\fR\u001c\u0010\r\u001a\u0004\u0018\u00010\u0003X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u000e\u0010\u000f\"\u0004\b\u0010\u0010\u0011¨\u0006\u0012"},d2 = {"Ltest/f/TestInit;", "", "s", "", "i", "", "(Ljava/lang/String;I)V", "a", "age", "getAge", "()I", "setAge", "(I)V", "name", "getName", "()Ljava/lang/String;", "setName", "(Ljava/lang/String;)V", "untitled"}
)
public final class TestInit {@Nullableprivate String name;private int age;private int a;public TestInit(@NotNull String s, int i) {Intrinsics.checkNotNullParameter(s, "s");super();this.a = 1;this.name = s;this.age = i;String var3 = "init代码块: " + this.name + ", " + this.age;System.out.println(var3);}@Nullablepublic final String getName() {return this.name;}public final void setName(@Nullable String var1) {this.name = var1;}public final int getAge() {return this.age;}public final void setAge(int var1) {this.age = var1;}
}

二 解释说明

在Kotlin中,类的初始化顺序严格按照代码中声明的顺序执行。对于提供的TestInit类,执行顺序如下:

  1. 主构造函数参数处理:首先接收s: Stringi: Int
  2. 属性初始化:按声明顺序依次初始化:
    name: String? = null
    age: Int = 0
    private var a: Int = 1
  3. 执行init:最后运行init中的代码,设置nameage的值,并打印信息。

为什么init块在a之后执行?
因为a的声明和初始化(private var a: Int = 1)出现在init块之前。Kotlin会先处理所有在init块之前声明的属性,再执行init块。这保证了在init块中访问a时,它已经被正确初始化。

关键点
声明顺序决定初始化顺序:属性和init块的执行顺序完全由它们在类体中的位置决定。
init块属于初始化阶段:所有在init块之前的属性会先初始化,确保init块中的逻辑可以依赖这些已初始化的值。

三 总结

根据Kotlin的文档,当创建一个类的实例时,初始化顺序是这样的:
首先,主构造函数中的参数被处理;
接着,类体中声明的属性按照它们在代码中的顺序进行初始化;
然后,init块按照它们在类体中的出现顺序执行。
如果有多个init块,它们会按照顺序依次执行。
最后,次构造函数中的代码执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用cursor开发java案例——springboot整合elasticsearch

安装elasticsearch 打开cursor,输入如下提示词 使用springboot整合elasticsearch。其中elasticsearch服务器ip:192.168.236.134 管理员用户名elastic 管理员密码 PdQy_xfR2yLhpok*MK_ 监听端口9200点Accept all 使用idea打开生成的项目 &#xff0…

Java Collection API增强功能系列之一 Arrays.asList()

在Java编程中,Arrays.asList() 是一个高频使用却又容易引发陷阱的工具方法。它能够快速将数组转换为列表,但其特殊行为常常让开发者踩坑。本文将深入剖析该方法的本质特性,并揭示其使用时的注意事项。一、方法定义与基础用法 1. 方法签名 p…

vue3 项目的最新eslint9 + prettier 配置

注意:eslint目前升级到9版本了 在 ESLint v9 中,配置文件已经从 .eslintrc 迁移到了 eslint.config.js 配置的方式和之前的方式不太一样了!!!! 详见自己的语雀文档:5、新版eslint9prettier 配…

基于FPGA的16QAM+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 16QAM调制解调原理 2.2 帧同步 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印): 设置SNR12db 将FPGA数据导入到MATLAB显…

[学成在线]06-视频分片上传

上传视频 需求分析 教学机构人员进入媒资管理列表查询自己上传的媒资文件。 点击“媒资管理” 进入媒资管理列表页面查询本机构上传的媒资文件。 教育机构用户在"媒资管理"页面中点击 "上传视频" 按钮。 点击“上传视频”打开上传页面 选择要上传的文件…

Maven安装与环境配置

首先我们先介绍一些关于Maven的知识,如果着急直接看下面的安装教程。 目录 Maven介绍 Maven模型 Maven仓库 Maven安装 下载 安装步骤 Maven介绍 Apache Maven是一个项目管理和构建工具,它基于项目对象模型(Project Object Model , 简称: POM)的概念…

【新能源汽车温度采集与控制系统设计深度解析】

面向汽车行业研发与测试测量设备从业者的技术指南 一、硬件架构设计 新能源汽车的温度采集与控制系统是保障电池、电机、电控等核心部件安全运行的核心技术之一。其硬件架构需兼顾高精度、抗干扰、可靠性与集成化,以下从信号调理电路、ADC模块、隔离设计三个维度展…

AI Tokenization

AI Tokenization 人工智能分词初步了解 类似现在这个,一格子 一格子,拼接出来的,一行或者一句,像不像,我们人类思考的时候组装出来的话,并用嘴说出来了呢。

React(四)setState原理-性能优化-ref

setState详解 实现原理 开发中我们并不能直接修改State来重新渲染界面: 因为修改State之后,希望React根据最新的State来重新渲染界面,但这种方式的修改React并不知道数据发生了变化; React并没有类似于Vue2中的Object.defineP…

SSH密钥认证 + 文件系统权限控制 + Git仓库配置+封存与解封GIT仓库

在本地服务器上实现多个用户仅通过git push操作修改仓库、禁止其他改写方式的需求,可以通过以下步骤实现: 方法概述 通过SSH密钥认证 文件系统权限控制 Git仓库配置,确保用户仅能通过git push命令提交修改,而无法通过直接操作服…

全文通读:126页华为IPD集成产品开发与DFX实战【文末附可编辑PPT下载链接】

绑定资料内容: 12023华为流程体系及落地实施【108页 PPT】.pptx22024版基于华为IPD与质量管理体系融合的研发质量管理【63页】.pptx

//TODO 动态代理的本质?

待解决 //TODO 面试题 为啥mybatis的mapper只有接口没有实现类,但它却能工作??(ai参考,待深究源码) 1. 动态代理生成代理对象 MyBatis 使用 JDK 动态代理 为每个 Mapper 接口生成代理对象: • 核心类:MapperProxy(…

C++11中智能指针的使用(shared_ptr、unique_ptr、weak_ptr)

C11中智能指针的使用(shared_ptr、unique_ptr、weak_ptr) 一、shared_ptr原理 shared_ptr 是另一种智能指针,用于实现多个 shared_ptr 实例共享同一个对象的所有权。它通过内部的控制块(通常是一个包含计数器和指向对象的指针的结构)来管理…

2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现: 人的大脑结构非常复杂,内部交织密布着神经和血管,所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术,通常需要…

尝试在软考62天前开始成为软件设计师-信息系统安全

安全属性 保密性:最小授权原则(能干活的最小权限)、防暴露(隐藏)、信息加密、物理保密完整性(防篡改):安全协议、校验码、密码校验、数字签名、公证 可用性:综合保障( IP过滤、业务流控制、路由选择控制、审计跟踪)不可抵赖性:数字签名 对称加密 DES :替换移位 3重DESAESR…

Rocky9.5基于sealos快速部署k8s集群

首先需要下载 Sealos 命令行工具,sealos 是一个简单的 Golang 二进制文件,可以安装在大多数 Linux 操作系统中。 以下是一些基本的安装要求: 每个集群节点应该有不同的主机名。主机名不要带下划线。 所有节点的时间需要同步。 需要在 K8s …

G口服务器和普通服务器之间的区别

今天小编主要来为大家介绍一下G口服务器和普通服务器之间的区别! 首先,从硬件配置上看,普通服务器通常都会配备中央处理器、内存和硬盘等基本的硬件配置,能够适用于各种应用程序和服务;G口服务器除了基础的硬件配置还增…

Cursor软件如何刷新机器码流程

一.退出Cursor软件账号 打开Cursor软件,点击设置-->General-->Account-->Log out,现将Cursor软件上登录的账户退出。 二.将Cursor官网上登录的Cursor账户也清空掉 点击头像--> ACCOUNT SETTINGS -->Account-->Advanced-->Delete Account-->…

类与对象(中)(详解)

【本节目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 6. const成员函数 7. 取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗&…

开发语言漫谈-groovy

groovy是一门脚本语言,在前期的脚本语言中简单介绍了下。现在再深入介绍下,因为它是本平台上选用的脚本语言。所谓脚本语言就是不用编译,直接执行。这种特色非常适合做嵌入编程,即编即用。我们知道平台后台的业务开发语言是Java&a…