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

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

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

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

static在java里面的用法總結(jié)

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

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

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

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

靜態(tài)變量及方法可能是我們平時(shí)用到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的實(shí)現(xiàn)方式大家都非常熟悉了,下面著重說(shuō)說(shuō)kotlin是如何實(shí)現(xiàn)的。

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

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

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

下面是定義伴生對(duì)象的代碼:

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

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

接下來(lái)看看如何使用伴生對(duì)象,伴生對(duì)象只能通過(guò)類(lèi)名來(lái)訪(fǎng)問(wèn),使用方法和java差不多:

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

kotlin的伴生對(duì)象解決了什么問(wèn)題?

大家可能會(huì)好奇,為什么kotlin要用這么一個(gè)奇怪的方式來(lái)解決這個(gè)問(wèn)題呢?

我的理解是有兩個(gè)原因:

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

第二,伴生對(duì)象解決了java靜態(tài)變量及方法的一個(gè)常見(jiàn)的反模式:靜態(tài)方法及變量可以通過(guò)對(duì)象的引用來(lái)訪(fǎng)問(wèn)。

還是拿上面的例子,java的靜態(tài)變量及方法可以通過(guò)類(lèi)引用和對(duì)象引用兩種方法訪(fǎng)問(wèn):

//通過(guò)類(lèi)引用訪(fǎng)問(wèn)
StaticTest.STATIC_VAR = 10; 
StaticTest.staticMethod("hello");

//通過(guò)對(duì)象引用訪(fǎng)問(wèn)
StaticTest obj = new StaticTest();
obj.STATIC_VAR = 10;
obj.staticMethod("hello");

而通過(guò)對(duì)象引用訪(fǎng)問(wèn)靜態(tài)變量及方法,顯然是不合適的。但是在java里卻沒(méi)有辦法從語(yǔ)法層面避免這個(gè)問(wèn)題。

而kotlin的伴生對(duì)象只能通過(guò)類(lèi)引用訪(fǎng)問(wèn),從語(yǔ)法的層面解決了這個(gè)問(wèn)題:

//使用類(lèi)引用訪(fǎng)問(wèn)
StaticTest.STATIC_VAR = 100
StaticTest.staticMethod("hello")
  
//不能使用對(duì)象引用訪(fǎng)問(wèn)
val obj = StaticTest()
obj.STATIC_VAR = 100 //編譯錯(cuò)誤
obj.staticMethod("hello") //編譯錯(cuò)誤

總之,kotlin里每個(gè)新的語(yǔ)言特性,都是為了填補(bǔ)java的某一個(gè)坑。

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

java里的靜態(tài)初始化可以在類(lèi)加載的時(shí)候初始化一些靜態(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í)行結(jié)果如下:

in static init
100

在kotlin里,因?yàn)閖ava的靜態(tài)變量及方法都是放在伴生對(duì)象里實(shí)現(xiàn)的,而伴生對(duì)象也是一個(gè)普通對(duì)象,所以可以通過(guò)伴生對(duì)象的init方法來(lái)實(shí)現(xiàn)變量的初始化,代碼如下:

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

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

執(zhí)行代碼:

println(StaticTest.STATIC_VAR)

結(jié)果如下:

in companion object init
100

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

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

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

public class StaticTest {
  
  private int out = 0;
  
  class InnerClass{
    public void InnerClassMethod(){
      out = 100; //可以訪(fǎng)問(wèn)外部類(lèi)的變量
    }
  }

  static class StaticInnerClass{
    public void StaticInnerClassMethod(){
      out = 100; //編譯錯(cuò)誤,不可以訪(fǎng)問(wèn)外部類(lèi)的變量
    }
  }
}

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

下面是和java的比較:

  • kotlin的內(nèi)部類(lèi)(使用inner修飾符)相當(dāng)于java的普通內(nèi)部類(lèi),可以訪(fǎng)問(wèn)外部變量,同時(shí)持有外部對(duì)象的引用。
  • kotlin的嵌套類(lèi)(沒(méi)有inner修飾符)相當(dāng)于java的靜態(tài)內(nèi)部類(lèi),不可以訪(fǎng)問(wèn)外部變量

kotlin嵌套類(lèi)的例子:

class StaticTest {
  var out = 0

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

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

class StaticTest {
  var out = 0

  class InnerClass{
    fun InnerClassMethod(){
      out = 100 //編譯錯(cuò)誤,嵌套類(lèi)不可以訪(fǎng)問(wèn)外部變量
    }
  }
}

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

總結(jié):

本文的知識(shí)點(diǎn)總結(jié)如下:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中Collection與Collections的區(qū)別詳解

    Java中Collection與Collections的區(qū)別詳解

    這篇文章主要為大家詳細(xì)介紹了Java中Collection與Collections的區(qū)別,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的同學(xué)可以參考一下
    2023-06-06
  • Spring?Boot統(tǒng)一處理全局異常的實(shí)戰(zhàn)教程

    Spring?Boot統(tǒng)一處理全局異常的實(shí)戰(zhàn)教程

    最近在做項(xiàng)目時(shí)需要對(duì)異常進(jìn)行全局統(tǒng)一處理,所以下面這篇文章主要給大家介紹了關(guān)于Spring?Boot統(tǒng)一處理全局異常的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • 如何通過(guò)Kaptcha在Web頁(yè)面生成驗(yàn)證碼

    如何通過(guò)Kaptcha在Web頁(yè)面生成驗(yàn)證碼

    這篇文章主要介紹了如何通過(guò)Kaptcha在Web頁(yè)面生成驗(yàn)證碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java拆箱與裝箱實(shí)例詳解

    Java拆箱與裝箱實(shí)例詳解

    這篇文章主要介紹了Java拆箱與裝箱,結(jié)合實(shí)例形式詳細(xì)分析了Java拆箱與裝箱相關(guān)的數(shù)據(jù)類(lèi)型轉(zhuǎn)換操作技巧,需要的朋友可以參考下
    2019-11-11
  • openFeign服務(wù)之間調(diào)用保持請(qǐng)求頭信息處理方式

    openFeign服務(wù)之間調(diào)用保持請(qǐng)求頭信息處理方式

    這篇文章主要介紹了openFeign服務(wù)之間調(diào)用保持請(qǐng)求頭信息處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java多線(xiàn)程之線(xiàn)程安全問(wèn)題詳解

    Java多線(xiàn)程之線(xiàn)程安全問(wèn)題詳解

    這篇文章主要為大家詳細(xì)介紹了Java多線(xiàn)程之線(xiàn)程安全問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • mybatis中返回主鍵一直為1的問(wèn)題

    mybatis中返回主鍵一直為1的問(wèn)題

    這篇文章主要介紹了mybatis中返回主鍵一直為1的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java中classpath的基本概念和配置方法詳析

    Java中classpath的基本概念和配置方法詳析

    這篇文章主要介紹了Java中的classpath概念,包括其基本概念、設(shè)置方法以及在Java應(yīng)用中的作用,在IDE中的配置也進(jìn)行了詳細(xì)說(shuō)明,并提到了一些通用注意事項(xiàng),需要的朋友可以參考下
    2025-02-02
  • SpringBoot讀取resource目錄下文件失敗的原因及解決方案

    SpringBoot讀取resource目錄下文件失敗的原因及解決方案

    在idea中運(yùn)行時(shí),有些resource下文件讀取工具類(lèi)能夠正常獲取讀取到文件,但是通過(guò)java–jar的方式去運(yùn)行jar包,此時(shí)resource下文件讀取工具類(lèi)讀取文件就失效了,本文就給大家介紹一下SpringBoot讀取resource目錄下文件失敗解決方案,需要的朋友可以參考下
    2023-08-08
  • SpringCloud應(yīng)用idea實(shí)現(xiàn)可相互調(diào)用的多模塊程序詳解

    SpringCloud應(yīng)用idea實(shí)現(xiàn)可相互調(diào)用的多模塊程序詳解

    IDEA 全稱(chēng) IntelliJ IDEA,是java編程語(yǔ)言的集成開(kāi)發(fā)環(huán)境。IntelliJ在業(yè)界被公認(rèn)為最好的Java開(kāi)發(fā)工具,尤其在智能代碼助手、代碼自動(dòng)提示、重構(gòu)、JavaEE支持、各類(lèi)版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創(chuàng)新的GUI設(shè)計(jì)等方面的功能可以說(shuō)是超常的
    2022-07-07

最新評(píng)論

海宁市| 安塞县| 邢台市| 济宁市| 湘潭市| 遂平县| 廊坊市| 徐汇区| 邹平县| 郁南县| 洪雅县| 社旗县| 临湘市| 钟山县| 徐汇区| 陇西县| 同仁县| 施秉县| 康定县| 辽宁省| 凌云县| 牙克石市| 镇赉县| 东乡族自治县| 益阳市| 侯马市| 镇原县| 牡丹江市| 东城区| 乌恰县| 桂阳县| 甘德县| 渝中区| 无为县| 财经| 贵定县| 柳林县| 宁化县| 巴东县| 米易县| 永平县|