2024年Android最全开始切换到 Kotlin_ 谷歌工程师给初学者的知识点总结(1),h5面试问题

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

**Android精讲视频学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!

**任何市场都是优胜略汰适者生存,只要你技术过硬,到哪里都不存在饱和不饱和的问题,所以重要的还是提升自己。懂得多是自己的加分项 而不是必须项。门槛高了只能证明这个市场在不断成熟化!**另外一千个读者就有一千个哈姆雷特,所以以上只是自己的关键,不喜勿喷!

如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。欢迎关注会持续更新和分享的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

/// Kotlin
class ExampleTest {
@Test
fun testMethod1() {}
@Test
fun testMethod2() {}
}

在 Kotlin 里需要注意:

  • 方法与类的默认修饰符类型是 Public
  • 函数定义中如果返回值是空 (void) 的话可以忽略
  • 没有检查性异常

分号是可选项

这个特性一开始可能会让您不适应。但是在实践中,您不需要有过多的担心。您可以按照以前的编程习惯使用分号,而且不会影响到代码的编译过程,但 IDE 会自动找出这些可删除的分号并提示您。只需要在提交代码之前删掉就可以了。

无论您喜欢与否,Java 已经在某些地方早就不使用分号了,如果跟 C++ 对比的话会更明显 (因为 C++ 使用分号的场景更多)。

/// C++
std::thread([this] { this->DoThreadWork(); });
/// Java
new Thread(() -> doThreadWork());
/// Kotlin
Thread { doThreadWork() }

在尾部声明类型

/// Java
int value = 10;
Entry add(String name, String description)
/// Kotlin
var value: Int = 10
fun add(name: String, description: String): Entry

和分号是可选项类似,如果您还没有习惯使用这个特性的话,可能会让您难以接受,它与很多人在他们编程生涯中遇到过的类型声明相比,这里的顺序正好相反。

但这个语法带来的好处是,如果变量类型是可以自动被推测出来的话,此时可以直接跳过类型声明。这个特性在后面的 “省略变量类型” 章节里有介绍。

还有个好处是可以把更多的注意力放在变量本身而不是它的类型上。而且我发现在讨论代码的时候,类型在后的顺序听起来更自然 (从英文语言角度)。

/// Java
int result; // 整数型的变量,名字叫 “result”
/// Kotlin
var result: Int // 变量名字叫 “result” ,是整数型

对此语法我想说的最后一件事情是,虽然一开始您可能感觉不适,但是随着使用频率的增加,您慢慢会习惯。

没有 new 关键字的构造函数

Kotlin 中不需要使用 new 关键字调用构造函数。

/// Java
… = new SomeClass();
/// Kotlin
… = SomeClass()

起初这会让您觉得漏掉了关键信息 (指创建内存的操作),但不需要担心。因为在 Java 中,有些函数会在您不知情的情况下创建内存。对此,您从来也没有关心过 (也不需要关心)。很多函数库甚至还有创建内存的静态方法,比如:

/// Java
Lists.newArrayList();

Kotlin 只是统一了函数的这种行为。因为对一个函数来说,无论分配内存与否,这只是它的附加效果而已,并不影响函数调用。

而且它还简化了创建对象只是为了调用其方法的写法。

/// Java
new Thread(…).start(); // 有点奇怪但是是可以这样写的
/// Kotlin
Thread(…).start()

可变性与不可变性

在 Java 中变量默认是可变的,使用 final 关键字可以使变量为不可变。与之相反,在 Kotlin 中是没有 final 关键字。您需要使用 val 关键字指示变量是不可变的,使用 var 关键字指示变量是可变的。

/// Java
private final Project project; // 初始化之后无法再赋值
private Module activeModule; // 初始化之后可以再赋值
/// Kotlin
private val project: Project // 初始化之后无法再赋值
private var activeModule: Module // 初始化之后可以再赋值

在 Java 中您可能会经常遇到很多成员变量应该是常数,但是却没有使用 final 关键字 (忘记加上 final 是容易犯的错误)。在 Kotlin 中您必须显式地声明每个成员变量的类型。如果您一开始不确定该选择哪种类型,那就默认使用 val 类型,后面有需求变化时再改为 var。

顺便说一句,在 Java 中函数参数类型是可变的,但是可以使用 final 关键字修改为不可变。在 Kotlin 中,函数参数始终是不可变的,它们是被 val 关键字隐式地标记为不可变。

/// Java
public void log(final String message) { … }
/// Kotlin
fun log(message: String) { … } // “message” is immutable

可空性

Kotlin 中取消了 @NotNull 跟 @Nullable 的注解方法。如果变量可以赋值为 null,您只需要在变量类型后面加上一个 “?” 就可以了:

/// Java
@Nullable Project project;
@NotNull String title;
/// Kotlin
val project: Project?
val title: String

在某些情况下,当您确定某些可以被赋值为 null 的变量不可能是 null,您可以使用 !! 操作符设置一个断言。

/// Kotlin
// ‘parse’ 可以返回 null,但这条用例总是能够运行
val result = parse(“123”)!!
// 下面这行是多余的,因为 !! 已经触发断言了
❌ assertThat(result).isNotNull()

如果您错误地使用了 !!,它有可能会抛出 NullPointerException 的异常。在单元测试中,这只会造成测试用例的失败,但是在生产环境中,可能会使程序崩溃,所以要非常小心。事实上,在生产环境的代码中有太多的 !! 操作符,可能意味着此处有 “代码异味” (“代码异味” 代表这部分代码可能需要审查或重构)。

在单元测试中,测试用例里使用 !! 操作符是可接受的,原因是当假设不成立的时候测试用例会失败,并且您还可以修复它。

如果您确定使用 !! 操作符是有意义的,那尽量靠前使用,如下面的用法:

/// Kotlin
val result = parse(“…”)!!
result.doSomething()
result.doSomethingElse()

下面是错误用法:

/// Kotlin (自动生成)
val result = parse(“…”)
❌ result!!.doSomething()
❌ result!!.doSomethingElse()

可省略变量的类型

在 Java 中会看到如下写法的代码:

/// Java
SomeClass instance1 = new SomeClass();
SomeGeneric<List> instance2 = new SomeGeneric<>();

在 Kotlin 中,类型声明被认为是冗余的操作,不需要写两次:

/// Kotlin
val instance1 = SomeClass()
val instance2 = SomeGeneric<List>()

然而,我们在使用动态绑定的时候可能会需要声明这些类型:

/// Java
BaseClass instance = new ChildClass(); // 如:List = new ArrayList

在 Kotlin 中使用下面语法达到同样目的:

/// Kotlin
val instance: BaseClass = ChildClass()

没有检查性异常

不像 Java 那样,Kotlin 中的类方法不需要声明自己的异常类型。因为在 Kotlin 中检查性异常 (Checked Exception) 跟运行时异常 (Runtime Exception) 之间是没有区别的。

/// Java
public void readFile() throws IOException { … }
/// Kotlin
fun readFile() { … }

但是为了使 Java 可以调用 Kotlin 的代码,Kotlin 还是提供 @Throws 注解功能,用于隐式的声明异常类型。当执行 Java → Kotlin 转换时,IDE 会保证安全性并且始终包含这类信息。

/// Kotlin (从 Java 自动转换而来)
@Throws(Exception::class)

fun testSomethingImportant() { … }

但您不需要担心您的单元测试会被 Java 类调用。因此,您可以安全地删除这些类型声明而且还可以减少代码行数:

/// Kotlin
fun testSomethingImportant() { … }

Lambda 调用时可以省略括号

在 Kotlin 中,如果您想要把一个闭包赋值给变量,您需要显式地声明它的类型:

val sumFunc: (Int, Int) -> Int = { x, y -> x + y }

如果所有类型是可以被推测的,则可以简写成:

{ x, y -> x + y }

举个例子:

val intList = listOf(1, 2, 3, 4, 5, 6)
val sum = intList.fold(0, { x, y -> x + y })

需要注意的是,如果一个函数调用的最后一个参数是 lambda 调用时,这时候可以把闭包写在函数括号的外面。

总结

找工作是个很辛苦的事情,而且一般周期都比较长,有时候既看个人技术,也看运气。第一次找工作,最后的结果虽然不尽如人意,不过收获远比offer大。接下来就是针对自己的不足,好好努力了。

最后为了节约大家的时间,我把我学习所用的资料和面试遇到的问题和答案都整理成了PDF文档

喜欢文章的话请关注、点赞、转发 谢谢!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

链图片转存中…(img-7bxukTLB-1715632985576)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值