[Kotlin朱凱]構(gòu)造參數(shù),頂級(jí)聲明,伴生對(duì)象,數(shù)組集合等

1.構(gòu)造方法,初始化代碼塊

java中                                                      
public class User {
  private String name;
  public user(String name) {
  this.name = name;
  }
//初始化代碼塊
  {
system.out.print("我是初始代碼塊")
  }
}
kotlin中
class User{
  var name:String
//構(gòu)造方法
  constructor(name:String) {
  this.name = name
  }
  init {
  println("我是初始化代碼塊")
  }
} 
在A(yíng)ndroidStudio中創(chuàng)建構(gòu)造參數(shù),使用上面的寫(xiě)法,被提示"convert to primary constructor",修改為以下寫(xiě)法
class UserData(var age: Int) : UserDataSuper() {

}

1.1主構(gòu)造函數(shù) primary constructor

  • 主構(gòu)造函數(shù)沒(méi)有方法體,但可以在init{}代碼塊中使用
  • 主構(gòu)造函數(shù)中的參數(shù)如果使用了var/val,等于在類(lèi)中創(chuàng)建了一個(gè)同名的屬性
  • 主構(gòu)造函數(shù)會(huì)參與到所有次級(jí)構(gòu)造函數(shù)創(chuàng)建對(duì)象的初始化過(guò)程中,也就是創(chuàng)建次級(jí)構(gòu)造函數(shù),必須要調(diào)用主構(gòu)造函數(shù)
class User(var name:String,var age:Int) {
    init {
            .....
    }
    constructor():this() {
    }
}

1.2次級(jí)構(gòu)造參數(shù)

class TestClass(var name:String) {
    //直接調(diào)用主構(gòu)造函數(shù)
    constructor(name:String,age:Int):this(name) {

    }
    
    //這里調(diào)用了上面的次級(jí)構(gòu)造函數(shù),屬于間接調(diào)用主構(gòu)造函數(shù)
    constructor(name:String,age:Int,id:String):this(name,age) {
        
    }
}

2.kotlin中去除靜態(tài)變量和靜態(tài)方法的寫(xiě)法,使用companion object

可以將一個(gè)類(lèi)中的所有靜態(tài)變量,方法,都統(tǒng)一寫(xiě)到伴生對(duì)象中,語(yǔ)義和閱讀更舒適些

//1.object  關(guān)鍵字  修飾類(lèi),替換掉class,意思:創(chuàng)建一個(gè)類(lèi),并且創(chuàng)建這個(gè)類(lèi)的對(duì)象
//kotlin中的單例, 而里面的方法,變量,都類(lèi)似于靜態(tài)變量和靜態(tài)方法,直接全部用類(lèi)名就可以調(diào)用
object User {
  val name:String = "liangpeng"
  fun userInfo() {

  }
//使用時(shí),直接類(lèi)名.方法名     User.userInfo()    User.name
}
//1.1 如果我不希望這個(gè)類(lèi)是object,但我想讓里面有靜態(tài)函數(shù)或者靜態(tài)變量怎么辦呢?
class User {
    object InnerUser {
      val name:String = "liangpeng"
      fun say() {
      }
  }
}
//外部調(diào)用時(shí)
User.InnerUser.name
User.InnerUser.say()
//1.2 使用companion的寫(xiě)法,但kotlin不推薦
class User {
//這里直接去掉這個(gè)類(lèi)的名字,調(diào)用時(shí)就可以直接調(diào)用里面的變量和函數(shù)
   companion object {
      val name:String = "liangpeng"
      fun say() {
      }
  }
}
//外部調(diào)用時(shí)
User.name
User.say()
//1.3 kotlin推薦的簡(jiǎn)便寫(xiě)法   top-level 頂層聲明,隸屬于package,是全局的
   val name:String = "liangpeng"
      fun say() {
      }
class User {
 
}

//調(diào)用時(shí): 直接   
var myName = name
say()

3. object, companion object, 頂層聲明,三者的使用場(chǎng)景

  • 假如寫(xiě)一個(gè)工具類(lèi),就可以創(chuàng)建一個(gè).kt文件,不用寫(xiě)類(lèi),直接寫(xiě)成頂層函數(shù)
  • 假如是寫(xiě)一個(gè)單例,使用object
  • companion object,就是伴生對(duì)象,慢慢去發(fā)掘更多的使用場(chǎng)景
    總結(jié): 慢慢總結(jié)摸索,找到更適合他們的場(chǎng)景

4.const

針對(duì)編譯期常量 compile-time constant 不太懂--

java中常量
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getName()
 ......
}
kotlin中
class MainActivity : AppCompatActivity {
companion object {
    const val TAG = MainActivity.class.getName()
  }
.....
}

5.kotlin中得匿名內(nèi)部類(lèi)

java中用new kotlin中用object 這兩個(gè)關(guān)鍵字都修飾的是接口或抽象

首先看java中的:
public class TestClass {
        //匿名內(nèi)部類(lèi)
        ITestClass iTestClass = new ITestClass() {
            @Override
            public void method1(String name) {
                
            }
        };
}

kotlin中:
class KotlinTestClass {

   var iKotlinTestClass =  object :IKotlinTestClass {
        override fun method1(name:String):String {
            return "匿名內(nèi)部類(lèi)"
        }
    }

}

6.數(shù)組

可以看到 Kotlin 中的數(shù)組是一個(gè)擁有泛型的類(lèi)搅方,創(chuàng)建函數(shù)也是泛型函數(shù)劳淆,和集合數(shù)據(jù)類(lèi)型一樣。

對(duì)數(shù)組的操作可以像集合一樣功能更強(qiáng)大踩官,由于泛型化管闷,Kotlin 可以給數(shù)組增加很多有用的工具函數(shù):

  • get() / set()
  • contains()
  • first()
  • find()
java中
  protected void arrayTest() {

        String[] strs = {"1", "2", "3"};
        int[] ints = {1, 2, 3};
        String[] strs2 = new String[2];
        for (String str : strs) {

        }

        strs2[0] = "1";

    }
kotlin中:
     val arrayOf = arrayOf("1", "2", "3")
     var arrayof2:Array<String> = arrayOf("a","a")
   
  • 不支持協(xié)變

Kotlin 的數(shù)組編譯成字節(jié)碼時(shí)使用的仍然是 Java 的數(shù)組遏考,但在語(yǔ)言層面是泛型實(shí)現(xiàn)捂人,這樣會(huì)失去協(xié)變 (covariance) 特性,就是子類(lèi)數(shù)組對(duì)象不能賦值給父類(lèi)的數(shù)組變量:

kotlin中:
   fun test1() {
      //Error:  Type mismatch: inferred type is Array<Int> but Array<Any> was expected
        var str = arrayOf(1,2,3)
        var strParent:Array<Any> = str
    }
java 中:
   String[] str = {"1","2"};
    Object[] objects = str;

7集合

Kotlin 和 Java 一樣有三種集合類(lèi)型:List蛔屹、Set 和 Map削樊,它們的含義分別如下:

  • List 以固定順序存儲(chǔ)一組元素,元素可以重復(fù)兔毒。
  • Set 存儲(chǔ)一組互不相等的元素漫贞,通常沒(méi)有固定順序。
  • Map 存儲(chǔ) 鍵-值 對(duì)的數(shù)據(jù)集合眼刃,鍵互不相等绕辖,但不同的鍵可以對(duì)應(yīng)相同的值。

List

??
List<String> strList = new ArrayList<>();
strList.add("a");
strList.add("b");
strList.add("c"); 
???            
val strList = listOf("a", "b", "c")

Kotlin 中的 List 多了一個(gè)特性:支持 covariant(協(xié)變)擂红。也就是說(shuō)仪际,可以把子類(lèi)的 List 賦值給父類(lèi)的 List 變量:

???
val strs: List<String> = listOf("a", "b", "c")
                ??
val anys: List<Any> = strs // success

??
List<String> strList = new ArrayList<>();
       ??
List<Object> objList = strList; // ?? compile error: incompatible types

Set

??
Set<String> strSet = new HashSet<>();
strSet.add("a");
strSet.add("b");
strSet.add("c");
???           
val strSet = setOf("a", "b", "c")

Map

創(chuàng)建,取值,修改

   fun mapTest(){
        var mapData:Map<String,Int> = mapOf("one" to 1,"two" to 2,"three" to 3)
        //取值
        println( mapData.get("one"))
        //取值2
        println(mapData["two"])

        var mapData2 = mutableMapOf("one" to 1,"two" to 2,"three" to 3)
        //修改值
        mapData2.put("one",111)
        //修改值2
        mapData2["two"] = 222
        for (mutableEntry in mapData2) {
            println("---"+mutableEntry.value)
        }
    }

注意:kotlin中得這三種集合都分可變集合和不可變集合的

  • listOf() 創(chuàng)建不可變的 List,mutableListOf() 創(chuàng)建可變的 List昵骤。
  • setOf() 創(chuàng)建不可變的 Set树碱,mutableSetOf() 創(chuàng)建可變的 Set。
  • mapOf() 創(chuàng)建不可變的 Map变秦,mutableMapOf() 創(chuàng)建可變的 Map成榜。

Sequence

三種創(chuàng)建方式:

sequenceOf("a", "b", "c")

val list = listOf("a", "b", "c")
list.asSequence()
                  
val sequence = generateSequence(0) { it + 1 }
                              

可見(jiàn)性修飾符

  • public :公開(kāi),可見(jiàn)性最大蹦玫,哪里都可以引用赎婚。
  • private:私有刘绣,可見(jiàn)性最小,根據(jù)聲明位置不同可分為類(lèi)中可見(jiàn)和文件中可見(jiàn)挣输。
  • protected:保護(hù)纬凤,相當(dāng)于 private + 子類(lèi)可見(jiàn)。
  • internal:內(nèi)部撩嚼,僅對(duì) module 內(nèi)可見(jiàn)停士。

與java對(duì)比:

  • protected: 包內(nèi)和子類(lèi)
  • private: java中外部類(lèi)可以訪(fǎng)問(wèn)private修飾的內(nèi)部類(lèi),
    而kotlin中外部類(lèi)不可以修改private修飾的內(nèi)部類(lèi)
  • Java 中一個(gè)文件只允許一個(gè)外部類(lèi),所以 class 和 interface 不允許設(shè)置為 private完丽,因?yàn)槁暶?private 后無(wú)法被外部使用恋技,這樣就沒(méi)有意義了。
  • Kotlin 允許同一個(gè)文件聲明多個(gè) class 和 top-level 的函數(shù)和屬性逻族,所以 Kotlin 中允許類(lèi)和接口聲明為 private蜻底,因?yàn)橥瑐€(gè)文件中的其它成員可以訪(fǎng)問(wèn):
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市聘鳞,隨后出現(xiàn)的幾起案子朱躺,更是在濱河造成了極大的恐慌,老刑警劉巖搁痛,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宇弛,居然都是意外死亡鸡典,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)枪芒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)彻况,“玉大人,你說(shuō)我怎么就攤上這事舅踪∨Ω剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵抽碌,是天一觀(guān)的道長(zhǎng)悍赢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)货徙,這世上最難降的妖魔是什么左权? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮痴颊,結(jié)果婚禮上赏迟,老公的妹妹穿的比我還像新娘。我一直安慰自己蠢棱,他們只是感情好锌杀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布甩栈。 她就那樣靜靜地躺著,像睡著了一般糕再。 火紅的嫁衣襯著肌膚如雪量没。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天亿鲜,我揣著相機(jī)與錄音允蜈,去河邊找鬼。 笑死蒿柳,一個(gè)胖子當(dāng)著我的面吹牛饶套,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垒探,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妓蛮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了圾叼?” 一聲冷哼從身側(cè)響起蛤克,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夷蚊,沒(méi)想到半個(gè)月后构挤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惕鼓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年筋现,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箱歧。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矾飞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呀邢,到底是詐尸還是另有隱情洒沦,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布价淌,位于F島的核電站申眼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏输钩。R本人自食惡果不足惜豺型,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望买乃。 院中可真熱鬧姻氨,春花似錦、人聲如沸剪验。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至娶眷,卻和暖如春似嗤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背届宠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工烁落, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豌注。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓伤塌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親轧铁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子每聪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355