Kotlin:基础语法学习(二)

2021-02-07  本文已影响0人  Coralline_xss

本篇内容清单如下:

一、基本语法

1. 包定义与导入

导入:

import org.example.Message
import org.test.Message as TestMessage

import 关键字使用场景:

2. 程序入口

kotlin 应用程序的入口点是 main 函数。(虽如此,但是以下 main 无法再 AS 中识别。)

fun main() { println("hello word !") }

// 可识别运行的 main 方法
companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            println("hello word !")
        }
}

3. 函数

一个加法函数的两种写法:

// 1. 完整写法
fun sum(a: Int, b: Int): Int {
  return a + b
}

// 2. 函数体仅含 单个表达式,并且 返回值 可 自动推断类型
fun sum(a: Int, b: Int) = a + b

// 3. 返回值无意义(类比 void),则 Unit 返回类型可省略
fun printSum(a: Int, b: Int): Unit {  // =>  fun printSum(a: Int, b: Int) { ... }
   println("sum of $a and $b is ${a + b}")
}

以上为一般函数调用,当然还有其他函数类型写法与调用,存在一些不同。同函数相关的内容主要有以下这五点:

与 Java 很大不同的内容点:

根据文档整理出来的导图(函数作用域后续文章还会继续说道)如下:


Kotlin 函数相关概念总结

[说明:星星 - 新概念且重要,问号 - 暂不理解,红旗 - 新概念但不重要。]

备注:

class Person constructor() { }

class Person constructor(name: String)

class Person(name: String)

class Person public constructor(name: String)

class Person(name: String) {
    var children: MutableList<Person> = mutableListOf()
    // 次构造函数,必须要委托给 主构造函数
    constructor(name: String, parent: Person)  : this(name) {
        parent.children.add(this)
    }
}

4. 变量

两种类型:

变量又可分为:

val a: Int = 1 // 立即赋值
val b = 2       // 自动推动出类型,可省略 参数类型
// b = 3         // 重新赋值,编译器会报错
 
var x = 5      // 自动推断类型
x += 5

二、基本类型

在 Kotlin 中,也是 “一切皆为对象”。但有些类型 可以在运行时,表示为「原生类型值」,如 数字、字符以及布尔值。

Kotlin 中的基本类型:

1. 数字

每个数字类型 都支持如下 转换函数:

2. 字符
3. 布尔
4. 数组
5. 字符串
原始字符串
var text = """
    for (c in "foo") 
        print(c)
"""

// 去除前导空格
var text = """
  |Tell me and I forget.
  | Teach me and I remember.
""".trimMargin() 
字符串模板

整理导入如下:


Kotlin 基本类型汇总

三、控制流

同 Java 有些差别,Kotlin 控制类分为:

以下仅整理不一致的点。

if 表达式
val max = if (a > b) a else b
when 表达式
val x = 3
when (x) {
      1           -> print("x == 1")
      2,3         -> print("x > 1")
      "1".toInt() -> print("it's 1")
      in 1..10    -> print("x is in the range")
      !in 10..20  -> print("x is outside the range")
      is Int      -> print("x is Int type")
      else        -> print("none of above")
}
Break 与 Continue 标签

四、习惯用法

五、编码规范

六、DEMO 练习

首先写一个 Java Demo,然后对比一下 Kotlin 的写法。具体内容为:一个 User Model 类,一个 UserManager 单例类,再加上 main() 入口函数调用(均是内部静态类写法)。

这里面涉及到关于 kotlin 的内容点:

这是我之前学 kotlin 时,特别想知道如果 kt 来写,会是怎样的。当然对于 static 修饰的变量和方法,在 kt 中都是包裹在 compion object 中,称为「伴生对象」,这一点首次接触,感觉非常新奇。

以下为 Java 实现:

public class JavaDemo {

    public static void main(String[] args) {
        User user = new User();
        user.name = "cc";
        user.age = 24;
        user.address = "Shanghai";

        UserManager.getInstance().addUser(user);
        UserManager.getInstance().addUser(new User("kk", 25));
    }

    public static class UserManager {

        private static UserManager sInstance;

        private List<User> users = new ArrayList<>();

        public static UserManager getInstance() {
            if (sInstance == null) {
                synchronized(UserManager.class) {
                    if (sInstance == null) {
                        sInstance = new UserManager();
                    }
                }
            }
            return sInstance;
        }

        private UserManager() {}

        public void addUser(User user) {
            if (!users.contains(user)) {
                users.add(user);
            }
        }

        public void addUsers(List<User> users) {
            if (!this.users.containsAll(users)) {
                this.users.addAll(users);
            }
        }

        public void removeUser(User user) {
            users.remove(user);
        }

        public void removeByIndex(int index) {
            users.remove(index);
        }

        public void clear() {
            users.clear();
        }
    }

    public static class User {
        private String name;

        private int age;

        private String address;

        public User() {}

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }
    }
}

Kotlin 写法如下:

import java.util.*

class JavaVSKotlinDemo {

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val user = User()
            user.name = "cc"
            user.age = 24
            user.address = "Shanghai"

            UserManager.getInstance().addUser(user)
            UserManager.getInstance().addUser(User("kk", 25))
        }
    }

    class UserManager private constructor() {

        private val users = ArrayList<User>()

        fun addUser(user: User) {
            if (!users.contains(user)) {
                users.add(user)
            }
        }

        fun addUsers(users: List<User>) {
            if (!this.users.containsAll(users)) {
                this.users.addAll(users)
            }
        }

        fun removeUser(user: User) {
            users.remove(user)
        }

        fun removeByIndex(index: Int) {
            users.removeAt(index)
        }

        fun clear() {
            users.clear()
        }

        companion object {
            // 单例模式
            private var sInstance: UserManager? = null
                get() {
                    return field ?: UserManager()
                }

            @JvmStatic
            @Synchronized
            fun getInstance(): UserManager {
                // synchronized(UserManager::class.java)
                return requireNotNull(sInstance)
            }
        }
    }
                                                                     
    class User constructor() {
        var name: String? = null

        var age: Int = 0

        var address: String? = null

        constructor(name: String?, age: Int) : this() {
            this.name = name
            this.age = age
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读