一丶类型接口
- 类的定义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.kotlin
interface SimpleInf {
val simpleProperty: Int // property
fun simpleMethod()
}
SimpleClass
package com.bennyhuo.kotlin.types.classes.kotlin
open class SimpleClass(var x: Int, val y: String)
: AbsClass(), SimpleInf {
override val simpleProperty: Int
get() {
return 2
}
val z : Long
get() {
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.kotlin
class Person(age: Int, name: String) {
var age: Int = age //property
get() {
return field
}
set(value) {
println("setAge: $value")
field = value
}
var name: String = name
get() {
return field // backing field
}
set(value) {
}
}
fun main() {
val ageRef = Person::age
val person = Person(18, "Bennyhuo")
val nameRef = person::name
ageRef.set(person, 20)
nameRef.set("Andyhuo")
}
二丶扩展方法
文件一.kt
package com.wangrui.kotlin.chapter02
fun 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} —— String
return "${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: Double
get() {
return this.pocket
}
set(value) {
pocket = value
}
//1、Kotlin里接口不能定义状态
//2、Kotlin里接口只能定义行为
interface Guy{
var moneyLeft: Double
get() {
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.chapter03
import org.jetbrains.annotations.NotNull
fun main(){
//'?'表示该类型可空,所以能接收空值
var nullable: String? = "Hello"
//这时直接写:会报错
val length = nullable.length
//方法一:当 nullable 一定不为空时,'!!'表示将可空类型转换为不可空类型 【不推荐】
// '!!'强制转换运算符
val length = nullable!!.length
/*方法二:当 nullable 不知道是否为空时,'?.'表示安全访问这个值。 【推荐】
其次如果这个值为空,就回返回0给他,因为受到'?:'符号的影响,和Java里的三目有点相似但不是记住喔*/
// '?.'安全访问运算符
// '?:' elvis运算符 类似 boolean?a :b
val 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 = 2
var b:Number = 10.0
a = 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.title
val titleLength = tiele?.length //利用安全运算符防止空指针异常
String! 表示平台类型
不知道是否为可空类型
}
四丶智能类型转换
package com.wangrui.kotlin.chapter04
fun main(){
/*Kotlin 的类型转换*/
val kotliner: Kotliner = Person("benny",20)
if (kotliner is Person){
//as 转换类型为 Person
println((kotliner as Person).name)
}
/*智能类型转换*/
//注意:当变量为全局变量时,此时不支持智能类型转换
val kotliner: Kotliner = Person("benny",20)
if (kotliner is Person){
println(kotliner.name)
}
/*智能类型转换作用范围*/
var value:String? = null
value = "benny"
if (value != null){ //这时value 就变成了 String类型
println(value.length) //如果出了这个{}的区域 value的类型又变回了 String?类型
}
/*类型的安全转换*/
val kotliner: Kotliner = Person("benny",20)
if (kotliner is Person){
//安全转换,失败返回null
println((kotliner as? Person)?.name)
}
//建议
//1、尽可能使用 val 来声明不可变引用,让程序的含义更加清晰确定
//2、尽可能减少函数对外部变量的访问,也为函数式编程提供基础
//3、必要时创建局部变量指向外部变量,避免因它变化引起程序错误
}
五丶案例:使用Retrofit 发送网络请求
package com.wangrui.kotlin.chapter05
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Path
import java.io.File
interface 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文件
效果图: