数据类型

数组

  1. fun main() {
  2. //使用Array
  3. val arr1 = arrayOf(1, 2, 3)
  4. val arr2 = arrayOfNulls<Int>(5)
  5. val arr3 = Array(3) { it + 1 }
  6. arr1.forEach { println(it) }
  7. arr2.forEach { println(it) }
  8. arr3.forEach { println(it) }
  9. //可以用[]取值,重载的运算符
  10. println(arr1[0])
  11. //使用原生的无装箱的数组
  12. val array1 = intArrayOf(1, 2, 3)
  13. //五个0
  14. val array2 = IntArray(5)
  15. //五个相同的数
  16. val array3 = IntArray(5) { 11 }
  17. //1,2,3,4,5
  18. val array4 = IntArray(5) { it * 1 }
  19. }

控制流程

IF

  1. val a = 3
  2. val b = 4
  3. //作为三目运算符使用
  4. val max1 = if (a>b) a else b
  5. //把最后的表达式作为方法的返回值
  6. val max2 = if(a>b){
  7. print("a is bigger")
  8. a
  9. }else{
  10. print("b is bigger")
  11. b
  12. }

FOR

  1. //一般的for循环
  2. for (item: Int in ints) {
  3. //To do
  4. }
  5. //如果想拿到索引下标i
  6. for (i in array.indices) {
  7. println(array[i])
  8. }
  9. for ((index, value) in array.withIndex()) {
  10. println("$index : $value")
  11. }

区间与数列

  1. fun main() {
  2. for (i in 1..4){
  3. println(i) //1,2,3,4
  4. }
  5. for (i in 4 downTo 1){
  6. println(i) //4,3,2,1
  7. }
  8. for (i in 1..8 step 2){
  9. println(i) //1,3,5,7
  10. }
  11. for (i in 8 downTo 1 step 2){
  12. println(i) //8,6,4,2
  13. }
  14. //左闭右开
  15. for (i in 1 until 10){
  16. println(i) //[1,10)
  17. }
  18. //自动生成的区间
  19. val range = IntProgression.fromClosedRange(1, 10, 1)
  20. for (i in range){
  21. println(i)
  22. }
  23. }

When 表达式

与传统的switch相似,大大提升的选择的功能

  1. fun main() {
  2. //只会匹配第一个符合条件的分支,如果没有身符合条件的走else分支
  3. when(val x = 10){
  4. 0,1 -> println("x ==0 or x==1")
  5. 10 -> println("$x is 10")
  6. in 3..10 -> println("$x 在[3,10]之间")
  7. is Int -> "$x 是 Int类型的数据"
  8. else -> println("这是switch中的default")
  9. }
  10. }
  1. fun main() {
  2. val x = 10
  3. val y = 3
  4. //可以把when当作if else的简写版,不给when的参数,
  5. //-> 左边写一个返回值为Boolean的表达式即可。
  6. when {
  7. x !in 0..9 -> println("$x !in [1,9]")
  8. y == 3 -> println("$x is 10")
  9. else -> print("x+y is ${x+y}")
  10. }
  11. }

类与对象

  1. fun main() {
  2. //因为有初值,其它的参数可以不赋值
  3. var p1 = Person(name = "tom")
  4. var p2 = Person("tom", 12, LocalDate.now())
  5. var p3 = Person()
  6. var p4 = Person("tom",LocalDate.of(1893,12,26))
  7. println(p3)
  8. }
  9. /**
  10. * 在类声明后的constructor()为主构造方法,
  11. * 类定义时主构造方法参数可以不给初值,但在调用时必须给
  12. * 如果想生成一个无参构造函数,构造方法中的参数必须有默认值
  13. * 类里的属性必须初始化,初始化一般在init()里
  14. */
  15. class Person constructor(
  16. var name: String = "ziv",
  17. var age: Int = 0,
  18. var birth: LocalDate = LocalDate.of(2020, 10, 10)) {
  19. /**
  20. * 延迟初始化,可以不用在对象初始化时使用
  21. * 必须是val类型
  22. * 在首次调用时才会初始化,初始化后不会改变
  23. */
  24. val isAdult: Boolean by lazy {
  25. age >= 18
  26. }
  27. init {
  28. //可以使用主构造方法里的参数,也可以对其进行初始化
  29. println("初始化函数启用")
  30. }
  31. /**
  32. * 从构造函数,把其它类型的参数转换成主构造函数知道的类型,最终是用主构造函数执行的。
  33. * 是一种委托的关系
  34. */
  35. constructor(name:String, birth: LocalDate):this(name,LocalDate.now().year-birth.year,birth)
  36. override fun toString(): String {
  37. return "Person(name='$name', age=$age, birth=$birth)"
  38. }
  39. }

可见性修饰符

修饰符 作用域
public 默认,全局可见
protected 类及子类
private 类内修饰:只有本类内可见
类外修饰:文件内可见
internal 一个模块内可见

接口

  1. interface Flyer{
  2. fun fly()
  3. fun kind() = "flying animals"
  4. }
  5. interface Animal{
  6. val name:String
  7. fun eat()
  8. fun kind(): String {
  9. return "flying animals"
  10. }
  11. }
  12. class Bird(override val name:String):Flyer,Animal{
  13. override fun fly() {
  14. println("I can fly")
  15. }
  16. override fun eat() {
  17. println("I can eat")
  18. }
  19. //选择用哪个接口的方法
  20. override fun kind() = super<Flyer>.kind()
  21. }
  22. fun main() {
  23. val bird = Bird("bird1")
  24. println(bird.kind())
  25. }

委托

  1. // 创建接口
  2. interface Base {
  3. fun printMessage()
  4. fun printMessageLine()
  5. }
  6. // 实现此接口的被委托的类
  7. class BaseImpl(val x: Int) : Base {
  8. override fun printMessage() {
  9. print(x)
  10. }
  11. override fun printMessageLine() {
  12. println(x)
  13. }
  14. }
  15. /**
  16. * 通过关键字 by 建立委托类,
  17. * Derived 的超类型列表中的 by-⼦句表⽰ b 将会在 Derived 中内部存储,
  18. * 并且编译器将⽣成转发给 b 的所有 Base 的⽅法。
  19. */
  20. class Derived(b: Base) : Base by b{
  21. override fun printMessage() {
  22. print("override printMessage")
  23. }
  24. }
  25. fun main() {
  26. //b 是类实例
  27. val b = BaseImpl(10)
  28. val derived = Derived(b)
  29. derived.printMessage() //"override printMessage"
  30. derived.printMessageLine() //10
  31. }

数据类

即为JavaBean,内置了许多方法

  1. data class User(val name:String,val age:Int)

编译器会自动从主构造函数中拿属性并生成许多如equals()、hashCode()方法

  • equals()、hashCode()
  • toString()
  • copy()

在类中声明的属性

如果不想让编译器对属性生成方法,可以把属性写在类的内部。

  1. //只会生成name的方法
  2. data class Person(val name:String){
  3. var age: Int = 0
  4. }

Copy()

  1. val jack = User(name = "Jack", age = 10)
  2. val adultJack = jack.copy(age = 18)

数据类的解构声明

就是拿出数据类中存放的数据

  1. fun main(){
  2. val jack = User(name = "Jack", age = 10)
  3. val (name,age) = jack
  4. }

Object

与Java中的Static的作用相似,用来表示单例

  1. //单例
  2. object DatabaseConfig {
  3. val host:String = "localhost"
  4. val port:Int = 3306
  5. var username:String = "root"
  6. var password:String = "root"
  7. }
  8. data class User(val name:String,val age:Int){
  9. //静态的属性或方法
  10. companion object{
  11. val TYPE = "人类"
  12. fun sayHello(): String {
  13. return "Hello"
  14. }
  15. }
  16. }
  17. fun main(){
  18. println(User.TYPE)
  19. println(User.sayHello())
  20. println(DatabaseConfig.username)
  21. println(DatabaseConfig.password)
  22. }