------>可讀可寫變量
var name: String = "Hello World";
------>只讀變量
val name: String = "Hello World"
------>類型推斷
val name: String = "Hello World" 可以寫成 val name = "Hello World"
------>基本數據類型
1.String,Double,Int,Float,Long,Short,Byte,Char,Boolean
2.Kotlin對于小數的默認推斷是Double類型,默認6位
3.and(bits),or(bits), inv()
------>編譯時常量
const val PI = 3.1415 需要定義在全局變量范圍內,不能定義到函數內部,這才叫編譯時常量
------>range 表達式
val number = 148if (number in 0 .. 59) {println("不及格")} else if (number in 60 .. 100) {println("及格")} else if (number !in 0 .. 100) {println("成績無效")}
------>when 表達式
val month = "January"val result = when(month) {"January" -> "一月""February" -> "二月""March" -> "三月""April" -> "四月""May" -> "五月""June" -> "六月""July" -> "七月""August" -> "八月""September" -> "九月""October" -> "十月""November" -> "十一月""Devember" -> "十二月"else -> "錯誤的月份"}println(result)
------>String 模板
val isLogin = trueprintln("server respose result : ${if (isLogin) "登錄成功" else "登錄失敗"}")
------>具名函數參數
具名函數的意義是:假如一個函數有多個參數,傳遞參數的時候為了避免一個一個對,可以直接用名字賦值
loginAction(name = "Derr", age =90)private fun loginAction(name: String, age: Int) {println("name is : ${name}, age is : ${age}")}
------>Nothing 類型會終止程序
TODO("not implement")
------>雙等號相當于Java中的equals(),三哥等號是引用的比較,也就是地址的比較
------>類型轉換相關
val number1 : Int? = "666.6".toIntOrNull() // 能轉換成功就轉換,不成功就返回Null
val r = "%3.f".format(65.38344) // r 的類型是String
println(65.683.roundToInt()) // 會四舍五入,結果是66
------>apply 內置函數
apply 函數會返回對象本身
val file = File("D:\\a.txt")
// 普通寫法
file.setExecutable(true)
file.setReadable(true)
println(file.readLines())//apply寫法
file.apply {setExecutable(true) // 這里面會有this引用,可以省略不寫
}.apply {setReadable(true)
}.apply {println(readLines())
}.ll
------>let 內置函數
fun main() {println(getMethod(null))
}
fun getMethod(value: String?): String {// 判空用法,當value為空的時候將不會執行閉包里面的邏輯return value?.let {"值是非空的"} ?: "值是空的"
}
------->run 擴展函數
最后一行當作函數的返回值,在run函數中可以直接訪問實例的公有屬性和方法
fun main() {println(testRun(Jump()))
}class Jump {fun test():String {return "111"}
}
fun testRun(jump: Jump) : String {jump.run {test() // 直接調用return jump.test()}
}
------>數組的創建
val array: Array<Any> = arrayOf(1, 2, 3, 4)println(array[0])val arrayOfNulls = arrayOfNulls<Any>(5)arrayOfNulls[0] = "1"arrayOfNulls[1] = 'A'arrayOfNulls[2] = 1arrayOfNulls.forEachIndexed(action = {index, item ->println("$index:$item")})
------>可變的集合,不可變的集合
// 可變集合val array = mutableListOf<Any>()array.add("1")array.add(2)// 不可變集合val arrayInt = listOf(1,2,3)// 可變Mapval arrayMap = mutableMapOf<String, Int>()arrayMap["1"] = 1arrayMap["2"] = 1// 不可變Map,通過Pair指定集合里面的元素val arrayMap2 = mapOf<String, Int>(Pair("1",1))for (item in arrayMap2) {println(item)}
------>類
Person().test()
Person.test2()
println(NumUtil.double(4))// 普通類
class Person {fun test() {println("豬頭")}// 半生類companion object{fun test2() {println("半生類")}}
}// 靜態類
object NumUtil {fun double(num: Int): Int {return num * num}
}
------>泛型類和泛型接口
fun main() {val drinkFruits = DrinkFruits()drinkFruits.drinks("apple juice")val eat = EatEgg("blue")eat.prints()
}
// 泛型接口
interface Drink<T> {fun drinks(t: T)
}
class DrinkFruits: Drink<String> {override fun drinks(t: String) {println("Drink:$t")}
}
// 泛型類
abstract class Eat<T> {abstract fun prints()
}class EatEgg(val color: String) : Eat<String>() {override fun prints() {println("eat:${color}'s egg")}
}
------->擴展方法
擴展方法在什么時候使用呢?
當一個jar包中的方法不滿足我們的需求時,
我們可以給jar包中的某個類添加方法,因為jar包中的那個方法本身是不可以修改的
fun main() {println(Jump().doubleJump())
}class Jump {
}fun Jump.doubleJump(): String {val result = "此方法為擴展方法"return result
}
----------->延遲初始化
private lateinit var _binding: FragmentFirstBinding
-----------------------------------------基礎知識學習完之后訓練的例子-------------------------------------------------
package com.example.kotlindemo// 一次2位數四則運算
fun main() {while(true) {// 控制臺輸入println("請輸入一個2位數的加減乘除")val input = readLine()input?.let {val result = calculate(input)println(result)println("是否繼續使用程序,繼續使用請輸入Y,不使用請輸入N")val inputContinue = readLine()inputContinue?.let {if (it != "Y") {System.exit(-1)}}}}}fun calculate(input: String): String {if (input.contains("+")) {val strings = input.trim().split("+")return operate(strings[0].toDouble(), strings[1].toDouble(), "+").toString()} else if (input.contains("-")) {val strings = input.trim().split("-")return operate(strings[0].toDouble(), strings[1].toDouble(), "-").toString()} else if (input.contains("*")) {val strings = input.trim().split("*")return operate(strings[0].toDouble(), strings[1].toDouble(), "*").toString()} else if (input.contains("/")) {val strings = input.trim().split("/")return operate(strings[0].toDouble(), strings[1].toDouble(), "/").toString()} else {return "you input is error!"}
}fun operate(num1: Double, num2: Double, operateChar: String): Double {return when(operateChar) {"+" -> num1 + num2"-" -> num1 - num2"*" -> num1 * num2"/" -> num1 / num2else -> 0.0}
}