关于Kotlin语法,这一篇就够了!,2024年最新啃下这些Framework技术笔记

println(“this is my first kotlin.”)

/*

  1. val:常量; var:变量

*/

val name = “Jack”

// name = “Rose” //报错

var age = 18

age = 20;

//也可明确类型

var count: Int = 100

/*

  1. 换行: 1. \n; 2. “”" +|

*/

val line = “here is one line\nthis is another line”

println(line)

val newLine = “”"here is one newLine

|here is another newLine"“”.trimMargin()

println(newLine)

/*

  1. 字符串模板、占位符:$

*/

var template = “this is a template string called $name and length is ${name.length}”

println(template)

/*

  1. null: ? ?. ?: !!

*/

var nullableString1: String? = “abc” //?可为空, 不加?则不能为空

var nullableString2: String? = null

println(nullableString1?.length)//?.如果为空则返回null, 不为空则返回实际值

println(nullableString2?.length)

println(nullableString2?.length ?: “i am null”)//?:如果为空则用:后面的赋值

// println(nullableString2!!.length)//!!如果为空则强制抛异常

var nameNullable: String? = null

var len = nameNullable?.length

println(len == null)

/*

  1. 延迟初始化: lateinit var, by lazy

*/

lateinit var lateInitByLateinit: String//lateinit var只能用来修饰类属性, 不能用来修饰局部变量和基本类型

fun testLateInit() {

lateInitByLateinit = “this is a lateinit string”

}

testLateInit()

println(lateInitByLateinit)

//by lazy用来修饰val变量, 可以用来修饰局部变量和基本类型,等下一次调用到的时候才会进行初始化

val lazyByLazy: String by lazy {

println(“here is lazy init”)

“Zoo”

}

println(lazyByLazy)//lazyByLazy被调用到了,开始初始化,执行println(“here is lazy init”),并且赋值"Zoo"

/*

  1. is 判断类型

*/

val isString: String? = “kotlin”

if (isString is String) {

println(“it’s string”)

}

/*

  1. as 类型转换

*/

val y: Int? = 123;

val x: String? = y as? String;

println(x);

/*

  1. 方法

*/

//step1: 标准写法

fun method1(name: String): String {

return “hello $name”

}

//step2: 如果返回值类型可以由编译器推断出来,则可以省略返回值类型

fun method2(name: String) = {

“hello $name”

}

//step3: 函数只有单个表达式,则可以省略花括号,直接写在=后

fun method3(name: String) = “hello $name”

//step4: 具有代码块的函数,必须显示指明返回类型

fun method4(): Int {

println(“this is 100”)

return 100

}

println(method1(“kotlin1”))

println(method2(“kotlin2”))

println(method3(“kotlin3”))

println(method4())

//void返回类型

fun testVoid(): Unit {//Unit = java’s void

println(“this is a void fun”)

}

fun testVoidWithoutUnit() {

println(“this is a void fun without unit”)

}

fun methodWithMultipleArgs(vararg name: String) {//多个参数

println(“params size is ${name.size}”)

}

methodWithMultipleArgs(“aaron”)

methodWithMultipleArgs(“aaron”, “beyond”)

fun methodWithOneLine(age: Int): Boolean = age == 20

println(methodWithOneLine(20))

//@JvmStatic and @JvmField

println(JvmClass.name);

//方法入参可以指定默认值

fun sayHello(who: String = “Jerry”, msg: String = “Hello”) {

println(“$who - said - $msg”)

}

sayHello()

/*

9.1 Class

*/

//open表示此类可以被继承, 用在函数上面表示此函数可以被重写

open class KotlinClass(val name: String) {

open fun print(content: String?) {

println(this.name + content)

}

}

val kotlinClass = KotlinClass(“Charles”)

kotlinClass.print(" say: hello")

/*

9.2 Class extends Class and Implements interface

*/

class SubKotlinClass(name: String) : KotlinClass(name), CallBack { //父类构造函数直接赋值, 不再调用super

override fun getName(id: Int) {

println(“id = $id”)

}

override fun print(content: String?) {

println(this.name + content + “!!!”)

}

}

val subKotlinClass = SubKotlinClass(“Sub”)

subKotlinClass.print(" say: hello")

/*

9.3 Class with primary constructor, 主构造器定义在类头部, 因此需要init空间做初始化

*/

class KotlinClassConstructor1 constructor(name: String) {

val name: String

init {

this.name = name

}

}

val kotlinClassConstructor1 = KotlinClassConstructor1(“Jack”)

println(“kotlinClassConstructor:${kotlinClassConstructor1.name}”)

/*

9.4 Class with primary constructor, 主构造器定义在类头部, 也可以在类的属性初始化声明处

*/

class KotlinClassConstructor2 constructor(name: String) {

val prop: String = name.toUpperCase()

}

/*

9.5 Class with primary constructor, 如果主构造函数没有注解或可见性说明,则 constructor 关键字可以省略

*/

class KotlinClassConstructor3(name: String) {

}

/*

9.6 Class with primary constructor, 声明属性并在主构造函数中初始化更简洁的写法

*/

class KotlinClassConstructor4(var name: String) {

}

val kotlinClassConstructor4 = KotlinClassConstructor4(“Jack”)

println(“kotlinClassConstructor:${kotlinClassConstructor4.name}”)

/*

9.7 Class with secondary constructor, 次级构造器, 可以有多个

*/

class KotlinClassSecondaryConstructor {

private var name: String

private var age: Int = 0

private var male: Boolean = false

constructor(name: String) {

this.name = name;

}

constructor(name: String, age: Int) {

this.name = name

this.age = age

}

constructor(name: String, age: Int, male: Boolean) : this(name, age) {

this.name = name

this.age = age

this.male = male

}

fun print() {

println(this.name)

}

}

val kotlinClassSecondaryConstructor1 = KotlinClassSecondaryConstructor(“Michael”)

kotlinClassSecondaryConstructor1.print()

val kotlinClassSecondaryConstructor2 = KotlinClassSecondaryConstructor(“Michael”, 18, true)

kotlinClassSecondaryConstructor2.print()

/*

9.8 class without body

*/

class withoutBody

/*

9.9 DataClass

*/

data class DataClassSample(val x: Int, val y: Int)

val data = DataClassSample(100, 200)

println(data.x + data.y)

/*

10.1 ArrayList and for

*/

val names = arrayListOf(“dog”, “cat”)

for (name in names) {

println(“names contains:$name”)

}

for (i in 0 until names.size) {//从0一直到names.size - 1, 方便数组遍历而设计

println(“[for until]names contans:${names[i]}”)

}

/*

10.2 Map

*/

val ages = mapOf<String, Int>(“a” to 1, “b” to 2)

for ((key, value) in ages) {

println(“$key -> $value”)

}

/*

10.3 可变数组

*/

val bags = mutableListOf(1, 2, 3)

bags.add(4)

println(bags.last())

println(bags[0])

/*

10.4 while

*/

var cnt: Int = 0;

while (cnt < 5) {

println(cnt++)

}

if (cnt == 5)

println(“cnt = 5”)

/*

10.5 when: 等价于switch

*/

var a = 1

val b = 2;

val c = 3

when (b) {

1 -> println(“the result is 1”)

2 -> {

a = 11

println(a)

}

1, 2 -> println(“1 or 2”)

in 1…2 -> println(“in 1 and 2”)

else -> {

println(“nothing”)

}

}

/*

10.6 单例

*/

println(Utils1.label)

println(Utils2.hello())

/*

10.7 static

*/

println(CompanionTest.name)

println(CompanionTest.run())

/*

10.8 getter and setter

*/

val getterAndsetter = KotlinGetterAndSetter()

getterAndsetter.x = 100

println(“getter and setter:” + getterAndsetter.x)

//getter and setter 二次赋值

val person = Person()

println(“name:${person.name}”)

person.name = “hello world”

println(“name:${person.name}”)

person.age = -1

println(“name:${person.age}”)

/* 11. 内联函数

apply let run with also

函数体对象 this it this this it

对象是否可省 可 不可 可 可 不可

返回值 必有,当前对象 最后一行,可有可无 最后一行,可有可无 最后一行,可有可无 必有,当前对象

可否判空 可以 可以 可以 不可以 可以

*/

//let -> 闭包内使用it作为当前这个对象的参数; 返回值是函数最后一行, 或者return语句

fun letTest(): Int {

// fun <T, R> T.let(f: (T) -> R): R { f(this)}

“letTest”.let {

println(it)

return 1

}

}

println(letTest())

//apply -> 闭包内可以任意调用此对象; 并且最终也会返回此对象

fun applyTest() {

// fun T.apply(f: T.() -> Unit): T { f(); return this }

ArrayList().apply {

add(“applyTest”)

println(“this = $this, size = $size”)

}.let { println(it) }

}

applyTest()

// apply with null and nonnull

val strJim: String? = null

strJim?.apply {

println(“apply with nonnull”)

} ?: strJim.apply {

println(“apply with null”)

}

//with -> 闭包内可以任意调用此对象; 返回值是函数最后一行, 或者return语句

fun withTest() {

// fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()

with(ArrayList()) {

add(“withTest”)

println(“this = $this, size = $size”)

}.let { println(it) }

}

withTest()

//run -> run只接收一个lambda函数为参数; 返回值是函数最后一行, 或者return语句

fun runTest() {

// fun <T, R> T.run(f: T.() -> R): R = f()

“runTest”.run {

println("this = " + this)

}.let { println(it) }

}

runTest()

//run用来判空

val s = null

s?.run {

} ?: run {

println(“use run to identify null”)

}

//also

fun alsoTest() {

val car = Car(“Benz”)

car.also {

it.name = “BMW”

}

println(“car’s name is ${car.name}”)

}

alsoTest()

/*

  1. 其它

*/

//test anonymous inner class about interface

callback.getName(123)

//@JvmOverloads, 声明多个参数的构造函数

val animal = Animal()

animal.func(“dog”)

animal.func(“dog”, 2)

animal.func(“dog”, 2, “New York”)

//lambda表达式

val lambdaTest1 = LambdaTest1()

lambdaTest1.setTheCallBack(object : CallBack {

override fun getName(id: Int) {

println(“getName”)

}

})

//if the callback defined in java

lambdaTest1.setTheCallBackFromJava(CallBackFromJava {

println(“getName”)

})

val lambdaTest2 = LambdaTest2()

lambdaTest2.setCallBack({ id -> println(“getName”) })

lambdaTest2.setCallBack { id -> println(“getName”) }

lambdaTest2.setCallBack { println(“getName”) }

//lambda使用下划线_, 没有用到的就用_代替

val aa = mapOf(1 to “a”, 2 to “B”)

aa.forEach { (_, value) -> println(“value:$value”) }

// chain use

var list = arrayOf(“java”, “c++”, “Android”, “Kotlin”, “iOS”)

list.map {

“Hello $it”

}.filter {

!it.contains(“c”)

}.forEach {

println(it)

}

}

//new a interface

private val callback = object : CallBack {

override fun getName(id: Int) {

println(“CallBack -> getName”)

}

}

/*

Object: 单例, Object修饰的类为静态类, 里面的方法和变量都是静态的

*/

object Utils1 {

val label: String

get() {

if (true)

return “here is singleton fun”

else

return “”

}

}

object Utils2 {

fun hello() {

println(“here is an object demo”)

}

}

/*

Interface

*/

//interface CallBack {

// fun getName(id: Int)

//}

interface CallBack2 {

fun getName(id: Int)

fun getVersion() = 1 // can offer non-abstract method

}

/*

companion object:伴生对象,相当于java中的static

*/

class CompanionTest {

companion object { //一个类中只能存在一个伴生对象

val name: String = “Vincent”

fun run() {

println(“I am running!”)

}

}

}

/*

getter and setter: 自带, 默认隐藏

*/

class KotlinGetterAndSetter {

var x: Int = 0

set(value) {

field = value

}

get() = field

}

class Person {

var name: String = “Tom”

set(value) {

field = value

}

get() = field.toUpperCase()

var age: Int = 100

set(value) {

if (value < 0) {

field = 0

} else {

field = value

}

}

get() = field

}

/*

@JvmStatic and @JvmField,主要是方便java调用,不用再在java中写.INSTANCE调用kotlin代码

*/

open class JvmClass {

companion object {

@JvmField

val name: String = “jvm test”

@JvmStatic

fun method() {

println(“call method”)

}

}

}

class Animal {

//define multiple constructor

@JvmOverloads

fun func(a: String, b: Int = 0, c: String = “abc”) {

}

}

class Car(var name: String) {

}

class LambdaTest1 {

var callback: CallBack? = null

var callbackfromjava: CallBackFromJava? = null

fun setTheCallBack(callback: CallBack) {

this.callback = callback

}

fun setTheCallBackFromJava(callbackfromjava: CallBackFromJava) {

this.callbackfromjava = callbackfromjava

}

}

class LambdaTest2 {

lateinit var callback: (CallBack) -> Unit

fun setCallBack(callback: (CallBack) -> Unit) {

this.callback = callback

}

}

class User(var name: String, var age: Int) {

}

3. Kotlin Advanced

=============================================================================

fun main(args: Array) {

/*

  1. lambda表达式

*/

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

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

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

我这里整理了一份完整的学习思维以及Android开发知识大全PDF。

当然实践出真知,即使有了学习线路也要注重实践,学习过的内容只有结合实操才算是真正的掌握。

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

/*

  1. lambda表达式

*/

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

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

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-iEsjjzTv-1712707271908)]
[外链图片转存中…(img-0vAqsfbH-1712707271909)]
[外链图片转存中…(img-pGNuMyQY-1712707271910)]
[外链图片转存中…(img-vya6AyA6-1712707271910)]
[外链图片转存中…(img-chtTULFa-1712707271910)]
[外链图片转存中…(img-IhmP3wny-1712707271911)]
img

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-X5A2xwOb-1712707271911)]

最后

我这里整理了一份完整的学习思维以及Android开发知识大全PDF。

[外链图片转存中…(img-al6xUETu-1712707271912)]

当然实践出真知,即使有了学习线路也要注重实践,学习过的内容只有结合实操才算是真正的掌握。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-1C3enH6v-1712707271912)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值