欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kotlin入门 —— 一篇文章就够了

程序员文章站 2022-05-01 10:13:25
...

因为本人是一名移动开发工程师,也相信绝大多数学习kotlin这一语言的都是Android开发工程师,于是我们的首选开发工具当然是AS。我们开始用AS学习kotlin吧。

首先,我们新建一个project,记住选中include kotlin。

kotlin入门 —— 一篇文章就够了

01.hello world

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        init()
    }

    private fun init(){
        println("hello world")
    }

}

找个真机,运行程序,Logcat控制台打印(Logcat搜索框输入:System.out过滤无效信息):

04-21 14:50:24.791 7455-7455/com.example.a86131.kotlin_01 I/System.out: hello world

从这几行代码,可以对比一下java和kotlin:

fun应该是用来声明一个方法,可以有private修饰符;

一个方法结束后不需要;间隔;

:表示继承

02.变量的声明和使用

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        //声明一个变量
        var name = "张三"
        println(name)
    }

}

var用来声明一个变量,运行程序,Logcat控制台打印(Logcat搜索框输入:System.out过滤无效信息):

04-21 15:04:20.657 9684-9684/com.example.a86131.kotlin_01 I/System.out: 张三

一个注意点:

kotlin入门 —— 一篇文章就够了

数据类型不可更换,否则编译不通过。

03.类型推断

kotlin入门 —— 一篇文章就够了

我们看这个例子,为什么报错了呢?是因为这个kotlin可以类型推断,默认推断a的类型为Int,新的赋值超过了Int取值范围。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var a:Int = 10
        var j:Long = 999999999999
        var t:String = "hello"
    }

}

我们也可以显示声明变量类型。

注意:修饰常量不要用var,要用val,被修饰后不可被修改。

kotlin入门 —— 一篇文章就够了

04.boolean判断

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var i = 10
        var j = 9;
        println(i > j)
    }

}

运行程序,控制台输出true。

05.函数详解

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var c = plus(2,10)
        println(c)
    }

    fun plus(a:Int,b:Int):Int{
        return a+b;
    }

}

相信大家都能看懂,控制台输出12,有一点声明一下plus括号里面是两个变量以及变量类型,最后:Int是返回值类型。

fun 函数名(参数:参数类型):返回值类型{
    函数体
}

06.字符串模板

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var s1 = tem("刘德华")
        println(s1)
    }

    fun tem(s:String):String{
        return "${s}好帅"
    }

}

控制台打印“刘德华好帅”,${}可以替换里面的内容到字符串。

07.条件控制 if······else

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var t = score(80)
        println(t)
    }

    fun score(a:Int):String{
        if (a > 90)
            return "合格"
        else
            return "不合格"
    }


}

跟java不同的是,{}可以写也可以不写。

08.字符串比较

记住一点:kotlin里面==等同于java中的equal。

09.when表达式

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        score(9)
    }

    fun score(a:Int){
        when(a){
            10 -> println("非常好")
            9 -> println("很好")
            8 -> println("良好")
        }
    }


}

类似于java中的switch。

10.一些语法

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var nums = 1 .. 100
        for (num in nums){
            println(num)
        }
    }


}

1 .. 100表示1到100的闭区间,控制台可以看到1到100。

private fun init(){
        var nums = 1 until 100
        for (num in nums){
            println(num)
        }
    }

1 util 100表示1到99。

11.List和Map

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var list1 = listOf<String>("刘德华","郭富城","张学友","黎明")
        for ((index,value) in list1.withIndex()){
            println("$index $value")
        }
    }


}

日志打印:

04-21 16:35:10.515 18464-18464/? I/System.out: 0 刘德华
04-21 16:35:10.515 18464-18464/? I/System.out: 1 郭富城
04-21 16:35:10.515 18464-18464/? I/System.out: 2 张学友
04-21 16:35:10.515 18464-18464/? I/System.out: 3 黎明
for((index,value) in list.withIndex()){    //重点是 withIndex() 方法,
index 接收索引,value 接收对应的值
    //DO  STH 
}
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var map01 = TreeMap<String,String>()
        map01["a"] = "boy"
        map01["b"] = "girl"
        println(map01["a"])
    }


}

控制台打印boy。

12.函数的一些语法糖

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var i = {a:Int,b:Int -> a+b}
        var c = i(3,5)
        println(c)
    }


}

控制台输出8,表示声明一个函数i,参数a,b返回a+b。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
       var j:(Int,Int)->Int={a,b->a+b}
        var t = j(1,2)
        println(t)
    }


}

控制台输出3

13.默认参数和具名参数

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    val Pi = 3.14f

    private fun init(){
       var j = getArea(r=10f)
        println(j)
    }

    fun getArea(PI:Float=Pi,r:Float):Float
    {
        return PI*r*r;
    }


}

上面这个例子是求圆的面积,PI是一个默认参数,r是一个具名参数。

14.异常处理

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        try {
            var i = 10/0
        }catch (e:Exception){
            println(e)
        }
    }

}

日志打印:

System.out: java.lang.ArithmeticException: divide by zero

异常处理这一块和java基本一样

15.面向对象

Android Studio里面定义一个类(new kotlin File/Class 选择Class):

class Rect(var width:Float,var height:Float) {
    fun area(a: Float,b: Float):Float = a*b
}

初始化对象,不需要new

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var rect = Rect(5f,10f)
        rect.area(5f,10f)
    }

}

再来一个洗衣机的例子:

//定义成员变量和成员方法
class WashMachine(var brand: String, var size: Int) {    //品牌,容量
    fun openTheDoor() {
        println("打开洗衣机的门")
    }

    fun closeTheDoor() {
        println("关上洗衣机的门")
    }

    fun start() {
        println("启动洗衣机洗衣服")
    }
}

使用:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var wash01 = WashMachine("海尔",8)
        wash01.closeTheDoor()
        wash01.openTheDoor()
        wash01.start()
    }

}

日志:

04-21 17:33:32.573 23491-23491/com.example.a86131.kotlin_01 I/System.out: 关上洗衣机的门
04-21 17:33:32.573 23491-23491/com.example.a86131.kotlin_01 I/System.out: 打开洗衣机的门
04-21 17:33:32.573 23491-23491/com.example.a86131.kotlin_01 I/System.out: 启动洗衣机洗衣服

16.封装

1>隐藏内部实现细节即为封装——Java系的程序员都知道!

2>私有关键字 :private —— 同Java。私有即是封装的一种体现

17.继承

在java中,继承的重要性不言而喻,比如我们安卓日常开发中需要先封装一个BaseActivity,然后让其他的Activity去继承,这样就大大优雅了代码,否则一些共同代码每个Activity都去写一遍,代码就显得极为臃肿,并且难以维护。

open class Father {

    var a = "长得帅"

    open fun hobby(){
        println("钓鱼")
    }
    
}

class Son : Father() {

    override fun hobby() {
        println("唱歌")
    }
}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var son = Son()
        son.hobby()
    }

}

注意几点:

1.被继承的类要有open修饰

2.允许被继承的方法要用open修饰

3.重写父类方法要用override修饰

4.使用:,类比于java的extends

18.抽象类

abstract class Human(var name:String) {

    abstract fun drink()

}

class Man(name:String) : Human(name) {

    //必须重写
    override fun drink() {
        println("$name 喝酒")
    }
}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var m = Man("james")
        m.drink()
    }

}

抽象类和方法不需要用 open 声明可以被继承/实现

19.多态

abstract class Human(var name:String) {

    abstract fun fair()

}

class Man(name:String) : Human(name) {

    override fun fair() {
        println("$name 短头发")
    }

}

class Woman(name: String):Human(name) {

    override fun fair() {
        println("$name 长头发")
    }

}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var man = Man("james")
        var woman = Woman("lily")

        var list= listOf<Human>(man,woman)    //定义集合
        for (human in list){    //遍历集合
            human.fair()
        }

    }

}

20.接口

interface IMan {

    fun play()
    
}

class Man(name:String) : Human(name),IMan {

    override fun fair() {
        println("$name 短头发")
    }

    override fun play() {
        println("$name 打篮球")
    }

}

21.代理和委托

  • 委托,把自己不干的事情交给别人做
  • 代理,做别人委托的事情
  • kotlin中接口代理关键字:by

我们举个例子:有一个工程,包工头(B)5000块以自己的名义包下了,委托给A来做,A代理了这个事情:

interface IWork {

    fun makeMoney()

}

class A :IWork {

    override fun makeMoney() {
        println("1000元工资到手了")
    }


}

class B:IWork by A() {

}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
    }

    private fun init(){
        var b = B()
        b.makeMoney()
    }

}

控制台打印:

04-21 18:28:19.844 27203-27203/? I/System.out: 1000元工资到手了

 

 

 

 

 

 

 

 

 

 

 

 

 

             

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关标签: kotlin