Kotlin学习(二):类型初探

12 篇文章 0 订阅

系列文章路引 👀 https://blog.csdn.net/weixin_44235109/article/details/119680974

一、类与接口

1.类的定义

kotlin类的默认修饰符是public,如下java与kotlin声明的类是一致的。

//java
public class SimpleClass {
	public int x;
	public void y(){
	}
}
//kotlin
class SimpleClass{
	var x : Int = 0 //必须初始化
	fun y(){
	}
}

构造器分为主构造器和副构造器
主构造器即为 class SimpleClass(){} (类前面的括号) ,副构造器使用constructor修饰,默认调用主构造器,也可以继承调用其他的副构造器。如下所示:

class InitConstructorTest() {

    /*次构造方法*/
    constructor(name: String) : this() {
    }
    constructor(name: String, gender: Boolean) : this(name) {
        println("constructor")
    }
 }

kotlin 主构造器会自动生成对应的成员属性。如果是var则有对应的get set方法 如果是val 则有对应的get方法 和 java对比如下

//java
public class SimpleClass{
	public int x;
	public SimpleClass(int x){
		this.x = x;
	}
}
//kotlin
class SimpleClass(var x : Int){
}

类的实例化 , kotlin省去了new关键字

//java
SimpleClass cls = new SimpleClass(10);
Sytsem.out.println(cls.x);
cls.y();
//kotlin
val cls = SimpleClass(10)
println(cls.x)
cls.y()

2.接口抽象类相关

接口的定义,java与kotlin对比,如下所示:

//java
public interface SimpleInfo{
	void simpleMethod();
}
//kotlin
interface SimpleInfo(){
	fun simpleMethod()
}

接口的实现,java与kotlin对比,如下所示:

//java
public class SimpleClass implements SimpleInfo{
	@Override
	public void simpleMethod(){}
}
//kotlin
class SimpleClass(var x : Int) : SimpleInfo{
	override fun simpleMethod(){}
}

抽象类的定义,java与kotlin对比(kotlin的方法和正常的类默认不可以覆写,需要加上open关键字),如下所示:

//java
public abstract class AbsClass{
	public abstract void absMethod();
	protected void overrideMethod(){}
	public final void nonOverridable(){}
}
//kotlin 和上面java对应
abstract class AbsClass{
	abstract void absMethod()
	open protected void overrideMethod(){}
	void nonOverridable(){} //正常的方法默认不允许被覆写
}

抽象类的继承,java与kotlin对比,如下所示:

//java  实现继承以及实现接口
public class SimpleClass extends AbsClass implements SimpleInfo{
	....
}
//kotlin  实现继承以及实现接口   注意继承 需要调用对应的构造方法
clsss SimpleClass(var x : Int) : AbsClass() , SimpleInfo{
	....
}

3.属性的引用

kotlin属性的引用,分两种情况:
1、直接以类型引用,默认没有绑定receiver,调用属性需要传入receiver。
2、以对象引用,默认绑定receiver,不许哟啊传入receiver。

//直接以类名调用
val ageRef = Person :: age
val person = Rerson(10,"zxf")
ageRef.set(person,10) //调用需要传入receiver
//以对象调用
val person = Rerson(10,"zxf")
val ageRef = person :: age
ageRef.set(10)//调用不需要传入receiver

二、扩展方法

1.扩展方法的简单介绍

kotlin扩展方法:在正常的方法名字之前加上对应的类名,即可。如下例子所示:

//给String扩展方法
fun String.isEmail() : Boolean {
	...
}
//使用String,可直接调用该方法
val checkEmail = "zxf".isEmail()

2.扩展方法的简单举例

fun String.padding(count : Int , char : Char = ' ') : String{
	val padding = (1 .. count).jointToString(""){char.toString()}
	return "${padding}${this}${padding}"
}

println("zxf".padding(10))

//结果
"          zxf          "

3.扩展方法的类型

fun String.times(count : Int) : Boolean{....}

//未绑定receiver
String :: times      (String,Int) -> Boolean  或者   String.(Int) -> Boolean
//绑定receiver
"**" :: times        (Int) -> Boolean

三、空类型安全

1.空类型安全概念

kotlin分为可null类型,以及不可null类型,如下所示:

var nonNull : String = "zxf"  //直接写为不可null 类型
nunNull = null //直接这么写,编译不通过 报错 不可null类型不可复制为null

var nullable : String? = "zxf" //增加? 为可null类型
nullable = null  //可赋值为null

2. !!. ?. ?: 的使用与区别

!!. 强转为不可null类型 如果出现null 则出抛异常

var nullable : String? = "zxf"
//强制转换为 不可null  类型  然后调用length  此时 变量length的类型为 Int
val length = nullable!!.length  

?. 如果不为null 则走?.

var nullable : String? = "zxf"
//相当于if判断 如果不为null  则回去length   此时 变量length的类型为 Int?
val length = nullable?.length  

?: 判断前方如果为null,则走?:

var nullable : String? = "zxf"
//相当于if判断 如果不为null  则回去length  如果为null 则返回0  此时 变量length的类型为 Int
val length = nullable?.length?:0  

3. 空类型的继承关系

好像找不到可null类型与不可null类型之间的继承关系,但是不可null类型可以赋值给可null类型,反过来却不行,所有从某种程度来说,不可null类型继承自可null类型。

var x : String = "hello"
var y : String? = "world"
x = y // 编译器报错 Type mismatch
y = x // 正常赋值成功

4. 除了可null与不可null类型之外,kotlin还有平台类型 !

平台类型:比如kotlin调用java的对象,此时拿到的就是平台类型(!),表示不知道是否为可空类型:如下

//java
public class Person {
	public String getName () {...}
}
//kotlin 调用
val person = Person()
val title : String! = person.title //String!表示平台类型,不知道是否为可null类型

四、智能类型转换

1.Java以及kotlin类型转换对比

kotlin :is 判断一个实例是某种类型,as 类型的强转 , Java 使用 instanceOf 进行类型判断。

//java 类型转化  虽然判断过了  但是还是需要进行一次强制转换
IPerson person = new Person()
if(person  instanceOf Person){
	System.out.println((Person)person.name) //需要再次进行强制转换
}
//kotlin 正常转换
val person : Iperson = Person()
if	(person is Person){
	println((person as Person)person.name)
}

//kotlin 智能转换  if已经判断类型了  可直接进行使用
val person : Iperson = Person()
if	(person is Person){
	println(person.name)
}

//可null类型的智能转换
var value : String? = "zxf"
if(value != null){
	println(value.length) //此时value已经是不可null类型了,可直接调用
}

2.不支持智能转换的情况

var tag : String? = "zxf"
fun main(){
	if	(tag !=null){
		//此时tag依旧为可null类型,因为虽然赋值为null,但是别的线程可能对其有影响,编译器不会进行帮忙自动转换了
		println(tag!!.length)
	}
} 

3.类型的安全转换

val person : Iperson = Person()
println((person as? Person)person.name) //安全转换,如果转换失败则返回null  直接使用as  转换失败 抛异常

总结 (使用Retrofit进行简单的网络请求)

提示:这里对文章进行总结:
以上就是kotlin简单的类型学习,可以写一个列子练练手。
列如:使用Retrofit发送网络请求

interface GitHubApi {
    @GET("/repos/{owner}/{repo}")
    fun getRepository(@Path("owner") owner: String, @Path("repo") repo: String): Call<Repository>
}

fun main() {
    val gitHupApi = Retrofit.Builder().baseUrl("https://api.github.com")
        .addConverterFactory(GsonConverterFactory.create())
        .build()
        .create(GitHubApi::class.java)

    val response = gitHupApi.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()
        )
    }

}

以上使用到的实体类,单独放置:

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 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
    )
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

pumpkin的玄学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值