Kotlin 是一門現代但已成熟的編程語言,旨在讓開發人員更幸福快樂。 它簡潔、安全、可與 Java 及其他語言互操作,并提供了多種方式在多個平臺間復用代碼,以實現高效編程。
https://play.kotlinlang.org/byExample/01_introduction/02_Functions
目錄
- 引出
- hello
- function函數
- Infix Functions 中綴函數
- Operator Functions 算術函數
- 變長參數vararg Parameters
- 變量
- kt中的null
- kt中的類
- 泛型 Generics
- 泛型函數Generic Functions
- 繼承Inheritance
- 超類Asiatic
- 總結
引出
1.kotlin初識;
2.function函數,變量,null;
3.泛型,接口,繼承,超類;
hello
package com.tianju.ktLearnfun main() { // 2println("Hello, World!") // 3
}
function函數
- 返回值為Unit,表示沒有返回值, 類似與java里面的 void
- Unit可以省略不寫,可以傳兩個參數,參數帶有默認值
package com.tianju.ktLearn// 返回值為Unit,表示沒有返回值, 類似與java里面的 void
fun printMsg(msg: String): Unit {println(msg)
}// Unit可以省略不寫,可以傳兩個參數,參數帶有默認值
fun printMsgWithPrefix(msg: String, prefix:String = "info") {println("[wtt--$prefix] $msg")
}fun sum(x: Int, y: Int): Int {return x+y;
}fun multiply(x: Int,y: Int) = x*yfun main() {printMsg("Pet!")// 可以不傳參,帶有默認參數的printMsgWithPrefix("Hello")printMsgWithPrefix("Hello","Peter")printMsgWithPrefix(prefix = "MMDD", msg = "HTTP")val sum = sum(100, 300)println(sum)println(multiply(3,30))
}
Infix Functions 中綴函數
具有單個參數的成員函數和擴展可以轉換為中綴函數。
package com.tianju.ktLearn;// 具有單個參數的成員函數和擴展可以轉換為中綴函數
fun main(){infix fun Int.times(str: String) = str.repeat(this)println(2 times "Hei!")// to 是標準庫中的函數 kotlin.Pair<A, B>val pair = "WHTT" to "PPTS"println(pair)// 自定義一個 onto 函數infix fun String.onto(str: String) = Pair(this,str)val myPair = "MVC" onto "WWW"println(myPair)val pet = Person("peter",34)val Shi = Person("Shirley",30)pet likes Shiprintln(pet.people[0])
}class Person(val name: String,val year: Int){val people = mutableListOf<Person>()infix fun likes(person: Person){people.add(person)}}
Operator Functions 算術函數
Certain functions can be “upgraded” to operators, allowing their calls with the corresponding operator symbol.
package com.tianju.ktLearn// 符號times 就是 下面的 乘號 *
operator fun Int.times(str:String) = str.repeat(this)fun main() {println(2 * "Bye")val str = "Always forgive your enemies; nothing annoys them so much."operator fun String.get(range: IntRange) = substring(range)println(str[0..14])
}
變長參數vararg Parameters
package com.tianju.ktLearnfun printAll(vararg msgs: String) {for (msg in msgs){println(msg)}
}fun printWithPre(vararg msgs: String, prefix:String): Unit {for (msg in msgs) println("[嘻嘻嘻--$prefix]$msg")
}fun logs(vararg msgs:String){printAll(*msgs)
}fun main() {printAll("pet","sh","wt")printWithPre("pet","sh","wt", prefix ="Hi")logs("sh","wtt","abc")}
變量
Kotlin具有強大的類型推理能力。雖然你可以顯式地聲明變量的類型,但你通常會讓編譯器通過推斷來完成這項工作。Kotlin不強制執行不變性,但建議這樣做。本質上使用val而不是var。
val b: Int = 1 // 2
val c = 3 // 3
聲明一個不可變變量并對其進行初始化。
聲明一個不可變變量并在不指定類型的情況下對其進行初始化。編譯器推斷類型Int。
kt中的null
- 在kt里面,如果有一個可以為null,需要在類型后面加上 問號 ?
- 函數只能傳入不為null的值
- 參數類型后面加個 ? 問號后,傳入的值可以為null
package com.tianju.ktLearnfun main() {var neverNull : String = "never Null"// neverNull = nullprintln(neverNull)// 在kt里面,如果有一個可以為null,需要在類型后面加上 問號 ?var nullable:String? = "can be null"nullable = nullprintln(nullable)fun strLength(notNull:String ): Int {return notNull.length}// 函數只能傳入不為null的值strLength(neverNull)
// strLength(nullable) // 爆紅val str = descStr(null)println(str)println(descStr("hello are you ok?"))
}/*** 返回值為String,* 參數類型后面加個 ? 問號后,傳入的值可以為null*/
fun descStr(maybeStr: String?): String {if (maybeStr !=null && maybeStr.length>0){return "StrLength is ${maybeStr.length}"}return "null"
}
kt中的類
- 在kt里面沒有 new 關鍵字
泛型 Generics
package com.tianju.ktLearn/*** 可以輸入多個參數 vararg* <E> 泛型*/
class MutableStack<E>(vararg items: E) { // 1private val elements = items.toMutableList()fun push(element: E) = elements.add(element) // 2// 偷看一下fun peek(): E = elements.last() // 3// 彈出棧頂元素fun pop(): E = elements.removeAt(elements.size - 1)fun isEmpty() = elements.isEmpty()fun size() = elements.sizeoverride fun toString() = "MutableStack(${elements.joinToString()})"
}fun main() {val mut = MutableStack<String>("hello","pet")println("is mut empty?---> " + mut.isEmpty())print(mut)mut.push("wtt")println(mut)mut.peek()println(mut)val pop = mut.pop()println(pop)println(mut)println("is mut empty?---> " + mut.isEmpty())
}
泛型函數Generic Functions
如果函數的邏輯獨立于特定類型,則也可以生成函數。例如,您可以編寫一個實用程序函數來創建可變堆棧:
繼承Inheritance
超類Asiatic
package com.tianju.ktLearn/*** open 關鍵字就表示是接口 interface*/
open class Dog{open fun fake(){println("wow wow !")}
}class YourDog : Dog(){override fun fake() {println("miao wu ,wow")}
}/*** 帶參數的接口* interface with par*/
open class Cat(val name: String){fun sayHello(){println("A cat name is [$name] say hello")}
}class Arya : Cat("Arya")/*** 超類 :將構造函數參數傳遞給超類*/
open class Lion(val name:String,val age: Int){fun sayHello(){println("hi, every one, my name is $name, age is $age")}
}/*** Asiatic聲明中的name既不是var也不是val:它是一個構造函數參數*/
class Asiatic(name: String) : Lion(name = name, age = 18)fun main() {val dog = YourDog()dog.fake()val cat : Cat = Arya()cat.sayHello()println(cat.name)val lion: Lion = Asiatic("Peter")lion.sayHello()
}
總結
1.kotlin初識;
2.function函數,變量,null;
3.泛型,接口,繼承,超類;