文章目錄
Kotlin基礎語法(上)
Kotlin基礎語法(下)
Kotlin字符串和數字之間的轉換
var a = "13"
var b = 13
a = b.toString()
b = a.toInt()
Kotlin人機交互
fun main(args:Array<String>){
println("請輸入第一個數字:")
var numlstr = readLine()
println("請輸入第二個數字:")
var num2str = readLine()
var num1 = num1str!!.toInt()
var num2 = num2str!!.toInt() //!!代表輸入的數據絕對不爲空
println("$(num1)+$(num2)=$(num1+num2)")
}
Kotlin異常處理
fun main(args:Array<String>){
println("請輸入第一個數字:")
var numlstr = readLine()
println("請輸入第二個數字:")
var num2str = readLine()
try{
var num1 = num1str!!.toInt()
var num2 = num2str!!.toInt() //!!代表輸入的數據絕對不爲空
}catch(e:Exception){
println("運行錯誤!")
}
println("$(num1)+$(num2)=$(num1+num2)")
}
Kotlin遞歸
- 計算階乘
fun main(args:Array<String>){
var num = 5
//計算5的階乘
println("5的階乘是&(fact(num))")
//計算100的階乘
var num1 = BigInteger("100")
println("100的階乘是&{BigFact(num1)}")
}
fun fact(num:Int):Int{
if(num == 1){
return 1
}
else{
return num*fact(num-1)
}
}
fun BigFact(num:BigInteger):BigInteger{
if(num == BigInteger.ONE){
return BigInteger.ONE
}
else{
return num*fact(num-BigInteger.ONE)
}
}
Kotlin尾遞歸優化
- 尾遞歸要求返回值應該還是調用函數本身
- Kotlin尾遞歸優化
fun main(args:Array<String>){
var result = 0
println(ollAdd(100000))
}
tailrec fun ollAdd(num:Int, result:Int):Int{
if(num==0){
return 1
}else{
return num+ollAdd(num-1,result+num)
}
}
Kotlin面向對象
- 表示一個矩形類和一個妹子類
class Rect(var height:Int,var width:Int)
class Girl(var charctor:String, var voice:String)
fun main(args:Array<String>){
var rect1 = Rect(20,10)
println("高度:${rect1.height}")
println("寬度:${rect1.width}")
var girl1 = Girl("彪悍","甜美")
println("girl1這位妹子的聲音:${girl1.voice}")
}
/*
輸出:
高度:20
寬度:10
girl1這位妹子的聲音:甜美
*/
面向對象靜態屬性和動態行爲
class Girl(var charctor:String, var voice:String){
fun smaile(){
println("妹子笑了一下,麼麼噠!")
}
fun cry(){
println("嗚嗚嗚,人家傷心了!")
}
}
fun main(args:Array<String>){
var girl1 = Girl("彪悍","甜美")
println("girl1這位妹子的聲音:${girl1.voice}")
girl1.cry()
girl1.smaile()
}
面向對象實戰——洗衣服
/**
* 生產方創建的洗衣機
**/
class WashMachine(var module:String,var size:Int){
var isDoorOpen = true
var currentmode = 0
fun openDoor(){
println("洗衣機已經開門!!!")
isDoorOpen = true
}
fun closeDoor(){
println("洗衣機門已關閉")
isDoorOpen = false
}
fun selectMode(){
currentmode = readLine()
when(mode){
0 -> println("初始模式,請您選擇模式")
1 -> println("輕柔")
2 -> println("狂柔")
else -> println("Error")
}
}
fun start(){
if(isDoorOpen){
println("門還沒關,無法運行")
}
else{
when(currentmode){
0 -> {println("未選擇模式,不能開始洗衣服")}
1 -> {
println("放水")
println("開始輕柔模式洗衣服")
println("洗完了")
}
2 -> {
println("放水")
println("開始狂柔模式洗衣服")
println("洗完了")
}
else -> {println("未選擇模式,不能開始洗衣服")}
}
}
}
}
/**
* 用戶使用洗衣機
**/
fun main(args:Array<String>){
var washMachine = washMachine("小天鵝",size:12)
washMachine.openDoor()
println("請選擇模式:1,輕柔。2,狂柔")
washMachine.selectMode
washMachine.closeDoor()
washMachine.start()
}
Kotlin面向對象——封裝
- 封裝就是隱藏內部實現的細節
/**
* 生產方創建的洗衣機
**/
class WashMachine(var module:String,var size:Int){
var isDoorOpen = true
var currentmode = 0
fun openDoor(){
println("洗衣機已經開門!!!")
isDoorOpen = true
}
fun closeDoor(){
println("洗衣機門已關閉")
isDoorOpen = false
}
fun selectMode(){
currentmode = readLine()
when(mode){
0 -> println("初始模式,請您選擇模式")
1 -> println("輕柔")
2 -> println("狂柔")
else -> println("Error")
}
}
private fun setMotorSpeed(speed:Int){ //將方法私有化,只有內部函數可調用,外部並不能看到具體的實現細節,這就是封裝
println("發動機當前轉速 ${speed}轉/秒")
}
fun start(){
if(isDoorOpen){
println("門還沒關,無法運行")
}
else{
when(currentmode){
0 -> {println("未選擇模式,不能開始洗衣服")}
1 -> {
println("放水")
println("開始輕柔模式洗衣服")
setMotorSpeed(100)
println("洗完了")
}
2 -> {
println("放水")
println("開始狂柔模式洗衣服")
setMotorSpeed(1000)
println("洗完了")
}
else -> {println("未選擇模式,不能開始洗衣服")}
}
}
}
}
/**
* 用戶使用洗衣機
**/
fun main(args:Array<String>){
var washMachine = washMachine("小天鵝",size:12)
washMachine.openDoor()
println("請選擇模式:1,輕柔。2,狂柔")
washMachine.selectMode
washMachine.closeDoor()
washMachine.start()
}
kotlin面向對象——繼承
- 繼承是指一個對象直接使用另一對象的屬性和方法
/*
父類
*/
open class Fathor{ //只有類open之後才能被繼承
var chactor:String = "性格內向"
open fun action(){ //只有方法open之後,子類才能重寫該方法
println("公共場合大聲喧譁")
}
fun money(){
println("很有錢")
}
}
/*
子類
*/
class Son:Fathor(){
override fun action(){
println("兒子很乖,在公共場合很有禮貌")
}
}
fun main(args:Array<String>){
var son1 = Son()
println("兒子的性格${son1.chactor}")
son1.action()
son1.money()
}
/*
輸出:
兒子的性格內向
兒子很乖,在公共場合很有禮貌
很有錢
*/
kotlin面向對象——抽象類
abstract class Human(var name:String){ //抽象人類
abstract fun eat()
}
class Man(name:String):Human(name){
override fun eat(){
println("${name}哇哇哇地大口喫")
}
}
class Woman(name:String):Human(name){
override fun eat(){
println("${name}嗚嗚嗚地小口喫")
}
}
fun main(args:Array<String>){
var person1 = Man("金三胖")
person1.eat()
var person2 = Woman("慈禧太后")
person2.eat()
}
kotlin面向對象——多態
- 多態就是同種功能,不同的表現形態
abstract class Human(var name:String){ //抽象人類
abstract fun eat() //喫
abstract fun pee() //撒尿
}
class Man(name:String):Human(name){
override fun eat(){
println("${name}哇哇哇地大口喫")
}
override fun pee(){
println("${name}站着撒尿")
}
}
class Woman(name:String):Human(name){
override fun eat(){
println("${name}嗚嗚嗚地小口喫")
}
override fun pee(){
println("${name}蹲着撒尿")
}
}
fun main(args:Array<String>){
var person1 = Man("金三胖")
var person2 = Woman("慈禧太后")
var person3 = Man("李華")
var person4 = Woman("蒙娜麗莎")
var houseList = listOf<Human>(person1,person2,person3,person4)
for(person in houseList){
h.eat()
}
for(person in houseList){
h.pee()
}
}
kotlin面向對象——接口
- 接口泛指實體把自己提供給外界的一種抽象化物(可以爲另一實體),用以由內部操作分離出外部溝通方法,使其能被內部修改而不應向外界其他實體與其交互的方式。
- 接口和抽象類的區別
接口是事物的能力,而抽象類是事物的本質
interface IMan{
fun xiaodidi()
}
abstract class Human{
abstract fun eat()
}
class Man:Human(),IMan{
override fun xiaodidi(){
println("18釐米")
}
override fun eat(){
println("大口喫飯")
}
}
class TaiJian:Human(){
override fun eat(){
println("喫皇上賞的")
}
}
fun main(args:Array<String>){
var man1 = Man()
man1.xiaodidi()
man1.eat()
var man2 = TaiJian()
man2.eat()
var house = listOf<Human>(man1,man2)
for(person in house){
if(person is Man){ //判斷是否是Man
person.eat()
}
}
}
kotlin面向對象——委託和代理
- 委託是把事情託付給別人或別的機構辦理
- 代理是指以他人的名義,在授權範圍內進行對被代理人直接發生法律效力的法律行爲。代理的產生,可以是受他人委託。
interface IWashBow1{ //洗碗的接口
fun washing()
}
class BigHeadSon:IWashBowl{ //大頭兒子
override fun washing(){
println("我是大頭兒子,我在洗碗,一次賺1塊")
}
}
class SmallHeadFather:IwashBowl by BigHeadSon(){//小頭爸爸,委託給大頭兒子去洗碗
override fun washing(){
println("我是小頭爸爸")
BigHeadSon().washing()
println("我看着兒子把碗洗完了")
}
}
fun main(args:Array<String>){
var son = BigHeadSon()
son.washing()
var father = SmallHeadFather()
father.washing()
}
kotlin面向對象——單例模式
object BigHeadSon:IWashBowl{ //當一個類被定義爲object,那麼他在內存中就直接被創建,且有且僅有一個
override fun washing(){
println("我是大頭兒子,我在洗碗,一次賺1塊")
}
}
class SmallHeadFather:IwashBowl by BigHeadSon{//再委託的話,需要把括號去掉。
override fun washing(){
println("我是小頭爸爸")
BigHeadSon.washing() //如果帶着括號,相當於創建了兩個大頭兒子
println("我看着兒子把碗洗完了")
}
}
kotlin面向對象——枚舉
enum class Week{
星期一,星期二,星期三,星期四,星期五,星期六,星期日
}
fun main(args:Array<String>){
println(Week.星期一.ordinal) //打印星期一所在位序
}
kotlin面向對象——印章類(Sealed class)
- 子類類型有限的class
sealed class Son{ //小母驢,小公驢,小公馬生下來的兒子
fun sayHello(){
println("Hello")
}
class 小小驢():Son()
class 小騾子():Son()
}
fun main(args:array<String>){
var s1:Son = Son.小騾子() //無法直接實例化Son,只能實例化其中的類
var s2:Son = Son.小小驢()
var s3:Son = Son.小騾子()
var list = listOf<Son>(s1,s2,s3)
for(v in list){
if(v is Son.小騾子){
v.sayHello()
}
}
}