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

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

首先,我们新建一个project,记住选中include 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: 张三

一个注意点:

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

03.类型推断

我们看这个例子,为什么报错了呢?是因为这个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,被修饰后不可被修改。

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元工资到手了

 

 

 

 

 

 

 

 

 

 

 

 

 

             

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AD钙奶-lalala

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值