欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java里的static在Kotlin里如何實現(xiàn)

 更新時間:2020年01月06日 15:45:04   作者:我愛紐約先生  
這篇文章主要介紹了Java里的static在Kotlin里如何實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

static修飾符是java里面非常常用的一個東西,用法也非常多。然而,在kotlin里竟然沒有這個東西!那該如何替代呢?本文就總結了下java里面static的幾種常見用法在kotlin里的替代方式。

static在java里面的用法總結

static在java里面的用法有很多,最常用的有下面幾種:

  • 靜態(tài)變量及方法
  • 靜態(tài)初始化
  • 靜態(tài)內(nèi)部類

下面我們就看看這幾種場景在kotlin是如何實現(xiàn)的。

場景一:靜態(tài)變量及方法

靜態(tài)變量及方法可能是我們平時用到static最多的地方,我們先看看java里面是如何做的。

java靜態(tài)變量及方法介紹:

首先,是靜態(tài)變量和方法的定義:

public class StaticTest {
  public static int STATIC_VAR = 0;

  public static void staticMethod(String str){
    System.out.println(str);
  }
}

然后是靜態(tài)變量和方法的使用:

StaticTest.STATIC_VAR = 10;
StaticTest.staticMethod("hello");

java的實現(xiàn)方式大家都非常熟悉了,下面著重說說kotlin是如何實現(xiàn)的。

kotlin替代靜態(tài)變量及方法的方案

kotlin通過引入“伴生對象”的概念來替代java里的靜態(tài)變量及方法。

“伴生對象”這個名詞聽上去很古怪,其實非常簡單:在類的內(nèi)容使用companion來標記一個對象。所有需要“靜態(tài)化”的變量和方法都放在這個對象里。

下面是定義伴生對象的代碼:

class StaticTest {
  companion object{//伴生對象是可以指定名字的,不過一般都省略掉。
    var STATIC_VAR = 0

    fun staticMethod(str: String?) {
      println(str)
    }
  }
}

接下來看看如何使用伴生對象,伴生對象只能通過類名來訪問,使用方法和java差不多:

StaticTest.STATIC_VAR = 100
StaticTest.staticMethod("hello")

kotlin的伴生對象解決了什么問題?

大家可能會好奇,為什么kotlin要用這么一個奇怪的方式來解決這個問題呢?

我的理解是有兩個原因:

第一,使用伴生對象體現(xiàn)了kotlin一貫的設計理念:一切都是對象!伴生對象也是對象!而java的static,顯然和對象沒有關系。

第二,伴生對象解決了java靜態(tài)變量及方法的一個常見的反模式:靜態(tài)方法及變量可以通過對象的引用來訪問。

還是拿上面的例子,java的靜態(tài)變量及方法可以通過類引用和對象引用兩種方法訪問:

//通過類引用訪問
StaticTest.STATIC_VAR = 10; 
StaticTest.staticMethod("hello");

//通過對象引用訪問
StaticTest obj = new StaticTest();
obj.STATIC_VAR = 10;
obj.staticMethod("hello");

而通過對象引用訪問靜態(tài)變量及方法,顯然是不合適的。但是在java里卻沒有辦法從語法層面避免這個問題。

而kotlin的伴生對象只能通過類引用訪問,從語法的層面解決了這個問題:

//使用類引用訪問
StaticTest.STATIC_VAR = 100
StaticTest.staticMethod("hello")
  
//不能使用對象引用訪問
val obj = StaticTest()
obj.STATIC_VAR = 100 //編譯錯誤
obj.staticMethod("hello") //編譯錯誤

總之,kotlin里每個新的語言特性,都是為了填補java的某一個坑。

場景二:靜態(tài)初始化

java里的靜態(tài)初始化可以在類加載的時候初始化一些靜態(tài)變量,比如:

public class StaticTest {
  public static int STATIC_VAR = 0;
  
  static {
    STATIC_VAR = 100;
    System.out.println("in static init");
  }
  
  public static void main(String[] args) {
    System.out.println(StaticTest.STATIC_VAR);
  }
}

上面的代碼執(zhí)行結果如下:

in static init
100

在kotlin里,因為java的靜態(tài)變量及方法都是放在伴生對象里實現(xiàn)的,而伴生對象也是一個普通對象,所以可以通過伴生對象的init方法來實現(xiàn)變量的初始化,代碼如下:

class StaticTest {
  companion object{//伴生對象是可以指定名字的,不過一般都省略掉。
    var STATIC_VAR = 0

    init {
      STATIC_VAR = 100
      println("in companion object init")
    }
  }
}

執(zhí)行代碼:

println(StaticTest.STATIC_VAR)

結果如下:

in companion object init
100

可以看到,kotlin的實現(xiàn)方式要比java的更加一致,既然大家都是對象,所以都是通過init來初始化的。而java里,非靜態(tài)變量是通過構造函數(shù)來初始化的,而靜態(tài)變量是通過static代碼塊來初始化的,兩者很不一致。

場景三:靜態(tài)內(nèi)部類

java的內(nèi)部類有兩種,普通內(nèi)部類和靜態(tài)內(nèi)部類。二者的區(qū)別是前者可以訪問外部類的變量,而后者不可以。同時普通內(nèi)部類會持有外部類的一個引用,靜態(tài)內(nèi)部類則沒有。

public class StaticTest {
  
  private int out = 0;
  
  class InnerClass{
    public void InnerClassMethod(){
      out = 100; //可以訪問外部類的變量
    }
  }

  static class StaticInnerClass{
    public void StaticInnerClassMethod(){
      out = 100; //編譯錯誤,不可以訪問外部類的變量
    }
  }
}

而kotlin的內(nèi)部類也有兩種:內(nèi)部類和嵌套類。從語法上說,二值的差別就是前者多一個inner修飾符。

下面是和java的比較:

  • kotlin的內(nèi)部類(使用inner修飾符)相當于java的普通內(nèi)部類,可以訪問外部變量,同時持有外部對象的引用。
  • kotlin的嵌套類(沒有inner修飾符)相當于java的靜態(tài)內(nèi)部類,不可以訪問外部變量

kotlin嵌套類的例子:

class StaticTest {
  var out = 0

  inner class InnerClass{
    fun InnerClassMethod(){
      out = 100 //內(nèi)部類可以訪問外部變量
    }
  }
}

kotlin內(nèi)部類的例子:

class StaticTest {
  var out = 0

  class InnerClass{
    fun InnerClassMethod(){
      out = 100 //編譯錯誤,嵌套類不可以訪問外部變量
    }
  }
}

通過對比,大家應該很容易的搞清楚kotlin里內(nèi)部類和嵌套類的區(qū)別了。

總結:

本文的知識點總結如下:

  • java的靜態(tài)變量和方法,在kotlin中使用伴生對象替代
  • java的靜態(tài)初始化,在kotlin中使用伴生對象的init替代
  • java的靜態(tài)內(nèi)部類,在kotlin中使用嵌套類來替代

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring @RestController注解組合實現(xiàn)方法解析

    Spring @RestController注解組合實現(xiàn)方法解析

    這篇文章主要介紹了Spring @RestController注解組合實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • mybatis.type-aliases-package的作用及用法說明

    mybatis.type-aliases-package的作用及用法說明

    這篇文章主要介紹了mybatis.type-aliases-package的作用及用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 淺談Spring Boot 屬性配置和自定義屬性配置

    淺談Spring Boot 屬性配置和自定義屬性配置

    這篇文章主要介紹了淺談Spring Boot 屬性配置和自定義屬性配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • java實現(xiàn)發(fā)送email小案例

    java實現(xiàn)發(fā)送email小案例

    這篇文章主要為大家詳細介紹了java實現(xiàn)發(fā)送email小案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • JVM:你知道為什么對象一定在堆中分配嗎

    JVM:你知道為什么對象一定在堆中分配嗎

    這篇文章主要介紹了jvm對象的創(chuàng)建和分配的相關資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-08-08
  • springboot項目編寫發(fā)送異常日志到企微工具包的操作方法

    springboot項目編寫發(fā)送異常日志到企微工具包的操作方法

    本文介紹了Springboot項目如何編寫發(fā)送異常日志到企業(yè)微信的工具包,內(nèi)容包括創(chuàng)建基礎Bean、配置類、pom依賴等步驟,并展示了如何通過nacos進行配置,這為開發(fā)者提供了一種有效的日志管理方案,方便快速定位和處理項目中的異常問題,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Java利用反射對list對象做過濾

    Java利用反射對list對象做過濾

    這篇文章主要介紹了Java利用反射對list對象做過濾,但是使用反射對效率有影響,但在一些特殊情況也有一定的參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • 異常try?catch的常見四類方式(案例代碼)

    異常try?catch的常見四類方式(案例代碼)

    這篇文章主要介紹了異常try?catch的常見四類方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • JAVA實現(xiàn)FTP斷點上傳的方法

    JAVA實現(xiàn)FTP斷點上傳的方法

    這篇文章主要介紹了JAVA實現(xiàn)FTP斷點上傳的方法,涉及java使用FTP實現(xiàn)文件傳輸?shù)南嚓P技巧,需要的朋友可以參考下
    2015-06-06
  • 最新SpringCloud?Stream消息驅動講解

    最新SpringCloud?Stream消息驅動講解

    SpringCloud Stream 是一個構建消息驅動微服務的框架,通過 SpringCloud Stream 連接消息中間件,以實現(xiàn)消息事件驅動,這篇文章主要介紹了SpringCloud?Stream消息驅動,需要的朋友可以參考下
    2022-11-11

最新評論