Kotlin基础第4章—类型同步

一丶类型接口

  • 类的定义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文件
在这里插入图片描述
效果图:
在这里插入图片描述
在这里插入图片描述

六丶本章小结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王睿丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值