全面了解Kotlin,2021大厂Android高级面试题及答案

val str : String = “test”

变量定义.jpg 根据上图,我们需要注意两点:

2.1.val等于final

我们可以看到var定义的num可以被重新赋值,str却不可以。上图的val实际上就等于Java中的final String,也就是val定义的变量默认添加了final关键字。

2.2.可空?以及空匹配

第二点就是num变量在定义为Int的时候是不能赋值为Null的,如果需要我们需要这么定义

var num : Int?

2.3.类型推断

val str = “”

kotlin具有类型推断功能,上面的语句等于Java

final String str = “”

自定义getter&setter

var msg: String
get() = field
set(value) {
field = value
}

3.函数

3.1.定义
3.1.1普通函数

定义一个名为test函数,返回值为String?,可能返回为空

fun test(): String? {
return null
}

调用:

调用和Java类似,由于test返回的是可空的字符串,添加?:表示当前面为空取冒号后面的值。

val result = test() ?: “x”

也可以

fun isEmpty(str: String) = str.isEmpty()

其中isEmpty函数的返回值为后面isEmpty()的返回值。

3.1.2默认参数

kotlin支持带默认参数的函数,默认参数不传则为默认值。

data class EnvConfig(val baseUrl: String, val isDebug: Boolean = false)

//构造1 等于 EnvConfig(“https://xx.com”,false)
val env1 = EnvConfig(“https://xx.com”)

3.1.3命名参数

kotlin方法调用可以指明参数名称,以避免混淆。更加直观。

EnvConfig(
baseUrl = “https://xx2.com”,
isDebug = true
)

3.2顶层函数和属性

kotlin可以定义全局可以调用的工具函数,它会编译成该文件的静态方法以供调用。

TopFunc.kt

fun toString(obj:Any) = obj.toString()

翻译成Java类

public final class TopFuncKt {
@NotNull
public static final String toString(@NotNull Object obj) {
Intrinsics.checkParameterIsNotNull(obj, “obj”);
return obj.toString();
}
}

同理顶层属性

var count = 0

Java

public static final int getCount() {
return count;
}

public static final void setCount(int var0) {
count = var0;
}

3.3 给别人的类添加方法: 拓展函数和属性
3.3.1拓展函数

拓展函数非常简单,它就是一个类的成员函数。

TopFunc.kt

//定义一个成员函数 方法内的this会指向被拓展的对象。
//即这里的this是这个字符串
fun String.print() = println(this)

//使用
“string extension”.print()

//输出
string extension

拓展函数也是顶层函数,所以它在Java中也是静态函数,调用如下:

TopFuncKt.print(“extension in Java”);

拓展函数仅仅是为了缩短语法而存在。并非真正意义上的"拓展",也做不到真正的拓展,所以拓展函数无法进行重写,或者在Java中当作成员函数来调用。

3.3.2拓展属性

类似拓展函数,拓展属性提供了一种方法,用来拓展类的API,可以用来访问属性,用的是属性语法而不是函数的语法。**尽管它们被称为属性,但他们可以没有任何状态,也没有合适的地方来存储它们,**不能给现有的Java对象的实例添加额外的字段。

var StringBuilder.lastChar: Char
get() = get(length - 1)
set(value: Char) {
setCharAt(length - 1, value)
}

**上面的代码只是利用拓展属性提供了一种快捷访问该类成员方法的途径,但是并没有给StringBuilder这个类添加lastChar这个属性。**尽管如此,拓展属性依旧十分实用,比如Android中常用的Float转换为dp:

val Float.dp
get() = get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics)

3.4 可变参数和中缀调用

vararg:可变参数。只需要注意一点

fun test(vararg string: String){
test2(string)//这里传递可变参数需要添加
}

fun test2(vararg string: String){

}

中缀调用:

//允许使用中缀符号调用函数,函数会返回一个Pair对象
infix fun Any.with(other:Any) = Pair(this,other)

val c = “3” with 4 // c为pair对象
val (f, s) = “3” with 4 //val (f,s)称为解构声明,将Pair的first给f,second给s.
println(“f: f , s : f,s: f,s

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值