1. var 和 val
var理解成java中的變量,val理解成被 final 修飾的常量惜姐。
var id1 : String = "vicent"
id1 = "sfa"
val id2 : String = "112erf"
id2 = "dfs"http:// 會(huì) 報(bào)錯(cuò)
fun main() {
// kotlin 的安全設(shè)計(jì)對(duì)于聲明可為空的參數(shù),在使用時(shí)要進(jìn)行空判斷處理
// 有兩種處理方式:字段后加!!像java一樣拋出空異常椿息,另一種字段后加?
var info: String?= null
// println(info?.length)// 為空不執(zhí)行后面的代碼
// println(info!!.length)// 自己負(fù)責(zé)info, == java
println(test("b"))
// 如果一定要輸出null 就輸出 "你狠牛逼"
println(info?.length ?: "你狠牛逼")
}
// : int? == 允許返回null
fun test(name : String) : Int? {
if (name == "a") {
return 100
}
return null
}
類型推導(dǎo)
var name2 = "vicent"http:// 類型推倒
var name3 = 18
var name4 = 'A'
2. 函數(shù)
// void == : Unit 可以不寫Unit
fun main() : Unit {
println(add2(1, 4))
lenMethod(1,2,3)
}
fun add(number1: Int, number2: Int) : Int {
return number1 + number2
}
// 類型推導(dǎo)
fun add2(number1: Int, number2: Int) = number1 + number2
fun lenMethod(vararg value : Int) {// 可變參數(shù)
for (i in value) {
println(i);
}
}
3. 字符串模板
var name = "張三"
var name2 = 18
var name3 = 'A'
println("name:$name, name2:$name2, name3=$name3")
// 換行
val infoMsg = """
AAAA
BBBB
ccccc
ddddddd
""".trimIndent()// 去掉這個(gè)之后會(huì)有前置空格
println(infoMsg)
4. NULL檢查機(jī)制
// kotlin 的安全設(shè)計(jì)對(duì)于聲明可為空的參數(shù)歹袁,在使用時(shí)要進(jìn)行空判斷處理
// 有兩種處理方式:字段后加!!像java一樣拋出空異常,另一種字段后加?
var info: String?= null
println(info?.length)// 為空不執(zhí)行后面的代碼
println(info!!.length)// 自己負(fù)責(zé)info, == java
5. in 區(qū)間
fun main() {
for (i in 1..9) {
// println(i)
}
// 不會(huì)輸出
for (i in 9..1) {
// println(i)
}
for (i in 9 downTo 1) {
// println(i)
}
// 區(qū)間判斷
val value = 9
if (value in 1..100) {
// println("包含了")
}
// 指定步長(zhǎng)
for (i in 1..20 step 2) {
println(i)
}
// 排除最后元素
for (i in 1 until 10) {
println(i)
}
}
6. 比較兩個(gè)值
fun main() {
var name1: String = "張三"
var name2: String = "張三"
println(name1.equals(name2))
println(name1==name2) // 推薦使用
// 比較對(duì)象地址 ===
var age1:Int? = 10000
var age2:Int? = 10000
println(age1 === age2)// false
}
7. 數(shù)組
fun main() {
val numbers = arrayOf(1,2,4,5)
for (i in numbers) {
println(i)
}
val number2 = Array(10, {value: Int -> (value + 100) })
for (value in number2) {
println(value)
}
}
8. if 條件判斷
fun main() {
val number1: Int = 99
val number2: Int = 88
val maxValue = if (number1 > number2) number1 else number2
println(maxValue)
val number = 5
when (number) {
1 -> println("11")
2 -> println("22")
3 -> println("33")
4 -> println("44")
5 -> println("55")
else -> println("其他")
}
when (number) {
in 1..100 -> println("11")
in 101..200 -> println("22")
else -> println("其他")
}
val result = when (number) {
1 -> {
println("很開心")
"今天是星期一"
}
2 -> {
println("很開心")
"今天是星期二"
}
else -> "其他"
}
println(result)
}
9. 循環(huán)和標(biāo)簽
fun main() {
abcd@for (i in 1..10) {
for (j in 1..10) {
println("i:$i, j:$j")
if (i == 5) {
// break
break@abcd
}
}
}
var items = listOf<String>("aa", "bb", "cc")
for (item in items) {
// println(item)
}
// items.forEach { println(it) }
// 下標(biāo)
for (index in items.indices) {
}
}
// 自帶的標(biāo)簽
class Dayang {
val I = "aaa"
fun show() {
println(I)
println(this.I)
println(this@Dayang.I)
}
}
10. 類
// 默認(rèn) public final class person 不能被集成寝优,在class前面加上open就可以被集成
class Person(id : Int) {// 主構(gòu)造
// 次構(gòu)造 必須委托給主構(gòu)造
constructor(id: Int, name : String) : this(id) {
}
// 次構(gòu)造
constructor(id: Int, sex : Char) : this(id) {
}
}
Java 單例模式和Kotlin單例模式對(duì)比
Java
public class NetManager {
static class Holder {
private static NetManager instance = new NetManager();
}
public static NetManager getInstance() {
return Holder.instance;
}
}
Kotlin
class NetManager {
// 被objec 修飾的類 只實(shí)例一次 不需要()
object Holder {
val instance = NetManager()
}
// 派生操作 類被創(chuàng)建的時(shí)候一起被創(chuàng)建 看不到 static
companion object {
// 全部都是 相當(dāng)于 Java static
fun getInstance() : NetManager = Holder.instance;
}
}
懶漢式單例Java
public class NetManager2 {
private static NetManager2 instance = null;
public static NetManager2 getInstance() {
if (instance == null) {
instance = new NetManager2();
}
return instance;
}
}
kotlin
class NetManager {
companion object {
private var instance : NetManager?= null
fun getInstance() : NetManager {
if (instance == null) {
instance = NetManager();
}
return instance!!;
}
}
}
內(nèi)部類和嵌套類
class Test {
val I = "aaaa"
// 這個(gè)不是內(nèi)部類是嵌套類
class Sub {
fun show() {
println(I);// 會(huì)報(bào)錯(cuò)
}
}
// inner修飾內(nèi)部類
inner class Sub2 {
fun show() {
println(I);// 會(huì)報(bào)錯(cuò)
}
}
}
實(shí)例類条舔,so easy, 相當(dāng)于java bean,會(huì)默認(rèn)幫我們創(chuàng)建get set方法乏矾,以及toString equals copy 等方法
data class User(val id: Int, val name : String)
public final class User {
private final int id;
@NotNull
private final String name;
public final int getId() {
return this.id;
}
@NotNull
public final String getName() {
return this.name;
}
public User(int id, @NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.id = id;
this.name = name;
}
public final int component1() {
return this.id;
}
@NotNull
public final String component2() {
return this.name;
}
@NotNull
public final User copy(int id, @NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
return new User(id, name);
}
// $FF: synthetic method
public static User copy$default(User var0, int var1, String var2, int var3, Object var4) {
if ((var3 & 1) != 0) {
var1 = var0.id;
}
if ((var3 & 2) != 0) {
var2 = var0.name;
}
return var0.copy(var1, var2);
}
@NotNull
public String toString() {
return "User(id=" + this.id + ", name=" + this.name + ")";
}
public int hashCode() {
int var10000 = this.id * 31;
String var10001 = this.name;
return var10000 + (var10001 != null ? var10001.hashCode() : 0);
}
public boolean equals(@Nullable Object var1) {
if (this != var1) {
if (var1 instanceof User) {
User var2 = (User)var1;
if (this.id == var2.id && Intrinsics.areEqual(this.name, var2.name)) {
return true;
}
}
return false;
} else {
return true;
}
}
}