diff --git a/docs/kotlin.md b/docs/kotlin.md index 7532156..a70d074 100644 --- a/docs/kotlin.md +++ b/docs/kotlin.md @@ -678,6 +678,78 @@ fun main(args: Array) { 这里之所以可以把lambda写在外部,是因为operation是最后一个参数。 +### 扩展函数 + +```kotlin +// Kotlin File +fun String.lettersCount(): Int { + var count = 0 + // this 相当于我们下面写的字符串具体的内容 + // for 可以用 forEach 代替 + for (char in this) { + // 判断是不是字母(包括中文) + if (char.isLetter()) { + count++ + } + } + return count +} + +fun main() { + //不修改 String 类的情况下新增方法 + println("123demo".lettersCount()) + // Print: 4 +} +``` + +### 运算符重载 + +```kotlin +class Money(var amount: Double) + +// 配合扩展函数,重载运算符 + 即 plus +operator fun Money.plus(money: Money): Money { + // 把金额相加返回一个新的 Money对象 + return Money(this.amount + money.amount) +} + +fun main() { + val appleMoney = Money(10.0) + val eggMoney = Money(6.0) + // 你没有看错,我们将两个类对象相加了 + val allMoney = appleMoney + eggMoney + println(allMoney.amount) + // Print: 16.0 +} + +``` + +这里的 **运算符重载** 依赖于 **扩展函数** + + +### 中缀表达式 + +```kotlin +// infix 定义一个中缀表达式,类似扩展函数那样 +infix fun LocalDate.formatBy(pattern:String):String{ + val formatter = DateTimeFormatter.ofPattern(pattern) + return this.format(formatter) + +} + +fun main() { + val currentDate = LocalDate.now() + println(currentDate formatBy "yyyy-MM-dd") + // Print: 2024-02-08 + + (1 until 100).forEach { + println(it) + // Print 1 至 99 + } +} + +``` + 类 --- @@ -707,20 +779,52 @@ fun main() { ```kotlin -class Student(val name: String, val gpa: Double, val semester: String, val estimatedGraduationYear: Int) +class Student( + val name: String, + val gpa: Double, + val semester: String, + val estimatedGraduationYear: Int +) fun main() { - var student = Student("Lucia", 3.95, "Fall", 2022) - println(student.name) - // Prints: Lucia - println(student.gpa) - // Prints: 3.95 - println(student.semester) - // Prints: Fall - println(student.estimatedGraduationYear) - // Prints: 2022 + val student = Student("Lucia", 3.95, "Fall", 2022) + println(student.name) + // Prints: Lucia + println(student.gpa) + // Prints: 3.95 + println(student.semester) + // Prints: Fall + println(student.estimatedGraduationYear) + // Prints: 2022 } + ``` + +### 次构造函数 + + +```kotlin +class Student( + val name: String, + val gpa: Double, + val semester: String, + val estimatedGraduationYear: Int +) { + constructor(name: String, gpa: Double) : this(name, gpa, "Fall", 2024) +} + +fun main() { + val student = Student("Lucia", 3.95) + println(student.name) + // Prints: Lucia + println(student.semester) + // Prints: Fall + println(student.estimatedGraduationYear) + // Prints: 2024 +} + +``` + ### 类示例 @@ -785,6 +889,93 @@ fun main() { ``` +### Data数据类 + +```kotlin +// 默认实现 getter/setter 和 toString 这些方法 +data class UserInfo( + val name: String, + val age: Int +) + +fun main() { + + val userInfo = UserInfo("张三", 20) + println(userInfo.name) + // 张三 + println(userInfo.toString()) + // UserInfo(name=张三, age=20) +} +``` + +### 伴生对象 + +```kotlin +// 私有化构造方法 +class User private constructor(val name: String) { + // 伴生对象,相当于一个静态类 + companion object { + fun createUser(name: String): User { + return User(name) + } + } +} + +fun main() { + // 就像是调用静态方法 + val user = User.createUser("张三") + println(user.name) + //Print: 张三 +} + +``` + +### 内部类 + +```kotlin +class Outer { + val outStr: String = "Outer" + // inner 可以让内部类访问外部类 + inner class Inner { + fun printOutStr(){ + println(outStr) + } + } +} + +fun main() { + val outer = Outer() + outer.Inner().printOutStr() + // Print: Outer +} +``` + +如果不用inner修饰,会导致Inner类无法使用outStr + + +### object单例类 + +```kotlin +object HttpUtils { + + const val baseUrl = "https://xxxx.com" + + fun getRequest(url: String): String { + // 示例代码.... + return "Result" + } +} + +fun main() { + println(HttpUtils.baseUrl) + // Print: "https://xxxx.com" + HttpUtils.getRequest("xxxxx") +} +``` + +object类中定义的函数和属性都可以用类名直接引用 + + 另见 ---