91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中static在Kotlin中怎么用

發布時間:2021-03-05 15:13:05 來源:億速云 閱讀:271 作者:小新 欄目:編程語言

小編給大家分享一下Java中static在Kotlin中怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

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

static在java里面的用法總結

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

靜態變量及方法  靜態初始化  靜態內部類

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

場景一:靜態變量及方法

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

java靜態變量及方法介紹:

首先,是靜態變量和方法的定義:

public class StaticTest {  public static int STATIC_VAR = 0;  public static void staticMethod(String str){    System.out.println(str);  }}

然后是靜態變量和方法的使用:

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

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

kotlin替代靜態變量及方法的方案

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

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

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

class StaticTest {  companion object{//伴生對象是可以指定名字的,不過一般都省略掉。    var STATIC_VAR = 0    fun staticMethod(str: String?) {      println(str)    }  }}

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

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

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

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

我的理解是有兩個原因:

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

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

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

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

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

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

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

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

場景二:靜態初始化

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

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);  }}

上面的代碼執行結果如下:

in static init100

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

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

執行代碼:

println(StaticTest.STATIC_VAR)

結果如下:

in companion object init100

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

場景三:靜態內部類

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

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

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

下面是和java的比較:

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

kotlin嵌套類的例子:

class StaticTest {  var out = 0  inner class InnerClass{    fun InnerClassMethod(){      out = 100 //內部類可以訪問外部變量    }  }}

kotlin內部類的例子:

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

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

以上是“Java中static在Kotlin中怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苏尼特左旗| 张家界市| 鄯善县| 眉山市| 滁州市| 永吉县| 卢龙县| 墨江| 琼中| 奉节县| 富宁县| 韶山市| 丰县| 江安县| 翁牛特旗| 兴安县| 花莲县| 湖口县| 岑巩县| 外汇| 穆棱市| 巫溪县| 桃源县| 孙吴县| 寿光市| 两当县| 鄂温| 黄平县| 宜宾县| 万宁市| 临桂县| 上饶县| 台州市| 桦甸市| 新源县| 静海县| 罗甸县| 建阳市| 泽州县| 建始县| 广昌县|