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):