Kotlin基础第4章—类型同步

一丶类型接口

package com.wangrui.kotlin.chapter01



  /*类的定义*/
class SimpleClass{
    var x:Int = 0     //必须初始化
    fun y(){

    }
}


class SimpleClass{
    var x:Int
    //构造方法
    constructor(x:Int){
        this.x = x
    }
}
//等价于
class SimpleClass
    constructor(x:Int){
    var x:Int = x
}

//等价于
class SimpleClass(x:Int){
    var x:Int = x
}
//等价于 
class SimpleClass(var x:Int){
}


/*  接口的实现   */
class SimpleClass(var x:Int) :SimpleInf{
    //  override关键字强制   等价于 Java中的 @Override
    override fun SimpleMethod() {
    }
}


/*  抽象类的定义  */
abstract class AbsClass{
    abstract fun absMethod()
    open fun overridable(){}    //默认不可覆写
    fun nonOverridable(){}      //默认不可覆写
}


/*  类的继承    */
class SimpleClass(var x: Int)
    :AbsClass(),SimpleInf{
    override fun SimpleMethod() {

    }

    override fun absMethod() {

    }
}


/* 接口的定义 */
interface SimpleInf{
    fun SimpleMethod()
}

fun main(){

//    类的实例化
    val simpleClass = SimpleClass(9)
    println(simpleClass.x)

    /*  属性引用    */
    val ageRef = Person::age    //  未绑定 Receiver
    val person = Person(18,"Bennyhuo")
    val nameRef = person::name  //  绑定 Receiver
    ageRef.set(person,20)
    nameRef.set("Andyhuo")
    println(ageRef.get(person))
    println(nameRef.get())

}

/*  get()、set()方法  */
class Person(age: Int, name: String){
    var age: Int = age  //property - 属性
        get() {
            return field    //相当于 age
        }
        set(value) {
            println("setAge:$value")
            field = value
        }
    var name: String = name
        get() {
            return field // backing field   支持领域
        }
        set(value) {

        }
}

在这里插入图片描述

二丶扩展方法

文件一.kt

package com.wangrui.kotlin.chapter02

fun main(){

    //利用扩展方法检测邮箱格式是否正确
    "[email protected]".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文件
在这里插入图片描述
效果图:
在这里插入图片描述
在这里插入图片描述

六丶本章小结

在这里插入图片描述

扫描二维码关注公众号,回复: 11323585 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_27494201/article/details/106433873