?
Kotlin?基本數據類型
Java? ? ? ? ? ?|? ? Kotlin
byte? ? ? ? ? ? ? ? ?Byte
short? ? ? ? ? ? ? ? ?Short
int? ? ? ? ? ? ? ? ? ?Int
long? ? ? ? ? ? ? ? Long
float? ? ? ? ? ? ? ? Float
double? ? ? ? ? ? ? ? Double
boolean? ? ? ? ? ? ? ? Boolean? ? ? ?
char? ? ? ? ? ? ? ? Char
數據類型之間可以相互轉化?比如
var index = 10? ? ? ?index.toLong,index.toDouble ...等
聲明變量一般為? var?賦值變量? val?表示常量
可以顯示聲明類型:
var name : String = "Csdn"
也可以隱式聲明:
var name = "Csdn"
val?修飾的一般為常量?不可改變? 例如:
val name = "Android"
name = "Hello"?就會報錯
修飾方法?一般為fun?例如:
fun getNumber(index : Int) : Int?
getNumber(Index : Int)?代表傳入一個Int的值?而函數中 :?后面的則為返回類型
無返回類型一般不用寫,也可以寫Unit
繼承和實現:
Java?繼承是extends? 而Kotlin就是? :?
比如:?class A extnds B ,Kotlin則是class A : B ()
實現 Java是implements?而Kotlin? 則是?直接實現的類的方法或者其他的屬性
Kotlin特性之空安全
比如:private var name : String?這樣寫是報錯的?因為沒有初始化?為Null
如果可能需要為null或者避免檢驗? 可以這樣寫: private var name : String? = null
Java避免空屬性可以用注解 @NonNull @Nullable
kotlin中如果聲明可為空?也就是 var name : String? = null?調用時會報錯?
如果強行調用?有兩種方式:
安全調用value?.xxx?用?安全調用?為空則不調用
value!!.xxx強行調用,可能會報空指針
(變量后面有感嘆號!代表非Kotlin聲明的?比如是Java?等)
延遲初始化之 lateinit
lateinit?修飾的不能有初始值
比如 val lateinit name : String
類型判斷
如果不確定數據類型?java中則是 instanceof?而Kotlin中則是 is
強制類型轉換:
java中則是? A a = (A) value ,kotlin則是 as??
獲取class
java獲取class?比如Main.class, value.getClass
kotlin獲取為? Main::class ,獲取Java的class? 則是 Main::class.java?
創建實例:
java中?通過new?創建?調用有參或者無參構造
kotlin中則是直接?類名()?參數? 比如Intent,?java:new Intent(xx,xx);kotlin Intent(xx,xx)
get/set
kotlin?聲明屬性時候默認會創建get/set?例如 :
var name : String? = null
? ? ? ? get(){
return field
}set(){
? ? ? ?field = name
}
構造器
constructor?函數?分為無參數:
constructor(){
}
有參數:
constructor(name : String){
}
@JvmField
如果成員變量中使用@JvmField則生成一個public的成員變量?不會生成get set
類的繼承
java?所有的類?默認繼承Object
Kotlin?默認?Any (更精簡)
java void?對應kotlin Unit
構造器相互調用
單參數調用多參數?使用this(參數1,參數2...)
constructor(context : Context) this(context,null)
數組:
java中通過 []聲明一維和二維?比如 int [] xx
kotlin則是?通過 arrayOf?比如 val numberList = arrayOf(1,2,3)?這種寫法會自動裝箱,造成不必要的內存開支,基本數據類型?比如int? 可以使用intArrayOf?比如?val intArr : IntArray = intArrayOf(1,2)
intArrayOf? FloatArrayOf?等
數組長度表示:在Java中?數組[ ]?長度表示為length? 而Kotlin?則是 size
靜態函數
java使用 static
kotlin : 1?定義在函數?比如?fun getMax()?通過導入包調用函數?稱為頂級函數?類似于Java XXX.getMax()
object
kotlin?可以通過object?聲明一個類,這個類中的變量和函數會變成全局的
并不是靜態函數,而是自動創建這個類的單例對象,然后通過單例對象訪問這個類
如 object V {}?這里面聲明的函數是靜態的?可以V.xxx調用,如果在Java中調用v的函數
則需要V.INSTANCE.getXXX()
companion object?靜態變量修飾
類中的單利對象?比如 class Rock : A {
companion object{
? ? ? ? private lateinit var index : Value?
? ? ? ? fun getValue() : Value{
? ? ? ? ? ? ? ? return value
????????}
}
fun setValue (value : Value){
? ? ? ? value = this;
}
}
可以在object聲明的函數方法中加入@JvmStatic?聲明為靜態函數
@file
例如在類的開頭:@file:JvmName("xxx")?作用對象為文件
$
簡化字符串模板可以省略拼接字符串+?比如 var name : String = "Key$name"
object : params?等同于創建一個內部類
in
在xx?區間?
在Java中表示 if (number >?200 &&?number < 600)
kotlin if (number in 200..600)?區間范圍
when
類似于java的swith?同時支持表達式?比如 if xx else if xx else if xx
可以用when (code )? in 200 -> { } in 300 ->{} else ->{}
接口
也是用interface?定義?
抽象
也是用abstract定義,構造器調用父類使用 : super(xxx)?
枚舉
使用 enum class?定義 (繼承Annotation)
使用enum進行定義enum class Type{ A {} abstract fun type()}
fun
用于修飾方法
編譯期常量 const
在 companion object{
? ? ? ? const val NAME = "name"
}
引用外部對象屬性
java?通常是類名.this.變量名
kotlin this@外部類類名.成員以及變量
創建集合?
java? new ArrayList
kotlin : ArrayList?也可以用 arrayListOf創建?或者 MutableList
?
listOf / List 不支持修改 MutableList支持修改 -----Map?HashMap/MutableMap同理
遍歷:
foreach?
java : for ()
kotlin in? for (value : Value in list)
靜態內部類
internal?可進行修飾符,當前模塊可見
inner?修飾內部類?但是不能存在compaion? object?此對象
kotlin? ?在普通類和方法中默認是final?修飾的?否則需要用abstract / open /override?