<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 1. 前言 | 符號 | 說明 | | --- | --- | | `@JvmName` | 指定`kotlin`編譯類的名字 | | `@JvmField` | 指定可直接訪問類的屬性,而不是`getXX`或者`setXX`方法 | | `@JvmOverloads` | 指定重載`Kotlin`的默認參數方法 | | `@JvmStatic` | 指定`Kotlin`的半生對象的靜態方法的直接點好調用 | | `@Throws` | 指定拋出的異常類型 | # 2. 使用案例 ## 2.1 @JvmName 新建一個`KotlinDemo.kt`文件,然后寫入一個供外部`Java`程序調用的方法: ~~~ package com.kotlinLearn fun isPrime(number: Int): Boolean { (2 until number).map { if(number % it == 0) return false } return true } ~~~ 我們就可以在`A.java`文件中進行調用,比如: ~~~ package com.kotlinLearn; public class A { public static void main(String[] args) { boolean prime = KotlinDemoKt.isPrime(4); System.out.println(prime ? "素數" : "非素數"); } } ~~~ 結果: ``` 非素數 ``` 雖然可以實現調用,但是我們需要暴露自己的`kotlin`文件名,所以這里可以使用`JvmName`來進行重命名: ~~~ @file:JvmName("MyUtils") package com.kotlinLearn fun isPrime(number: Int): Boolean { (2 until number).map { if(number % it == 0) return false } return true } ~~~ 對應的我們在調用的時候,所使用的就是: ~~~ boolean prime = MyUtils.isPrime(4); ~~~ ## 2.2 @JvmField 類似的我們在`KotlinDemo.kt`文件中定義一個類: ~~~ class User{ var name: String? = null } ~~~ 然后在`A.java`文件中調用,可以看見下圖: ![](https://img.kancloud.cn/b9/50/b9506a3054805f392183ebf023fbf4b7_789x220.png) 也就是說其實默認的調用可以使用`get`和`set`來獲取到在`kotlin`中的屬性,但是有些時候我們期望可以直接訪問到屬性,而不是`get`或者`set`方法。那么就可以使用`@JvmField`來實現: ~~~ @file:JvmName("MyUtils") package com.kotlinLearn class User{ @JvmField var name: String? = null } ~~~ 然后在`A.java`中調用: ~~~ user.name = "李四"; ~~~ ## 2.3 @JvmField 在`Kotlin`和`Python`中使用類似,我們可以定義一些默認參數,然后可以有默認的實現效果。比如: ~~~ @file:JvmName("MyUtils") package com.kotlinLearn class User(@JvmField var name: String, @JvmField var age: Int) { override fun toString(): String { return "User(name='$name', age=$age)" } } fun generateUser(name: String = "張三", age: Int = 23): User{ return User(name, age) } fun main() { val user = generateUser() println(user) } ~~~ 結果: ``` User(name='張三', age=23) ``` 同樣的,我們在`A.java`中調用: ~~~ package com.kotlinLearn; public class A { public static void main(String[] args) { User user = MyUtils.generateUser("李四", 23); System.out.println(user); } } ~~~ 但是,由于在`Java`中默認并不支持,所以我們定義默認參數其實底層就是函數重載,比如: ~~~ public User generateUser(String name, int age){ return new User(name, age); } public User generateUser(String name){ return generateUser(name, 23); } public User generateUser(int age){ return generateUser("張三", age); } public User generateUser(){ return generateUser("張三", 23); } ~~~ 但是確實寫起來比較麻煩。所以在`Java`調用`Kotlin`中含有默認的參數的時候,可以使用`@JvmOverloads`關鍵字實現,比如: ~~~ @JvmOverloads fun generateUser(name: String = "張三", age: Int = 23): User{ return User(name, age) } ~~~ 調用: ~~~ public class A { public static void main(String[] args) { User user = MyUtils.generateUser("李四"); System.out.println(user); } } ~~~ ## 2.4 @JvmStatic 在`Kotlin`中不再有靜態屬性和方法,對應的是一個伴生對象。比如下面的案例: ~~~ class User(@JvmField var name: String, @JvmField var age: Int) { override fun toString(): String { return "User(name='$name', age=$age)" } // 定義伴生對象 companion object { var UUID: String = "1231232" fun getUUID() = println(UUID) } } ~~~ 然后在`kotlin`中調用: ~~~ fun main() { // 和Java中靜態類似,可以直接通過類來訪問 User.Companion.getUUID() User.getUUID() } ~~~ 不妨繼續在`A.java`文件中進行調用: ~~~ public class A { public static void main(String[] args) { // 通過@JvmField轉為可以直接調用 System.out.println(User.UUID); // 調用方法 User.Companion.getUUID(); // 通過@JvmStatic將方法轉為可直接調用 User.getUUID(); } } ~~~ 當然,對應的`Kotlin`的代碼中添加了兩個注解: ~~~ // 定義伴生對象 companion object { @JvmField var UUID: String = "1231232" @JvmStatic fun getUUID() = println(UUID) } ~~~ 需要注意的是,在伴生對象中對屬性和方法分別使用`@JvmField`和`@JvmStatic`兩個關鍵字。 ## 2.5 @Throws ~~~ // 定義:該方法拋出一個IO異常 fun getUser(){ throw IOException() } ~~~ 然后在`Java`中調用: ~~~ public class A { public static void main(String[] args) { // 調用異常 MyUtils.getUser(); } } ~~~ 但是代碼沒有提示需要使用`try-catch`來對異常進行捕獲,運行: ``` Exception in thread "main" java.io.IOException at com.kotlinLearn.MyUtils.getUser(KotlinDemo.kt:34) at com.kotlinLearn.A.main(A.java:6) ``` 所以可以添加一個`@Throws`注解進行說明: ~~~ // 定義:該方法拋出一個IO異常 @Throws(IOException::class) fun getUser(){ throw IOException() } ~~~ 然后調用的時候就會有對應的異常提示,如下圖: ![](https://img.kancloud.cn/05/17/0517243d18b945ea96ae0720fbf2e676_649x199.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看