Day 4:Kotlin 程序设计基础入门 (3)

本篇文章同步发表在 HKT 线上教室 部落格,线上影音教学课程已上架至 UdemyYoutube 频道。另外,想追踪更多相关技术资讯,欢迎到 脸书粉丝专页 按赞追踪喔~

今天要跟大家介绍 Kotlin 语法的内容大纲:

  • 类别
  • 继承
  • 介面
  • 扩展
  • 泛型

类别

类别的定义

我们会将相关功能放在一个类别当中,就像生活中用的计算机一样。以这次为例,我们将加、减、乘、除四个数学计算的功能,放在一个计算机类别当中,当别人或是自己下次要使用,不用再重覆造轮子,只要呼叫这个类别,使用里面的方法即可。

定义一个 Calc 类别

类别里,加入四个方法,分别是加、减、乘、除。

class Calc {
    fun sum(x: Int, y: Int) {
        println(x + y)//加法运算
    }
    fun substract(x: Int, y: Int) {
        println(x - y)//减法运算
    }
    fun multiply(x: Int, y: Int) {
        println(x * y) //乘法运算
    }
    fun divide(x: Int, y: Int) {
        println(x / y)//除法运算
    }
}

使用类别的方式

我们会将类别实体化出来成为一个物件,透过这个物件来访问类别里面定义的属性与方法。

fun main() {
   //实体化
    val calc = Calc()
    
    calc.sum(1, 1) //2
    calc.substract(1, 1)//0
    calc.multiply(1, 1)//1
    calc.divide(1, 1)//1
}

输出结果

2
0
1
1

存取类别的属性

定义一个 Account 类别

在 Account 类别中分别加入帐号、户名和余额三个类别属性

class Account {
    //帐号
    var id: String = ""
    //户名
    var name: String = ""
    //余额
    var balance: String = ""
}

存取类别属性方式

fun main() {
    //实体化
    val account = Account()

    //设定类别属性值
    account.id = "123456789"
    account.name = "HKT"
    account.balance = "100"

    //获取类别属性值
    println(account.id)
    println(account.name)
    println(account.balance)
}

输出结果

123456789
HKT
100

修改 getter 与 setter 方法

若不想让使用类别者直接访问属性值或是在获取与设定属性值过程中想要加工资料,则可以透过 getter 与 setter 方法。

class Account {
    //户名
    var name: String = ""
        get() = field.toUpperCase()
        set(value) {
            if (value == "") {
                field = "户名不能为空"
            } else {
                field = value
            }
        }
}
fun main() {
    //实体化
    val account = Account()

    account.name = "HKT"
    println(account.name)

    account.name = ""
    println(account.name)
}

输出结果

HKT
户名不能为空

类别初始化

类别被实体化出来时,中间过程会先经过 init 然後 constructor ,可以将想要初始化的逻辑程序放在这里面。

class Account {
    //户名
    var name: String = ""

    init {
        println("初始化,第一层")
    }

    constructor() {
        println("初始化,第二层")
    }
}
fun main() {
    //实体化
    val account = Account()

    account.name = "HKT"
    println(account.name)}
}

输出结果

初始化,第一层
初始化,第二层
HKT

继承

父类别需加入 open 关键修饰词,才能让其他子类别继承,否成编译会报错误。

定义一个父类别 Person

open class Person {
    //户名
    var name: String = ""
    //地址
    var address: String = ""
}

定义一个子类别 Account 并且去继承 Person 父类别

class Account : Person() {
    //帐号
    var id: String = ""
}

继承使用范例

fun main() {
    //实体化
    val account = Account()

    account.id = "123456789"
    account.name = “HKT"
    account.address = "台北市信义区信义路五段7号"

    println(account.id)
    println(account.name)
    println(account.address)
}

输出结果

123456789
HKT
台北市信义区信义路五段7号

继承後覆写属性

父类别中的属性,若允许子类别继承後可以覆写属性,须在前方加入 open 关键修饰词,否则编译时会报错误。反过来,若不提供子类别覆写,则不需要加入open 修饰词。

open class Person {
    //户名
    open var name: String = ""
}

在子类别中加入 override 关键修饰词,即可以修饰父类别中的属性

class Account : Person() {
    //覆写户名
    override var name: String = ""
}

继承後覆写属性方式

fun main() {
    //实体化
    val account = Account()

    account.name = "HKT"

    println(account.name)
}

输出结果

HKT

继承後覆写函数

父类别中的方法,若允许子类别继承後可以覆写方法,须在前方加入 open 关键修饰词,否则编译时会报错误。反过来,若不提供子类别覆写,则不需要加入open 修饰词。

open class Person {
    open fun showName() {
        println("HKT")
    }
}

在子类别中加入 override 关键修饰词,即可以修饰父类别中的方法

class Account : Person() {
    override fun showName() {
        println("Kitty")
    }
}

继承後覆写范例

fun main() {
    //实体化
    val account = Account()

    account.showName()
}

输出结果

Kitty

介面

定义一个的介面

可以透过介面的方式,来约定若要实作这个介面,需履约实作哪些方法。

interface PersonInterface {
    fun showName()
}

实作 Interface 要求的 showName

若我们使用 PersonInterface 介面,但没履约实作里面的方法,编译会喷错误。

class Account : PersonInterface {
    override fun showName() {
        println("name: HKT")
    }
}

实际使用介面方式

fun main() {
    //实体化
    val account = Account()

    account.showName()
}

输出结果

name: HKT

扩展

定义一个 Account 类别

class Account {
    var id: String = ""
}

扩展 Account ,加入新功能

fun Account.Print() {
    println("帐号: " + id)
}

实际使用扩展方式

fun main() {
    //实体化
    val account = Account()
    account.id = "123456789"
    account.Print()
}

输出结果

帐号: 123456789

泛型

可以把「泛型」想像成是神奇宝贝当中的百变怪。当我们想要处理不论是类别或是方法的参数,想要处理各种传进来的资料类型,我们就可以使用泛型。

泛型关键字: T

class Box<T>(t: T) {
    var value = t
}

泛型使用范例

fun main() {
    val box_int = Box(1)
    println(box_int.value)

    val box_string = Box("我是字串")
    println(box_string.value)
}

输出结果

1
我是字串

参考资料

HKT 线上教室
https://tw-hkt.blogspot.com/

Freepik
https://www.freepik.com/

Kotlin docs
https://kotlinlang.org/docs/home.html


那今天【iThome 铁人赛】就介绍到这边罗~

顺带一提,KT 线上教室,脸书粉丝团,会不定期发布相关资讯,不想错过最新资讯,不要忘记来按赞,追踪喔!也欢迎大家将这篇文章分享给更多人喔。

我们明天再见罗!!!掰掰~


<<:  看看是否还能进行更新

>>:  Day 04 Azure Web App- 方便部署服务

好用的线上IDE分享

在开发程序时,有时候想要测试一点小功能,确认说这个功能可不可以使用,如果说每次都要为了测试这点功能就...

[Day18] 团队管理:OKR & OGSM

OKR 目标影响我们的可能性与看事情的视角 OKR,目标与关键成果(Objective and Ke...

【Day 12】- 找出看不见也摸不着的 Process,终极办法!

Agenda 资安宣言 测试环境与工具 前情提要 技术原理 下期预告 资安宣言 撰写本系列文章目的在...

Day06 永丰金API 基础流程 -- 讯息内文

还是一样先上图 终於来到第六点了!!!可喜可贺 看一下文件中产生Message的方法 5.5.2. ...

Day 11 - Rancher 丛集管理指南 - Monitoring 介绍

本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...