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.pswp.cn/pingmian/73330.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73330.shtml
英文地址,請注明出處:http://en.pswp.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…