kotlin基本语法

1. 基础类型和控制结构

字符串(可变与不可变)

// 不可变字符串
val immutableString = "Hello"
// immutableString = "World" // 错误,val 不可重新赋值

// 可变字符串
var mutableString = "Hello"
mutableString = "World" // 正确

// 字符串模板
val name = "Alice"
println("Hello, $name!") // 输出: Hello, Alice!
println("Your name has ${name.length} characters") // 输出: Your name has 5 characters

// 原始字符串
val multilineString = """
    This is a multiline
    string in Kotlin.
    It preserves all indentation.
""".trimIndent()
println(multilineString)

数字类型

// 整数类型
val byte: Byte = 127
val short: Short = 32767
val int: Int = 2147483647
val long: Long = 9223372036854775807L

// 浮点类型
val float: Float = 3.14f
val double: Double = 3.141592653589793

// 数字转换
val stringNumber = "123"
val intNumber = stringNumber.toInt()

// 数字运算
println(1 + 2)   // 3
println(2.5 * 4) // 10.0
println(5 / 2)   // 2 (整数除法)
println(5 / 2.0) // 2.5

字典(Map)

// 不可变Map
val immutableMap = mapOf(
    "name" to "Alice",
    "age" to 25,
    "city" to "New York"
)
println(immutableMap["name"]) // Alice

// 可变Map
val mutableMap = mutableMapOf(
    "name" to "Bob",
    "age" to 30
)
mutableMap["city"] = "London"
mutableMap.remove("age")

// 遍历Map
for ((key, value) in mutableMap) {
    println("$key = $value")
}

数组

// 数组创建
val numbers = arrayOf(1, 2, 3, 4, 5)
val nulls = arrayOfNulls<Int>(5)
val squares = Array(5) { i -> (i * i).toString() }

// 基本类型数组(避免装箱开销)
val intArray = intArrayOf(1, 2, 3)
val charArray = charArrayOf('a', 'b', 'c')

// 数组访问和修改
println(numbers[0]) // 1
numbers[0] = 10

// 数组遍历
for (num in numbers) {
    println(num)
}

numbers.forEach { println(it) }

循环结构

// for循环
for (i in 1..5) { // 1到5(包含5)
    print("$i ")
}
println()

for (i in 1 until 5) { // 1到4(不包含5)
    print("$i ")
}
println()

for (i in 5 downTo 1) { // 5到1
    print("$i ")
}
println()

for (i in 1..10 step 2) { // 1,3,5,7,9
    print("$i ")
}
println()

// while循环
var x = 5
while (x > 0) {
    print("$x ")
    x--
}
println()

// do-while循环
var y = 0
do {
    print("$y ")
    y++
} while (y < 5)
println()

when 表达式(类似 switch)

val grade = 'B'
val result = when (grade) {
    'A' -> "Excellent"
    'B' -> "Good"
    'C' -> "Average"
    'D' -> "Below Average"
    'F' -> "Fail"
    else -> "Invalid Grade"
}
println(result) // Good

// when 也可以用作表达式或语句
val number = 42
when {
    number < 0 -> println("Negative")
    number == 0 -> println("Zero")
    else -> println("Positive")
}

// when 可以检查类型
val obj: Any = "Hello"
when (obj) {
    is String -> println("String length: ${obj.length}")
    is Int -> println("Int value: $obj")
    else -> println("Unknown type")
}

if 表达式

val a = 10
val b = 20

// 传统用法
if (a > b) {
    println("a is greater")
} else {
    println("b is greater")
}

// 作为表达式(类似三元运算符)
val max = if (a > b) a else b
println("Max is $max")

// if-else if 链
val score = 85
val grade = if (score >= 90) {
    "A"
} else if (score >= 80) {
    "B"
} else if (score >= 70) {
    "C"
} else {
    "D"
}
println("Grade: $grade")

2. 枚举和常量

枚举

enum class Direction {
    NORTH, SOUTH, EAST, WEST
}

// 带属性的枚举
enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}

// 使用枚举
val currentDirection = Direction.NORTH
when (currentDirection) {
    Direction.NORTH -> println("Heading North")
    Direction.SOUTH -> println("Heading South")
    Direction.EAST -> println("Heading East")
    Direction.WEST -> println("Heading West")
}

println(Color.RED.rgb) // 输出: 16711680

常量(类似宏定义)

// 编译时常量
const val PI = 3.14159
const val MAX_USERS = 1000

// 顶层常量(非编译时常量)
val APP_NAME = "MyKotlinApp"

fun main() {
    println("PI = $PI")
    println("MAX_USERS = $MAX_USERS")
    println("APP_NAME = $APP_NAME")
}

3. 类和面向对象

类定义

// 简单类
class Person {
    // 属性
    var name: String = ""
    var age: Int = 0
    
    // 方法
    fun speak() {
        println("$name is speaking")
    }
}

// 使用
val person = Person()
person.name = "Alice"
person.age = 25
person.speak()

构造函数

// 主构造函数
class Person constructor(firstName: String) {
    val name: String
    
    init {
        name = firstName.capitalize()
        println("Person initialized with name: $name")
    }
}

// 简化主构造函数
class Person(val name: String, var age: Int) {
    init {
        println("Person $name created, age $age")
    }
}

// 次构造函数
class Person(val name: String) {
    var age: Int = 0
    var city: String = ""
    
    constructor(name: String, age: Int) : this(name) {
        this.age = age
    }
    
    constructor(name: String, age: Int, city: String) : this(name, age) {
        this.city = city
    }
}

// 使用
val p1 = Person("Alice")
val p2 = Person("Bob", 30)
val p3 = Person("Charlie", 25, "London")

类属性和方法

class Rectangle(val width: Double, val height: Double) {
    // 计算属性
    val area: Double
        get() = width * height
    
    // 可变属性
    var scale: Double = 1.0
        set(value) {
            if (value > 0) {
                field = value
            }
        }
    
    // 实例方法
    fun printDescription() {
        println("Rectangle $width x $height, area = $area")
    }
    
    // 伴生对象(类似静态方法)
    companion object {
        fun createSquare(side: Double): Rectangle {
            return Rectangle(side, side)
        }
    }
}

// 使用
val rect = Rectangle(10.0, 5.0)
println(rect.area) // 50.0
rect.scale = 2.0
rect.printDescription()

val square = Rectangle.createSquare(7.0)
square.printDescription()、

继承和多态

// 基类(默认是final的,必须用open才能被继承)
open class Animal(val name: String) {
    open fun makeSound() {
        println("$name makes a sound")
    }
}

// 派生类
class Dog(name: String) : Animal(name) {
    override fun makeSound() {
        println("$name barks")
    }
    
    fun fetch() {
        println("$name is fetching")
    }
}

// 另一个派生类
class Cat(name: String) : Animal(name) {
    override fun makeSound() {
        println("$name meows")
    }
}

// 使用多态
fun animalSounds(animals: List<Animal>) {
    for (animal in animals) {
        animal.makeSound()
    }
}

val animals = listOf(
    Dog("Rex"),
    Cat("Whiskers"),
    Animal("Generic Animal")
)

animalSounds(animals)
/*
输出:
Rex barks
Whiskers meows
Generic Animal makes a sound
*/

抽象类和接口

// 抽象类
abstract class Shape(val name: String) {
    abstract fun area(): Double
    
    fun printInfo() {
        println("Shape: $name, Area: ${area()}")
    }
}

// 接口
interface Drawable {
    fun draw()
}

// 实现抽象类和接口
class Circle(name: String, val radius: Double) : Shape(name), Drawable {
    override fun area(): Double {
        return Math.PI * radius * radius
    }
    
    override fun draw() {
        println("Drawing a circle with radius $radius")
    }
}

// 使用
val circle = Circle("My Circle", 5.0)
circle.printInfo()
circle.draw()

数据类

// 数据类自动生成equals(), hashCode(), toString(), copy()等方法
data class User(val name: String, val age: Int, val email: String)

// 使用
val user1 = User("Alice", 25, "alice@example.com")
val user2 = User("Bob", 30, "bob@example.com")
val user3 = user1.copy(name = "Alice Smith")

println(user1) // 自动生成的toString()
println(user1 == user3) // false, 因为name不同
println(user1.hashCode())

// 解构声明
val (name, age, email) = user2
println("$name is $age years old, email: $email")

密封类

// 密封类用于表示受限的类层次结构
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
    object Loading : Result()
}

fun handleResult(result: Result) {
    when (result) {
        is Result.Success -> println("Success: ${result.data}")
        is Result.Error -> println("Error: ${result.message}")
        Result.Loading -> println("Loading...")
    }
}

// 使用
handleResult(Result.Success("Data loaded"))
handleResult(Result.Error("Network error"))
handleResult(Result.Loading)

4. 其他特性

扩展函数

// 为String类添加扩展函数
fun String.addExclamation(): String {
    return "$this!"
}

// 使用
val greeting = "Hello"
println(greeting.addExclamation()) // Hello!

// 扩展属性
val String.hasDigits: Boolean
    get() = this.matches(".*\\d+.*".toRegex())

println("abc123".hasDigits) // true
println("abc".hasDigits)    // false

空安全

// 可空类型
var nullableString: String? = null

// 安全调用
val length = nullableString?.length // 如果nullableString为null,length为null

// Elvis操作符
val safeLength = nullableString?.length ?: 0 // 如果为null,返回0

// 非空断言(慎用)
// val forcedLength = nullableString!!.length // 如果为null,抛出异常

// 安全转换
val number: Int? = "123".toIntOrNull()

泛型

// 泛型类
class Box<T>(val content: T) {
    fun getContent(): T {
        return content
    }
}

// 使用
val intBox = Box(123)
val stringBox = Box("Hello")

// 泛型函数
fun <T> printItem(item: T) {
    println("Item: $item")
}

printItem(42)
printItem("Kotlin")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容