Kotlin学习(二):类型初探

构造器分为主构造器和副构造器

主构造器即为 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 “ p a d d i n g {padding} 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

}

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(

“”"

${repository.owner.login} - ${repository.name}

${repository.owner.login} - ${repository.name}

${repository.description}

Stars: ${repository.stargazers_count}

Forks: ${repository.forks_count}

“”".trimIndent()

)

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

写在最后

由于本文罗列的知识点是根据我自身总结出来的,并且由于本人水平有限,无法全部提及,欢迎大神们能补充~

将来我会对上面的知识点一个一个深入学习,也希望有童鞋跟我一起学习,一起进阶。

提升架构认知不是一蹴而就的,它离不开刻意学习和思考。

**这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家,**梳理了多年的架构经验,筹备近1个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

最近还在整理并复习一些Android基础知识点,有问题希望大家够指出,谢谢。

希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

Android架构师之路很漫长,一起共勉吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

id开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

写在最后

由于本文罗列的知识点是根据我自身总结出来的,并且由于本人水平有限,无法全部提及,欢迎大神们能补充~

将来我会对上面的知识点一个一个深入学习,也希望有童鞋跟我一起学习,一起进阶。

提升架构认知不是一蹴而就的,它离不开刻意学习和思考。

**这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家,**梳理了多年的架构经验,筹备近1个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

[外链图片转存中…(img-avVWRSL9-1713390148892)]

[外链图片转存中…(img-FFWWZ9A1-1713390148892)]

最近还在整理并复习一些Android基础知识点,有问题希望大家够指出,谢谢。

希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

Android架构师之路很漫长,一起共勉吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值