安卓開發(2)—— Kotlin語言概述


安卓開發(2)—— Kotlin語言概述

Android的官方文檔都優先采用Kotlin語言了,學它來進行Android開發已經是一種大勢所趨了。

這里只講解部分的語法。

如何運行Kotlin代碼

這里提供三種方式來運行Kotlin代碼:

1 使用IDEA來運行。

2 使用在線IDE來運行:https://play.kotlinlang.org/

3 在Android Studio中運行Kotlin代碼:

在項目中的MainActivity同級目錄下新建一個kotlin文件就可以直接單獨運行。

例如:在HelloWorld Android項目中

 

2.2 變量和函數

2.2.1 變量

在Kotlin中變量先分為可變變量和不可變變量,和別的語言不同,沒有那么多復雜的const使用,只有可變變量和不可變變量。可變變量的關鍵字為var(variable),不可變變量關鍵字為val(value)。

再由通常的編程語言里面有的類型推導符再分類(相當於就是和給Java/c++等常用的編程語言的變量類型關鍵字的第一個字符變大寫)。

C++ Java Kotlin
int int Int
long long Long
short short Short
float float Float
double double Double
bool boolean Boolean
char char Char
byte byte Byte

在Kotlin中定義一個變量的最完整格式:var/val 變量名 : 變量類型 = xxx

也可以采用自動推導類型來讓Kotlin自動推導變量類型: var/val 變量名 = xxx

//例子
fun main()
{
var a:Int = 10
println("a= " +a)

val b = "hehe"
println(b)
}

2.2.2 函數

Kotlin中的函數關鍵字是fun(function的簡稱)。

Kotlin中定義最標准的函數的模板:

fun 函數名(參數名:參數類型,...參數名n:參數類型) : 返回值類型
{

}

其中函數名自己隨便選,參數有多少個自己也可以隨便定義,如果不想要參數直接寫一個空括號,如果函數不需要返回值也可以直接不寫返回值類型,還可以利用自動推導類型來確定返回值類型。

 

//例如
fun test(num1:Int,num2:Int):Int
{
return num1+num2
}

如果函數體只有一行代碼,可以直接寫在函數體定義的尾部,中間用等號連接(返回值不添加return)。例如:

fun test(num1:Int,num2:Int):Int = num1+num2

再加上Kotlin的自動推導,還可以簡化成:

fun test(num1:Int,num2:Int) = num1+num2

 

2.3 邏輯控制

邏輯控制語句一般有條件語句,循環語句來構成。

kotlin中的條件語句主要有兩種方式:if和when。

2.3.1 if條件語句

大體上和C++/Java等編程語言的if-else流程語句一樣,但是Kotlin的if-else語句和C++/Java的代碼不同的是,if-else語句有返回值。

    var num1 = 10
  var num2 = 20
  var TestNum = if(num1>num2) {
      num1
  }else{
      num2
  }
  println(TestNum)

2.3.2 when條件語句

Kotlin中的when條件語句有點類似與C++/JAVA中的switch語句,但是when語句中拋棄了switch語句中的break,直接作為一次性跳轉使用,不會因為沒有break就繼續向下執行。

格式:

 when(匹配項)
{
匹配值 -> {代碼邏輯} //如果只有一行代碼,可以不用加{}
}
//例如:
fun main()
{
  var age = 1
  when(age)
  {
      1 -> println("一歲")
      2 ->{
      println("只有兩歲")
  }
      else -> println("Error")
  }
}

除了精致匹配匹配項里的內容外,還可以進行類型匹配:

fun CheckType(num: Number)
{
  when(num)
  {
      is Int -> println("輸入的是Int類型")
      is Double -> println("輸入的是Double類型")
      else -> println("輸入的不是Int或者Double類型")
  }
}
//這里的Number類型是Kotlin內置的一個抽象類,Kotlin的變量類型都是Number類型的子類,所以可以用它來使用子類,這個相當於
//C++里面的多態了。
//is是一個關鍵字用來判斷變量的類型,相當於java里面的instanceof

2.3.3 循環語句

kotlin主要提供了while和for循環兩種循環語句。

while循環語句和C++/JAVA/C等語句都一樣,但是在for循環語句中有很大的改變。

for循環中最主要的是for-in的用法。

在用kotlin中的for-in循環時,首先得明白kotlin中的區間的概念,其實就是一個范圍。

可以使用kotlin代碼來讓某個變量作為一個區間,如:

var test = 0..10

這段代碼的意思是定義了一個從0到10的左閉右閉區間,默認是

中間每個相差1,其中 ".."是創建兩端閉區間的關鍵字,在".."的兩邊指定區間的左右端點就可以創建一個左閉右閉區間了。

 

在創建了區間后,就可以使用for-in循環來遍歷這個區間了,例如:

fun TestCircle()
{
  val a = 0..10
  for(i in a){
      println(i);
  }
}

還可以創建左閉右開的區間,因為通常在數組中都是從0開始,比如char[10]的范圍就是0-9的閉區間。

//創建左閉右開區間
var a = 0 until 10
//得到的是一個[0,10)

如果想在循環中跳過一些元素,可以使用step關鍵字:

fun TestCircle2()
{
  for(i in 0 until 10 step 2)
  {
      println(i)
  }
}
//表示每次自增2

前面創建的都是從小到大的區間,那么肯定有要用到從大到小的時候。如果想要創建一個從大到小的就需要添加downTo關鍵字,例如:

fun TestCircle3()
{
  for(i in 10 downTo 1) //這里就是創建了一個[10,1]的區間,同樣也可以采用step來跳過一些
  {
      println(i)
  }
}

2.4 Kotlin面向對象編程

Kotlin同樣也是一門可以面向對象的語言。

新建類有兩種辦法,一種是直接利用Android Studio IDE來創建,還有一種是直接源代碼創建。

利用IDE創建:

右鍵想要在那個包里面創建->New->Kotlin File/Class: (再在這里輸入類名)

 

 

直接源代碼創建:

使用類的關鍵字class直接定義就好了,類的屬性可以在函數體里展示,也可以在類的內部展示

//例
class Test(var num1:Int,var num2:Int)
{
var num3 = (num1+num2)*2
}
//這就寫好了一個很簡單的類

實例化類,用類來創建對象,就等於把類當作一個變量類型來使用就好了,就像Int,Double一樣。

//實例化:
var TestClass = Test(1,2)//這樣就是實例化了一個Test類的對象

 

//使用類和對象的實例:
class a
{
  var name = "test"
}
fun TestClass()
{
  var Test = a()
  println(Test.name)
}

2.4.2 繼承和構造函數

在Kotlin中的繼承和別的面向對象語句繼承不一樣。

Kotlin里面的類默認是不可繼承的(抽象類除外),如果想要類可以被繼承,需要在創建的時候添加OPEN關鍵字,例如:

open class Person
{
...
}
//加上了open關鍵字后,這個類就可以被繼承了。

繼承首先得需要了解Kotlin里面的構造函數,每個Kotlin中的類有一個默認的構造函數和C++一樣,這個構造函數不需要寫,只需要在實例化的時候將創建類的時候申明的成員也加上去,但是在類的主體中的成員就不需要添加了。

相當於這個默認的主構造函數就是根據申明時的成員將其賦值給類創建的對象。

//例:
class TestClass(var num1:Int,var num2:Int)
{
  var num3 = num1 + num2;
  fun TestClassPrint()
  {
      println(num1)
      println(num2)
      println(num3)
  }
}
fun TestClassFun()
{
  var Test= TestClass(1,2)
  Test.TestClassPrint()
}

繼承:在繼承時首先需要要繼承的該類申明時有OPEN關鍵字,然后直接在定義的子類的時候加上: 和父類的構造函數就好了,和C++一樣的。

class Person()
{

}

class Person2 : Person()
{

}

2.4.3 接口

這個就和JAVA中的接口差不多了,同樣也和C++里面的虛基類類似。

首先創建一個接口類:

interface study
{
  fun ReadBooks()
  fun DoHomeWork()
}

接下來就可以用子類來重寫實現了:

class Student : Study
{
  override fun ReadBooks()
  {
      println("學生正在看書")
  }
  override fun DoHomeWork()
  {
      println("學生正在做作業")
  }
}
//重寫接口類的函數需要添加override關鍵字

還可以在接口類中寫默認函數,也就是將一個函數實現,那么接下來繼承接口類的類可以選中不實現該函數,但是沒有實現的接口類函數就必須要實現。

//例如:
interface study
{
  fun ReadBooks()
  {
  println("看書中")
  }
  fun DoHomeWork()
}

2.4.4 成員屬性

每門面向對象語言都會有成員屬性修飾符,Kotlin也不例外,Kotlin有public,private,protected和internal四種。

屬性 作用
public Kotlin中默認是public,public表示對所有都可見
private 只有當前類可見
protected 對當前類,子類和包路徑下的類看郵件
internal 同一模塊中的類可見

2.4.5 數據類和單例類

數據類,在創建后,會自動生成很多和數據相關的函數,比如計算hash值的hashcode,比如判斷是否相等,例如:

data class CellPhone(var brand:String,var price:Double)
fun TestBase()
{
  var test1 = CellPhone("test1",1.11)
  var test2 = CellPhone("test2",2.22)
  println("CellPhone1 等於 CellPhone2 是真的嗎?" + (test1 == test2))
}

單例類:單例類只能創建一個對象,借此來避免創建多個對象。

在別的C++/JAVA等語言或許會比較麻煩,但是Kotlin非常的遍歷,只需要在創建類前添加關鍵字object就好了,例:

object SingClassTest()
{
fun Test()
{
println("test")
}
}

2.5 Lambda編程

Lambda的定義是:一小段可以作為參數傳遞的代碼。(類似與C里面的宏定義)

//語法結構
{參數名1:參數類型,參數名2:參數類型 -> 函數體}
//函數體可以寫任意多少行代碼
//最后一行代碼會作為返回值

 

2.5.1 集合的創建與使用

類似於C++的STL一樣,就好比是Kotlin內置的一些類。類似於C++的STL一樣,就好比是Kotlin內置的一些類。

//在java中
val list = ArrayList<String>()
list.add("test")

//c++
vector<int> a;
a.push_bak(1);

//Kotlin提供內置的listOf()函數來初始化集合
val list = listOf("test1","test2")
//for-in語句不僅僅可以用在循環,還可以用在集合這里。

但是需要注意的是listOf創建的集合是不可變的,只能讀取,不能修改刪除,添加等操作。

創建可變的集合:使用mutableListOf()函數來創建就好了。就可以使用add()等等操作了。

fun TestLamba()
{
  val list = mutableListOf("Apple","Banana","Potato")
  list.add("hehe")
  for(i in list)
  {
      println(i)
  }
}

前面寫的是list列表集合,set無序集合和list列表集合使用辦法一樣。

還有Map鍵值對集合,Map是一種數據結構的內容。

//使用辦法
  val map = HashMap<String,Int>()
  map.put("apple",1)
  map.put("banana",2)
  map.put("orange",3)
//可以用put()和get()方法來添加和獲取
//還可以直接使用類似於數組下標操作來處理
var test = map["apple"]
map["apple"] = 1000

同樣map也有初始化函數mapOf()和mutableMapOf()來簡化map的初始化。

2.5.2 集合的函數API

相當於各種內置的Lambda的類里面有公用的API函數來使用,和STL是一樣一樣的。

例如:

//在一個水果集合里面找到單詞最長的那個
var list = listOf("apple","banana","pear","Watermelon")
val maxLengthFruit = list.maxBy{it.length}
//這個一個由lambda表達式簡化過來的版本
//接下來由繁入簡來講述這個API

看最原始的版本:

var list = listOf("apple","banana","pear","Watermelon")
val lambda = {fruit:String -> fruit.length}
val maxLengthFruit = list.maxBy({lambda})
//maxBy這個函數根據傳入的參數來確定遍歷集合的方式

優化1:不需要單獨的lambda變量

var list = listOf("apple","banana","pear","Watermelon")
val maxLengthFruit = list.maxBy{fruit:String -> fruit.length}

優化2:在Kotlin中,當Lambda參數是函數的最后一個參數時,可以把lambda表達式單獨用{}獨立出來:

var list = listOf("apple","banana","pear","Watermelon")
val maxLengthFruit = list.maxBy(){fruit:String -> fruit.length}

優化3:如果Lambda參數是函數的唯一一個參數,還可以將函數外的括號省略

var list = listOf("apple","banana","pear","Watermelon")
val maxLengthFruit = list.maxBy{fruit:String -> fruit.length}

優化4:當lambda表達式的參數列表只有一個參數時,也不必聲明參數,可以直接用it關鍵字代替(也就是代替它傳進來的)

var list = listOf("apple","banana","pear","Watermelon")
val maxLengthFruit = list.maxBy{it.length}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM