文章目录

  • 一丶类型接口
  • 二丶扩展方法
  • 三丶空类型安全
  • 四丶智能类型转换
  • 五丶案例:使用Retrofit 发送网络请求
  • 六丶本章小结

一丶类型接口

  • 类的定义1
  • 类的定义2
  • 类的定义3,写法一
  • 类的定义3,写法二
  • 类的定义3,写法三
  • 类的定义3,写法四
  • 类的实例化
  • 接口的定义
  • 接口的实现
  • 抽象类定义
  • 类的继承
  • 属性代理【Java】
  • 属性代理【Kotlin】
  • 属性引用

类的定义1

类的定义2

类的定义3,写法一

类的定义3,写法二

类的定义3,写法三

类的定义3,写法四

类的实例化

接口的定义

接口的实现

抽象类定义

类的继承

属性代理【Java】

属性代理【Kotlin】

属性引用

AbsClass

abstract class AbsClass {abstract fun absMethod()open fun overridable(){}fun nonOverridable(){}
}

SimpleInf

package com.bennyhuo.kotlin.types.classes.kotlininterface SimpleInf {val simpleProperty: Int // propertyfun simpleMethod()
}

SimpleClass

package com.bennyhuo.kotlin.types.classes.kotlinopen class SimpleClass(var x: Int, val y: String): AbsClass(), SimpleInf {override val simpleProperty: Intget() {return 2}val z : Longget() {return simpleProperty * 2L}override fun absMethod() {}override fun simpleMethod() {}fun y(){}fun zzz(string: String){}final override fun overridable(){}
}class SimpleClass2(x: Int, y: String): SimpleClass(x, y){}

Person

package com.bennyhuo.kotlin.types.classes.kotlinclass Person(age: Int, name: String) {var age: Int = age //propertyget() {return field}set(value) {println("setAge: $value")field = value}var name: String = nameget() {return field // backing field}set(value) {}
}fun main() {val ageRef = Person::ageval person = Person(18, "Bennyhuo")val nameRef = person::nameageRef.set(person, 20)nameRef.set("Andyhuo")
}

二丶扩展方法

文件一.kt

package com.wangrui.kotlin.chapter02fun main(){//利用扩展方法检测邮箱格式是否正确"admin@bennyhuo.com".isEmpty()//扩展方法举例1//结果:----------Hello----------println("Hello".padding(10,'-'))//扩展方法举例2//结果:**********println( "*".times(10))}/*扩展方法*/
//  String  ——  receiver
fun String.isEmail():Boolean{...
}/*扩展方法举例1*/
fun String.padding(count:Int,char:Char = ' '):String{val padding = (1..count).joinToString(""){char.toString()}//${this}   ——  Stringreturn "${padding}${this}${padding}"
}/*扩展方法举例2*/
fun String.times(count: Int):String{return (1..count).joinToString(""){this+"哈"}
}

文件二.kt

package com.wangrui.kotlin.chapter02/*定义类*/
class PoorGuy{var pocket:Double = 0.0
}/*扩展方法*/
fun PoorGuy.noMoney(){}/*扩展属性*/
//property = backing field + getter + setter
var PoorGuy.moneyLeft: Doubleget() {return this.pocket}set(value) {pocket = value}//1、Kotlin里接口不能定义状态
//2、Kotlin里接口只能定义行为
interface Guy{var moneyLeft: Doubleget() {return 0.0}set(value) {}//只能定义默认行为,想set()或者get()是不行的fun noMoney(){println("no money called.")}
}/*扩展方法的类型*/
fun String.times(count: Int): String{}String::times   (String,Int)->String
"*"::times      (Int)->String

三丶空类型安全

package com.wangrui.kotlin.chapter03import org.jetbrains.annotations.NotNullfun main(){//'?'表示该类型可空,所以能接收空值var nullable: String? = "Hello"//这时直接写:会报错val length = nullable.length//方法一:当 nullable 一定不为空时,'!!'表示将可空类型转换为不可空类型 【不推荐】// '!!'强制转换运算符val length = nullable!!.length/*方法二:当 nullable 不知道是否为空时,'?.'表示安全访问这个值。    【推荐】其次如果这个值为空,就回返回0给他,因为受到'?:'符号的影响,和Java里的三目有点相似但不是记住喔*/// '?.'安全访问运算符// '?:' elvis运算符 类似 boolean?a :bval length = nullable?.length?:0*//*空类型的继承关系*///得出结论//1、String?是String的父类(基类)//2、Number是Int的父类(基类)//引出经典理论//里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现var x:String = "Hello"var y:String? = "World"x = y  //Type mismatch  类型不匹配 ×y = x  //OK √var a:Int = 2var b:Number = 10.0a = b //Type mismatch  类型不匹配 ×b = a //OK  √/*平台类型*/假设Java代码如下:public class Person{@NotNull    //利用注解 加上将 return null变成return "null"方式防止空指针异常public String getTitle(){return "null";}}val person = Person()val title: String = person.titleval titleLength = tiele?.length //利用安全运算符防止空指针异常String! 表示平台类型不知道是否为可空类型}

四丶智能类型转换

package com.wangrui.kotlin.chapter04fun main(){/*Kotlin 的类型转换*/val kotliner: Kotliner = Person("benny",20)if (kotliner is Person){//as 转换类型为 Personprintln((kotliner as Person).name)}/*智能类型转换*///注意:当变量为全局变量时,此时不支持智能类型转换val kotliner: Kotliner = Person("benny",20)if (kotliner is Person){println(kotliner.name)}/*智能类型转换作用范围*/var value:String? = nullvalue = "benny"if (value != null){ //这时value 就变成了 String类型println(value.length)   //如果出了这个{}的区域 value的类型又变回了 String?类型}/*类型的安全转换*/val kotliner: Kotliner = Person("benny",20)if (kotliner is Person){//安全转换,失败返回nullprintln((kotliner as? Person)?.name)}//建议//1、尽可能使用 val 来声明不可变引用,让程序的含义更加清晰确定//2、尽可能减少函数对外部变量的访问,也为函数式编程提供基础//3、必要时创建局部变量指向外部变量,避免因它变化引起程序错误}

五丶案例:使用Retrofit 发送网络请求

package com.wangrui.kotlin.chapter05import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Path
import java.io.Fileinterface GitHubApi {@GET("/repos/{owner}/{repo}")fun getRepository(@Path("owner") owner: String, @Path("repo") repo: String): Call<Repository>
}fun main() {//拿到API接口实例val gitHubApi = Retrofit.Builder().baseUrl("https://api.github.com").addConverterFactory(GsonConverterFactory.create()).build().create(GitHubApi::class.java)//拿到响应头val response = gitHubApi.getRepository("JetBrains", "Kotlin").execute()//获取资料库val repository = response.body()//判断是否为空if(repository == null){println("Error! ${response.code()} - ${response.message()}")} else {println(repository.name)println(repository.owner.login)println(repository.stargazers_count)println(repository.forks_count)println(repository.html_url)File("Kotlin.html").writeText("""<!DOCTYPE html><html><head><meta charset="UTF-8"><title>${repository.owner.login} - ${repository.name}</title></head><body><h1><a href='${repository.html_url}'>${repository.owner.login} - ${repository.name}</a></h1><p>${repository.description}</p><p>Stars: ${repository.stargazers_count}</p><p>Forks: ${repository.forks_count}</p></body></html>""".trimIndent())}
}

Repository(Data数据类)

package com.wangrui.kotlin.chapter05/*** Created by wangrui on 2020-05-29*/
data class Repository(var id: Int,var node_id: String,var name: String,var full_name: String,var private: Boolean,var owner: Owner,var html_url: String,var description: String,var fork: Boolean,var url: String,var forks_url: String,var keys_url: String,var collaborators_url: String,var teams_url: String,var hooks_url: String,var issue_events_url: String,var events_url: String,var assignees_url: String,var branches_url: String,var tags_url: String,var blobs_url: String,var git_tags_url: String,var git_refs_url: String,var trees_url: String,var statuses_url: String,var languages_url: String,var stargazers_url: String,var contributors_url: String,var subscribers_url: String,var subscription_url: String,var commits_url: String,var git_commits_url: String,var comments_url: String,var issue_comment_url: String,var contents_url: String,var compare_url: String,var merges_url: String,var archive_url: String,var downloads_url: String,var issues_url: String,var pulls_url: String,var milestones_url: String,var notifications_url: String,var labels_url: String,var releases_url: String,var deployments_url: String,var created_at: String,var updated_at: String,var pushed_at: String,var git_url: String,var ssh_url: String,var clone_url: String,var svn_url: String,var homepage: String,var size: Int,var stargazers_count: Int,var watchers_count: Int,var language: String,var has_issues: Boolean,var has_projects: Boolean,var has_downloads: Boolean,var has_wiki: Boolean,var has_pages: Boolean,var forks_count: Int,var mirror_url: Any,var archived: Boolean,var disabled: Boolean,var open_issues_count: Int,var license: Any,var forks: Int,var open_issues: Int,var watchers: Int,var default_branch: String,var temp_clone_token: Any,var organization: Organization,var network_count: Int,var subscribers_count: Int
) {data class Owner(var login: String,var id: Int,var node_id: String,var avatar_url: String,var gravatar_id: String,var url: String,var html_url: String,var followers_url: String,var following_url: String,var gists_url: String,var starred_url: String,var subscriptions_url: String,var organizations_url: String,var repos_url: String,var events_url: String,var received_events_url: String,var type: String,var site_admin: Boolean)data class Organization(var login: String,var id: Int,var node_id: String,var avatar_url: String,var gravatar_id: String,var url: String,var html_url: String,var followers_url: String,var following_url: String,var gists_url: String,var starred_url: String,var subscriptions_url: String,var organizations_url: String,var repos_url: String,var events_url: String,var received_events_url: String,var type: String,var site_admin: Boolean)
}

运行Kotlin程序生成HTML文件

效果图:

六丶本章小结

Kotlin基础第4章—类型同步相关推荐

  1. 【Kotlin基础系列】第4章 类型

    1 基本类型 在 Kotlin 中,所有东西都是对象,在这个意义上讲我们可以在任何变量上调用成员函数与属性. 一些类型可以有特殊的内部表示--例如,数字.字符以及布尔可以在运行时表示为原生类型值,但是 ...

  2. 第一章 kotlin基础知识

    第一章 kotlin基础知识 文章目录 第一章 kotlin基础知识 前言 一.kotlin是什么? 二.kotlin基础知识 1.变量的声明 2.函数定义的几种方式 3.字符串与数字的转换 4.数组 ...

  3. Kotlin第二章:kotlin基础

    1. 基础数据类型 1. 整数类型 序号 类型 位宽 最小值 最大值 1 Byte 8 -128 127 2 Short 16 -32768 32767 3 Int 32 -2,147,483,648 ...

  4. 【Kotlin基础系列】第1章 简介

    1.1 Kotlin简介 Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发.是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐. 它简洁.安全.可与 Java 及 ...

  5. Kotlin基础学习(1)

    Kotlin基础学习(1) 本文主要讲解kotlin的部分基础知识,并不是全部基础. 提示:纯属个人理解,如有理解错误,欢迎留言指正批评. 一.Null检查机制 kotlin对于声明可为空的参数,使用 ...

  6. Kotlin Bootcamp 自学(2):Kotlin基础

    Kotlin Bootcamp 自学(2):Kotlin基础 目录 Kotlin Bootcamp 自学(2):Kotlin基础 前言 运算符与数据类型 (Operators and Types) 数 ...

  7. Kotlin Jetpack 实战:01. Kotlin 基础

    背景 近几年,Android 相关的新技术层出不穷.往往这个技术还没学完,下一个新技术又出来了.很多人都是一脸黑人问号?不少开发者甚至开始哀嚎:"求求你们别再创造新技术了,我们学不动了!&q ...

  8. Kotlin Jetpack 实战: Kotlin 基础 | 开发者说·DTalk

    本文原作者: 朱涛,原文发布于: 朱涛的自习室 https://mp.weixin.qq.com/s/MSbSPeWNlM5PJCFmLg2SVQ 背景 近几年,Android 相关的新技术层出不穷. ...

  9. 中职计算机应用基础每章知识点,[定稿]中职计算机应用基础教案_1-5章V3.1

    <[定稿]中职计算机应用基础教案_1-5章.doc>由会员分享,可免费在线阅读全文,更多与<[定稿]中职计算机应用基础教案_1-5章(V3.1)>相关文档资源请在帮帮文库(ww ...

最新文章

  1. python适合做后端开发吗-Python真的不适合做后端开发语言吗?
  2. Java Vector
  3. 高并发场景下的httpClient优化使用
  4. python opencv-4.1.0 cv2.getTextSize()函数 (计算文本字符串的宽度和高度)
  5. Eclipse 4.4.2 取消空格键代码上屏
  6. kafka消费者和生产者为内/外网映射情况的配置
  7. SAP Spartacus lazy load module 里包含了被其他 Component 静态引用的组件该怎么办
  8. Vue基础之事件处理器
  9. 当 Mars 遇上 RAPIDS:用 GPU 以并行的方式加速数据科学
  10. Python reduce 函数 - Python零基础入门教程
  11. 小tip: 使用CSS将图片转换成黑白(灰色、置灰)[转]
  12. 基于SpringBoot大学生数码租赁网站答辩PPT模板
  13. 小明放学201812-2
  14. xposed框架_免ROOT 用“太极”替代Xposed框架
  15. 创建第一个Android app项目
  16. PCB设计流程一原理图
  17. Excel·VBA按列拆分工作表、工作簿
  18. 无线路由器不能产生信号
  19. error: cannot lock ref 'refs/remotes/origin/test/pressure-test': 'refs/remotes/origin/test' exists;
  20. PAT甲级-1021 Deepest Root(25分)

热门文章

  1. 【数理逻辑】谓词逻辑 ( 一阶谓词逻辑公式 | 示例 )
  2. 达梦数据库安装全流程
  3. coppeliasim(vrep)设置弹簧
  4. 通用的商城系统后台管理ui框架模板
  5. Typora 保姆级安装教程
  6. dlib疲劳检测_传统方法眼角定位和dilb 进行疲劳检测(眨眼检测)
  7. 推荐常用的排序学习算法——BPR(贝叶斯个性化排序)
  8. python 统计组合用什么库_盘点2018年热门Python库|TOP20
  9. 阿里云 oss 同区域不同桶名的文件互传
  10. 使用自相关函数的纹理图像周期计算