Kotlin一步一个脚印学习基础三

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 < : 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  : Number ,
: Comparable< T> {
var biggest =   this[ 0]
for (i   in  1.. lastIndex) {
val element =   this[i]
if (element > biggest) {
biggest = element
}
}
return biggest
}
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值