【
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: Intget() = this + 1
//泛型属性扩展:数字类型的半径对应的面积:20.3.area, 面积πr2val <T : Number> T.area : Doubleget() = 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(): Twhere 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}
}
】