最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Kotlin伴隨對(duì)象的初始化方法示例講解

 更新時(shí)間:2022年11月28日 09:12:48   作者:昉鈺  
Kotlin語言的許多特性,包括變量不可變,變量不可為空,等等。這些特性都是為了盡可能地保證程序安全而設(shè)計(jì)的,但是有些時(shí)候這些特性也會(huì)在編碼時(shí)給我們帶來不少的麻煩,下面我們來了解伴隨對(duì)象的初始化

在Java中我們知道靜態(tài)變量會(huì)在類加載時(shí)機(jī)的“初始化”階段得到賦值(編譯器會(huì)收集類中的靜態(tài)變量及靜態(tài)代碼塊,然后在類構(gòu)造方法<clinit>()中執(zhí)行,注意:這里不是實(shí)例構(gòu)造方法),也就是真正運(yùn)行程序中的代碼;執(zhí)行完類構(gòu)造方法之后才會(huì)執(zhí)行我們熟悉的實(shí)例構(gòu)造方法。

  而在Kotlin中有所謂的伴隨對(duì)象,用過的同學(xué)都知道,它的功能類似于Java中的靜態(tài)變量,那它又是什么時(shí)候初始化的呢?來看一個(gè)例子,代碼如下:

package com.zfang.testapp
class KConstructTest(val first: String, val second: Int) {
    init {// 111
        println("KConstructTest init")
        test(1)
    }
    companion object CC {
        init { // 222
            println("companion object init")
        }
        fun test(index: Int) {
            println("test, index = $index")
        }
    }
}

一個(gè)簡(jiǎn)單的kotlin類,里面包含一個(gè)伴隨對(duì)象CC,現(xiàn)在寫一個(gè)測(cè)試類來看一個(gè)標(biāo)記111和222這兩個(gè)地方誰先初始化,測(cè)試代碼如下:

package com.zfang.testapp;
class Test {
    public static void main(String[] args) {
        KConstructTest test = new KConstructTest("ttt", 1);
        KConstructTest.CC cc = test.CC;
    }
}

一個(gè)簡(jiǎn)單的Java測(cè)試類,入口中直接new了一個(gè)KConstructTest對(duì)象,下面是程序輸出:

companion object init
KConstructTest init
test, index = 1

從輸出結(jié)果中可以看出是伴隨對(duì)象的init代碼塊先執(zhí)行了,然后才是主類中的init代碼塊執(zhí)行。下面我們反編譯看下生存的java類是怎樣的。結(jié)果如下:

package com.zfang.testapp;
import kotlin.Metadata;
import kotlin.jvm.internal.DefaultConstructorMarker;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
@Metadata(
   mv = {1, 7, 1},
   k = 1,
   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\u0007\u0018\u0000 \u000b2\u00020\u0001:\u0001\u000bB\u0015\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006R\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u0011\u0010\u0004\u001a\u00020\u0005¢\u0006\b\n\u0000\u001a\u0004\b\t\u0010\n¨\u0006\f"},
   d2 = {"Lcom/zfang/testapp/KConstructTest;", "", "first", "", "second", "", "(Ljava/lang/String;I)V", "getFirst", "()Ljava/lang/String;", "getSecond", "()I", "CC", "app_debug"}
)
public final class KConstructTest {
   @NotNull
   private final String first;
   private final int second;
   @NotNull
   public static final KConstructTest.CC CC = new KConstructTest.CC((DefaultConstructorMarker)null);
   @NotNull
   public final String getFirst() {
      return this.first;
   }
   public final int getSecond() {
      return this.second;
   }
   public KConstructTest(@NotNull String first, int second) {//與主構(gòu)造方法對(duì)應(yīng)
      Intrinsics.checkNotNullParameter(first, "first");
      super();
      this.first = first;
      this.second = second;
      String var3 = "KConstructTest init";//主類中的init代碼塊
      System.out.println(var3);
      CC.test(1);
   }
   static {//伴隨對(duì)象中的init代碼塊
      String var0 = "companion object init";
      System.out.println(var0);
   }
   @Metadata(
      mv = {1, 7, 1},
      k = 1,
      d1 = {"\u0000\u0018\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\b\n\u0000\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002J\u000e\u0010\u0003\u001a\u00020\u00042\u0006\u0010\u0005\u001a\u00020\u0006¨\u0006\u0007"},
      d2 = {"Lcom/zfang/testapp/KConstructTest$CC;", "", "()V", "test", "", "index", "", "app_debug"}
   )
   public static final class CC {//伴隨對(duì)象類
      public final void test(int index) {
         String var2 = "test, index = " + index;
         System.out.println(var2);
      }
      private CC() {
      }
      // $FF: synthetic method
      public CC(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

額,反編譯出來的Java代碼看上去有點(diǎn)多的樣子。不過邏輯還是很簡(jiǎn)單的,主要以下幾點(diǎn):

  • 伴隨對(duì)象類編譯成了與Java相對(duì)應(yīng)的靜態(tài)內(nèi)部類(又叫內(nèi)嵌類),并且伴隨對(duì)象中的init代碼塊編譯成了主類中的靜態(tài)代碼塊。
  • 主類primary構(gòu)造函數(shù)相應(yīng)的就是Java類的構(gòu)造函數(shù),同時(shí)主類中的init代碼塊則編譯到了主構(gòu)造函數(shù)中了。

根據(jù)以上分析則可以得出結(jié)論:

  • 伴隨對(duì)象中的init代碼塊首先執(zhí)行(因?yàn)樗痪幾g成主要的靜態(tài)代碼塊了,在類的初始化階段就會(huì)執(zhí)行)。
  • 然后才會(huì)執(zhí)行主類中的Init代碼塊(此代碼塊被編譯到相應(yīng)Java代碼中的實(shí)例構(gòu)造方法里面了,執(zhí)行完類構(gòu)造方法之后才會(huì)執(zhí)行實(shí)例構(gòu)造方法)。

所以如果項(xiàng)目中對(duì)主類Init塊和伴隨對(duì)象init塊有初始化順序要求的就需要注意相應(yīng)的邏輯了。

到此這篇關(guān)于Kotlin伴隨對(duì)象的初始化方法示例講解的文章就介紹到這了,更多相關(guān)Kotlin伴隨對(duì)象的初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android 控制車載藍(lán)牙播放音樂詳解流程

    Android 控制車載藍(lán)牙播放音樂詳解流程

    本篇文章介紹了手機(jī)端音樂暫停和播放狀態(tài),從服務(wù)端告訴客戶端、設(shè)備端實(shí)現(xiàn)暫停、播放、上一首、下一首等功能的實(shí)現(xiàn),通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下
    2021-10-10
  • android使用Jsoup 抓取頁面的數(shù)據(jù)

    android使用Jsoup 抓取頁面的數(shù)據(jù)

    本篇文章主要介紹了android使用Jsoup 抓取頁面的數(shù)據(jù),jsoup 是一款Java的HTML解析器,有需要的朋友可以了解一下。
    2016-11-11
  • Android自定義View實(shí)現(xiàn)天氣預(yù)報(bào)折線圖

    Android自定義View實(shí)現(xiàn)天氣預(yù)報(bào)折線圖

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)天氣預(yù)報(bào)折線圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 詳解Android ScrollView嵌套EditText出現(xiàn)的滑動(dòng)問題

    詳解Android ScrollView嵌套EditText出現(xiàn)的滑動(dòng)問題

    本篇文章主要介紹了詳解ScrollView嵌套EditText出現(xiàn)的滑動(dòng)問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • 詳解Android Studio安裝ButterKnife插件(手動(dòng)安裝)

    詳解Android Studio安裝ButterKnife插件(手動(dòng)安裝)

    這篇文章主要介紹了詳解AndroidStudio安裝ButterKnife插件(手動(dòng)安裝),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Android AndroidX的遷移

    Android AndroidX的遷移

    這篇文章主要介紹了Android AndroidX的遷移,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • android自定義對(duì)話框?qū)嵗a

    android自定義對(duì)話框?qū)嵗a

    大家好,本篇文章主要講的是android自定義對(duì)話框?qū)嵗a,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Android開發(fā)自定義短信驗(yàn)證碼實(shí)現(xiàn)過程詳解

    Android開發(fā)自定義短信驗(yàn)證碼實(shí)現(xiàn)過程詳解

    這篇文章主要為大家介紹了Android開發(fā)自定義短信驗(yàn)證碼實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Android ScrollView 下嵌套 ListView 或 GridView出現(xiàn)問題解決辦法

    Android ScrollView 下嵌套 ListView 或 GridView出現(xiàn)問題解決辦法

    這篇文章主要介紹了ScrollView 下嵌套 ListView 或 GridView 會(huì)發(fā)列表現(xiàn)數(shù)據(jù)只能顯示一行。因?yàn)樗麄兌际菨L動(dòng)結(jié)構(gòu),兩個(gè)滾動(dòng)條放到一起就會(huì)引起沖突,這里提供解決辦法相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 詳解如何在Flutter中集成華為認(rèn)證服務(wù)

    詳解如何在Flutter中集成華為認(rèn)證服務(wù)

    這篇文章主要介紹了詳解如何在Flutter中集成華為認(rèn)證服務(wù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評(píng)論

莎车县| 崇文区| 渭南市| 太康县| 宜君县| 疏勒县| 阿克苏市| 锡林郭勒盟| 洪洞县| 托克托县| 桐乡市| 水城县| 武清区| 蒙山县| 清河县| 雅江县| 阿克陶县| 霞浦县| 贵德县| 阿图什市| 仙居县| 宜宾县| 华亭县| 汪清县| 涟源市| 通渭县| 巴塘县| 驻马店市| 泸州市| 浦城县| 南康市| 濉溪县| 南靖县| 永康市| 分宜县| 苍南县| 买车| 临漳县| 弥渡县| 永德县| 怀宁县|