Kotlin一步一個腳印學習基礎三

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/JourneyX/article/details/78058194
26、數據類
{
/**
* 數據類:專用於只"保存"數據的類,比如用戶自動登錄信息,聊天記錄等
* 這裏的保存,並不是指保存到磁盤,而是指轉換成文本格式,便於保存.
* Kotlin數據類:data class 類名(屬性列表)
*/
data class Article(var id: Int, var title: String, var content: String)

fun main(args: Array<String>) {
val article = Article(1001, "基於Kotlin安卓開發","Kotlin內容介紹")

//數據類的序列化:其實就是將實例轉化成文本形式
println(article.toString())

//複製 copy:生成一個對象的克隆,並更改部分屬性
val articlenewTitle = article.copy(title = "快來學習Kotlin安卓開發")
println(articlenewTitle.toString())

//數據類對象的解構
val (id, title) = article
println("$id,$title")

//componentN列舉屬性
println("componentN:${article.component2()},${article.component3()}")
}
}

27、枚舉類
{
/**
* 枚舉類:有限個類型的枚舉.
* 其中的每一個稱爲枚舉常量(可帶初始值),每一個以逗號分隔
*/
//撲克牌花色
enum class PokerCard {
紅心, 方片, 梅花, 黑桃
}

//衣服尺碼:帶構造器的枚舉
enum class Size(val height: Int) {
S(150), M(160), L(170), XL(180), XXL(190)
}

fun main(args: Array<String>) {
//列舉枚舉類的常量
println(PokerCard.values().joinToString())
//枚舉常量 名稱和序號,name,ordinal
println(Size.valueOf("XXL").name)
println(Size.valueOf("XXL").ordinal)//位置

println(Size.values().joinToString { it.name + ":" + it.height })
}
}

28、對象聲明和表達式
{
/**
* 有時候只是要對某個類進行輕微改造,供臨時使用,避免繼承
* 對象聲明和表達式就很有用.
* 對面向對象編程的優化,避免一些繼承導致的代價過高.
*/
//對於中國人來說,這個類,可能各省人適合繼承
open class Chinese28(var name: String) {
open val skin = "yellow"
}

fun main(args: Array<String>) {
//但如果外國人入籍,就不適合用"繼承"
//對象表達式:val 對象名 = object : 類,接口{//屬性或方法的override定義}
val baako = object : Chinese28("Baako Zaid") {
override val skin = "black"
}
println("膚色:${baako.skin}")

//純對象表達式:臨時使用,無須繼承任何類
val tempParking = object {
var x = 100
var y = 200
}
println("停車的位置:(${tempParking.x},${tempParking.y})")

//對象聲明的調用,相當於調用函數
NetWorkRequestManager.register()

//伴生對象的方法,與類關聯性強。伴生對象的使用
IDCard.create()
}

//對象聲明,不能用在函數中
//一般用於對其他類的一種使用上的包裝,不需要實例化直接使用
object NetWorkRequestManager{
fun register(){
println("連接網絡註冊中...")
}
}

//伴生對象,一般用於創建一個類的實例的"工廠"方法
//相當於Java中的,靜態成員
class IDCard{
companion object {
fun create() = IDCard()
}
}
}

29、異常錯誤處理
{
/**
* 異常錯誤處理
* 對可能發生執行異常的代碼的一種保護措施
* 默認異常類:Exception
*/
fun main(args: Array<String>) {
//直接展示錯誤
try {
"333ggg".toInt()
} catch (e: Exception) {
println(e)
}
//忽略錯誤
val a: Int? = try {
"3gg".toInt()
} catch (e: Exception) {
null
}
println(a)
}
}

30、類型檢查和轉換
{
/**
* 檢查:對一個變量的類型進行辨別.
* 轉換:把變量轉換成其他類型使用.
*/
fun main(args: Array<String>) {
val a = 5
val b = 6
val c = if (a > b) "大於" else a - b

//類型判斷:is
if(c is String){
println(c.length)
}

if(c !is String){
println("整數:$c")
}

//Kotlin編譯器大多數時候會智能轉換
if(c is Int){
println(c.inc())
}

//手動轉換:強制轉換as,安全轉換 as?
val d = c as Int
println("d是c強制轉換後的c,值是$d")

//安全轉換失敗後返回可空類型的null
val e = c as? String
println(e)
}
}

31、爲何使用Interface-接口
{
/**
* 接口:interface:接口是方法、屬性或一段功能的"藍本"
* 僅僅是規定實現的標準(抽象的)
*
* 通常用於對類進行附加功能,可以讓類本身保持簡潔的定義
* 通過實現1個或N個接口的組合,來實現非繼承式的功能增強。
*
* 生物界的啓示1:動物通常大量生長皮毛或者完全光溜溜,但是人基本上是裸替狀態。
* 人類通過進化,把皮毛功能剝離,從而實現了着裝的自由,與動物極大的區分開。
* 着裝讓人類可以在任何氣候下保持適宜的體溫,而不需要靠遺傳來維持體溫。
*
* 啓示2:猛獸有尖牙厲爪,可以在捕食大型動物佔據優勢。但是人類基本沒有。
* 人類通過發明類似尖牙厲爪的工具,同時可以輕鬆捕獲大型動物。
* 人的後代不僅不需要尖牙厲爪就可以得到大象肉,牛肉,鯨魚肉。
*而且人類如此弱體力或弱攻擊的物種,居然成了幾乎所有動物的噩夢。
*
* 這些啓示都在明示,繼承獲得的功能通常是不得已而爲之,且進化緩慢,代價高昂。
* 而且在此基礎上通過組合各種功能,可以獲得強大的能力同時可以輕裝上陣。
*/
}

32、接口中的屬性
{
/**
* 接口中的屬性
*
* 接口定義:interface 接口名{ //各種屬性或方法定義 }
*/
//很多外國人入籍
interface Livable{
var hasSkill : Boolean
}

interface ChinaLivable{
//接口中的屬性只有類型定義,不可初始化。
val hasJobOffer : Boolean

//接口中的屬性可以有get,通常用於單純增加一個常量屬性:組合屬性
val visaCategory : String
get() = "工作簽證"

//接口中的變量屬性
var city : String
}
}

33、接口中的方法
{
/**
* 接口中的方法
*/
interface ChinaLivableA{
//接口中的方法
fun speakChinese()
//接口中的方法可以有默認實現,通常指該方法是固定不變的。
fun handleGuanxi(){
println("我知道在中國要非常注重處理人際關係。")
}
}

open class Person{
var name = ""
}
}

34、接口的實現和組合
{
interface LivableB{
val hasSkill : Boolean
}

interface ChinaLivableB{

//接口中的屬性只有類型定義,不可初始化。
val hasJobOffer : Boolean

//接口中的屬性可以有get,通常用於單純增加一個常量屬性:組合屬性
val visaCategory : String
get() = "工作簽證"

//接口中的變量屬性
var city : String

//接口中的方法
fun speakChinese()

//接口中的方法可以有默認實現,通常指該方法是固定不變的。
fun handleGuanxi(){
println("我知道在中國要非常注重處理人際關係。")
}

var bankDeposite : Int

}

open class PersonB{
var name = ""
}

//繼承父類,並實現多個接口
class ForigenChinese : PersonB(),LivableB,ChinaLivableB {
override val hasJobOffer: Boolean
get() = true
override var city = ""

override fun speakChinese() {
println("我叫${this.name},我有HSK一級證書,日常工作生活用中文無障礙。")
}

override val hasSkill: Boolean
get() = true

override var bankDeposite = 100000
}

fun main(args: Array<String>) {
val tom = ForigenChinese()
tom.name = "湯格林"
tom.city = "上海"

tom.speakChinese()
tom.handleGuanxi()

println(tom.visaCategory)
println(tom.hasSkill)
}
}

35、泛型
{
/**
* 泛型 Generics
* 讓一個類型能被"廣泛"使用,即通用化,稱爲"泛型"
* 一般用於函數的參數類型定義,讓函數更通用
*/
fun main(args: Array<String>) {
//常用的例子,print和println函數,幾乎可放任何類型的參數
println(2)
println("泛型")
println(arrayOf("Swift","Kotlin","ios","Android"))

//Array,參數也可以是任意類型
val a = arrayOf(1,2,3)

//自定義一個泛型函數:<T>,Type的首字母縮寫,T代表一個佔位符,用尖括號包含
fun <T>showText(pare: T){
println(pare)
}

showText(3)
showText("我也是泛型函數")
}
}

36、泛型約束
{
/**
* 泛型約束
*/
fun main(args: Array<String>) {

//有時候系統提供的泛型函數很好
//求和
val sum = arrayOf(1, 3, 99, -2, 10245).sum()
println("求和爲:${sum}")

// val sum2 = arrayOf(1, 3, 99, -2, 10245,99.24).sum()

//泛型約束:<泛型佔位符:類型>
fun <T:Number> sum(vararg numbers : T): Double {
return numbers.sumByDouble { it.toDouble() }
}
println(sum(1, 3, 99, -2, 10245,99.24))

//多重約束:where,各個約束用逗號分隔,寫在函數體之前
//例子:把數組中大於某個元素(閾值)的部分取出來並升序排列。
// (99,1,2,-389,88,1024,8888)> (88,99,1024,8888)
fun <T> biggerPart(list: Array<T>, threhold: T): List<T>
where T:Number , T:Comparable<T>
{
return list.filter { it >= threhold }.sorted()
}
val b = arrayOf(1,0,55,99,3,-3824,666)
println(biggerPart(b,3))

}
}

37、擴展
{
/**
* 擴展:對既有的類增加新功能而無需繼承該類,即時無法獲取其源代碼。
* 主要作用是"立即"爲相關的類整體上添加"工具類(Utils)"方法或屬性,高效優雅。
*
* Kotlin支持:擴展函數,擴展屬性。 擴展協議(可能將來版本會支持,Swift中已經實現)
* 與接收者類中參數、名稱都一樣的擴展是無效的。
* 儘量避免與已有的名字重名,如果一定要重名,參數名和類型也要補一樣。
*
*/

//擴展函數:fun 接受者類型.新擴展函數名(參數類別){ //函數實現 }
//1、普通函數拓展:整數的平方
fun Int.square(): Int {
return this * this
}

//泛型屬性拓展
//1、普通屬性擴展。 例子:整數的下一個數字
val Int.next: Int
get() = this + 1

//泛型屬性擴展:數字類型的半徑對應的面積:20.3.area, 面積πr2
val <T : Number> T.area : Double
get() = 3.141592 * this.toDouble() * this.toDouble()

fun main(args: Array<String>) {
println((-12).square())

val a = arrayOf(1, 2, 3, 99, -8734)
println("系統方法${a.max()}") //系統方法
println("泛型函數拓展方法${a.biggest()}") //泛型函數拓展

println("普通屬性拓展測試:${3.next}")

println("求圓的面積:${20.33.area}")
}

//2、泛型函數拓展:取數字型數組中最大的元素
fun <T> Array<T>.biggest(): T
where T : Number,
T : Comparable<T> {
var biggest = this[0]
for (i in 1..lastIndex) {
val element = this[i]
if (element > biggest) {
biggest = element
}
}
return biggest
}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章