我的编程空间,编程开发者的网络收藏夹
学习永远不晚
位置:首页-资讯-运维

Kotlin学习教程(一)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Kotlin学习教程(一)

5月18日谷歌在I/O开发者大会上宣布,将Kotlin语言作为安卓开发的一级编程语言。并且会在Android Studio 3.0版本全面支持Kotlin

  • Kotlin是一个基于JVM的新的编程语言,由JetBrains开发。JetBrains作为目前广受欢迎的
    Java IDE IntelliJ的提供商,在Apache许可下已经开源其Kotlin编程语言。

  • Kotlin可以编译成Java字节码,也可以编译成Javascript,方便在没有JVM的设备上运行。

  • Kotlin已正式成为Android官方开发语言。

Kotlin官网

JetBrains这家公司非常牛逼,开发了很多著名的软件,他们在使用Java的过程中发现java比较笨重不方便,所以就开发了kotlinkotlin
一种全栈的开发语言,可以用它进行开发webweb后端、Android等。

很多开发者都说Google学什么不好,非要学苹果,出个androidswift版本,一定会搞不起来没人用,所以不用浪费时间去学习。在这里想引用马云
的一句话:

拥抱变化

Google做事,向来言出必行,之前在推行Android Studio时也是一片骂声,吐槽各种不好用,各种慢。但是现在Android Studio基本都已经普及了。
我相信Kotlin也不会例外。所以我们不仅要学,还要要认真的学。

Kotlin的特性

  • 它更加易表现:这是它最重要的优点之一。你可以编写少得多的代码。

  • Kotlin是一种兼容Java的语言

  • KotlinJava更安全,能够静态检测常见的陷阱。如:引用空指针

  • KotlinJava更简洁,通过支持variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation等实现

  • Kotlin可与Java语言无缝通信。这意味着我们可以在Kotlin代码中使用任何已有的Java库;同样的Kotlin代码还可以为Java代码所用

  • Kotlin在代码中很少需要在代码中指定类型,因为编译器可以在绝大多数情况下推断出变量或是函数返回值的类型。这样就能获得两个好处:简洁与安全

Kotlin优势

  • 全面支持Lambda表达式

  • 数据类Data classes

  • 函数字面量和内联函数Function literals & inline functions

  • 函数扩展Extension functions

  • 空安全Null safety

  • 智能转换Smart casts

  • 字符串模板String templates

  • 主构造函数Primary constructors

  • 类委托Class delegation

  • 类型推判Type inference

  • 单例Singletons

  • 声明点变量Declaration-site variance

  • 区间表达式Range expressions

上面说简洁简洁,到底简洁在哪里?这里先用一个例子开始,在Java开发过程中经常会写一些Bean类:

package com.charon.kotlinstudydemo;public class Person {   
    private int age;
    private String name;
    private float height;
    private float weight;

    public int getAge() {   
        return age;
    }

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

    public String getName() {   
        return name;
    }

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

    public float getHeight() {   
        return height;
    }

    public void setHeight(float height) {   
        this.height = height;
    }

    public float getWeight() {   
        return weight;
    }

    public void setWeight(float weight) {   
        this.weight = weight;
    }

    @Override
    public String toString() {   
        return "Person name is : " + name + " age is : " + age + " height is :"
                + height + " weight is :" + weight;
    }}

使用Kotlin:

package com.charon.kotlinstudydemo

data class Person(
        var name: String,
        var age: Int,
        var height: Float,
        var weight: Float)

这个数据类,它会自动生成所有属性和它们的访问器,以及一些有用的方法,比如toString()方法。
这里插一嘴,从上面的例子中我们可以看到对于包的声明基本是一样的,唯一不同的是kotlin中后面结束不用分号。

创建Kotlin项目

Google宣布在Android Studio 3.0版本会全面支持Kotlin,目前早就有预览版了
Android Studio Preview(个人感觉很好用,比2.3.3版本强多了)。
直接通过New Project创建就可以,与创建普通Java项目唯一不同的是要勾选Include Kotlin support的选项。

创建完成后我们看一下MainActivity的代码:

// 定义包
package com.charon.kotlinstudydemo

// 导入
import android.support.v7.app.AppCompatActivity
import android.os.Bundle

// 定义类,继承AppCompatActivity
class MainActivity : AppCompatActivity() {

    // 重写方法用overide,函数名用fun声明  参数是a: 类型的形式 ?是啥?它是指明该对象可能为null,
    // 如果有了?那在调用该方法的时候参数可以传递null进入,如果没有?传递null就会报错
    override fun onCreate(savedInstanceState: Bundle?) {
        // super 
        super.onCreate(savedInstanceState)
        // 调用方法
        setContentView(R.layout.activity_main)
    }
}

我们就从MainActivity的代码开始介绍一些基本的语法。

变量

变量可以很简单地定义成可变var(可读可写)和不可变val(只读)的变量。

valJava中使用的final很相似。一个不可变对象意味着它在实例化之后就不能再去改变它的状态了。如果你需要一个这个对象修改之后的版本,
那就会再创建一个新的对象。

声明:

var age: Int = 18
val name: String = "charon"

再提示一下:kotlin中每行代码结束不需要分号了,不要和java是的每行都带分号

字面上可以写明具体的类型。这个不是必须的,但是一个通用的Kotlin实践时省略变量的类型我们可以让编译器自己去推断出具体的类型:

var age = 18 // int
val name = "charon" // string
var height = 180.5f // flat
var weight = 70.5 // double

Kotlin中,一切都是对象。没有像Java中那样的原始基本类型。
当然,像IntegerFloat或者Boolean等类型仍然存在,但是它们全部都会作为对象存在的。基本类型的名字和它们工作方式都是与Java非常相似
的,但是有一些不同之处你可能需要考虑到:

  • 数字类型中不会自动转型。举个例子,你不能给Double变量分配一个Int。必须要做一个明确的类型转换,可以使用众多的函数之一:

      private var age = 18
      private var weight = age.toFloat()
  • 字符(Char)不能直接作为一个数字来处理。在需要时我们需要把他们转换为一个数字:

      val c: Char='c'
      val i: Int = c.toInt()
  • 位运算也有一点不同。在Android中,我们经常在flags中使用:

      // Java
      int bitwiseOr = FLAG1 | FLAG2;
      int bitwiseAnd = FLAG1 & FLAG2;


      // Kotlin
      val bitwiseOr = FLAG1 or FLAG2
      val bitwiseAnd = FLAG1 and FLAG2
  • 一个String可以像数组那样访问,并且被迭代:

      var s = "charon"
      var c = s[2]
    
      for (a in s) {
          Log.e("@@@", a +"");
      }
编译期常量

已知值的属性可以使用const修饰符标记为编译期常量(类似java中的public static final)。
const只能修复val不能修复var,这些属性需要满足以下要求:

  • 位于顶层或者是object的一个成员

  • String或原生类型值初始化

  • 没有自定义getter

// Const val are only allowed on top level or in objects
const val NAME: String = "charon"

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}
后端变量Backing Fields.

kotlingettersetter是不允许本身的局部变量的,因为属性的调用也是对get的调用,因此会产生递归,造成内存溢出。

例如:

var count = 1
var size: Int = 2
set(value) {
    Log.e("text", "count : ${count++}")
    size = if (value > 10) 15 else 0
}

这个例子中就会内存溢出。

kotlin为此提供了一种我们要说的后端变量,也就是field。编译器会检查函数体,如果使用到了它,就会生成一个后端变量,否则就不会生成。
我们在使用的时候,用field代替属性本身进行操作。

延迟初始化

我们说过,在类内声明的属性必须初始化,如果设置非null的属性,应该将此属性在构造器内进行初始化。
假如想在类内声明一个null属性,在需要时再进行初始化(最典型的就是懒汉式单例模式),与Kotlin的规则是相背的,此时我们可以声明一个属性并
延迟其初始化,此属性用lateinit修饰符修饰。

class MainActivity : AppCompatActivity() {
    lateinit var name : String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var test = MainActivity()
        // 要先调用方法让其初始化
        test.init()
        // 再使用其属性
        Log.e("@@@", test.name)
    }

    fun init() {
        // 延迟初始化
        name = "charon"
    }
}

需要注意的是,我们在使用的时候,一定要确保属性是被初始化过的,通常先调用初始化方法,否则会有异常。
如果只是用lateinit声明了,但是还没有调用初始化方法就使用,哪怕你判断了该变量是否为null也是会crash的。

private lateinit var test: String

private fun switchFragment(position: Int) {
    if (test == null) {
        LogUtil.e("@@@", "test is null")
    } else {
        LogUtil.e("@@@", "test is not null")
        check(test)
    }
}

会报kotlin.UninitializedPropertyAccessException: lateinit property test has not been initialized

除了使用lateinit外还可以使用by lazy {}效果是一样的:

private val test by lazy { "haha" }

private fun switchFragment(position: Int) {
    if (test == null) {
        LogUtil.e("@@@", "test is null")
    } else {
        LogUtil.e("@@@", "test is not null ${test}")
        check(test)
    }
}

执行结果:

test is not null haha

lateinitby lazy有什么区别呢?

  • by lazy{}只能用在val类型而lateinit只能用在var类型

  • lateinit不能用在可空的属性上和java的基本类型上,否则会报lateinit错误

类的定义:使用class关键字

类可以包含:

  • 构造函数和初始化块

  • 函数

  • 属性

  • 嵌套类和内部类

  • 对象声明

class MainActivity{

}

如果有参数的话你只需要在类名后面写上它的参数,如果这个类没有任何内容可以省略大括号:

class Person(name: String, age: Int)
创建类的实例
val person = Person("charon", 18)

上面的类有一个默认的构造函数。

注意:创建类的实例不用new了啊。

构造函数

Kotlin中的一个类可以有一个主构造函数和一个或多个次构造函数。

主构造函数

主构造函数是类头的一部分:它跟在类名(和可选的类型参数)后:

class Person constructor(name: String, surname: String) {
}

如果主构造函数没有任何注解或者可见性修饰符,可以省略constructor关键字:

class Person(name: String, surname: String) {
}

主构造函数不能包含任何的代码。初始化的代码可以放到以init关键字作为前缀的初始化块中:

class Person constructor(name: String, surname: String) {
    init {
        print("name is $name and surname is $surname")
    }
}

如果构造函数有注解或可见性修饰符,那么constructor关键字是必需的,并且这些修饰符在它前面:

class Person private @Inject constructor(name: String, surname: String) {
    init {
        print("name is $name and surname is $surname")
    }
}
次构造函数

类也可以声明前缀有constructor的次构造函数:

class Person{
    constructor(name: String) {
        print("name is $name")
    }
}

如果类有一个主构造函数,每个次构造函数都需要委托给主构造函数(不然会报错), 可以直接委托或者通过别的次构造函数间接委托。
委托到同一个类的另一个构造函数用this关键字即可:

class Person constructor(name: String) {
    constructor(name: String, surName: String) : this(name) {
        Log.d("@@@", "name is : $name surName is : $surName")
    }
}

使用该对象:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Person("charon", "chui")
    }
}

就会在logcat上打印:
09-20 16:51:19.738 6010-6010/com.charon.kotlinstudydemo D/@@@: name is : charon surName is : chui

如果一个非抽象类没有声明任何(主或次)构造函数,它会有一个生成的不带参数的主构造函数。构造函数的可见性是public
如果你不希望你的类有一个公有构造函数,你需要声明一个带有非默认可见性的空的主构造函数:

class Person private constructor(name: String) {
}

接口:使用interface关键字

interface FlyingAnimal {
    fun fly()
}

函数:通过fun关键字定义

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

如果你没有指定它的返回值,它就会返回UnitJava中的void类似,但是Unit是一个真正的对象。Unit可以省略,
你当然也可以指定任何其它的返回类型:

fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

然而如果返回的结果可以使用一个表达式计算出来,你可以不使用括号而是使用等号:

fun add(x: Int,y: Int) : Int = x + y

我们可以给参数指定一个默认值使得它们变得可选,这是非常有帮助的。这里有一个例子,在Activity中创建了一个函数用来Toast一段信息:

fun toast(message: String, length: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(this, message, length).show()
}

上面代码中第二个参数length指定了一个默认值。这意味着你调用的时候可以传入第二个值或者不传,这样可以避免你需要的重载函数:

toast("Hello")
toast("Hello", Toast.LENGTH_LONG)
自定义get set方法:

Kotlin会默认创建set get方法,我们也可以自定义get set方法:
kotlin预留了一个在setget中访问的变量field关键字:

class Person constructor() {
    var name: String = ""
        get() = field
        set(value) {
            field = "$value"
        }

    var age: Int = 0
        get() = field
        set(value) {
            field = value
        }
}

按照惯例set参数的名称是value,但是如果你喜欢你可以选择一个不同的名称。

可变长参数函数:使用vararg关键字
fun vars(vararg v:Int){
    for(vt in v){
        print(vt)
    }
}

// 测试
fun main(args: Array<String>) {
    vars(1,2,3,4,5)  // 输出12345
}

注释

Java差不多

// 这是一个行注释

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Kotlin学习教程(一)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Kotlin学习教程(一)

在5月18日谷歌在I/O开发者大会上宣布,将Kotlin语言作为安卓开发的一级编程语言。并且会在Android Studio 3.0版本全面支持Kotlin
Kotlin学习教程(一)
2024-11-04

Kotlin学习教程(二)

上一篇文章介绍了Kotlin的基本语法,我感觉在继续学习更多知识之前有必要单独介绍以下编码规范。不管学什么东西,开始形成的习惯
Kotlin学习教程(二)
2024-11-04

Kotlin学习教程(四)

数据类:使用data class定义数据类是一种非常强大的类。在Kotlin学习教程(一)中最开始的用的简洁的示例代码就是一个数据类。这里
Kotlin学习教程(四)
2024-11-04

Kotlin学习教程(五)

泛型classDataT(vart:T)interfaceDataTfunTlogic(t:T){}定义:classTypedClassT(parameter:T){valvalue:T=parameter}这个类现在可
Kotlin学习教程(五)
2024-11-04

Kotlin学习教程(三)

前面介绍了基本语法和编码规范后,接下来学习下基本类型。在Kotlin中,所有东西都是对象,在这个意义上讲我们可以在任何变量上调
Kotlin学习教程(三)
2024-11-04

kotlin 官方学习教程之基础语法详解

kotlin 官方学习教程之基础语法详解Google 在今天的举行了 I/O 大会,大会主要主要展示内有容 Android O(Android 8.0)系统、Google Assistant 语音助手、Google 智能音箱、人工智能、机器
2023-05-31

学习《简明Python教程》第一天

第一天开始学习python,我自己会坚持的……做学习笔记为自己更好的复习,所做的一切若能带给像我一样刚刚入门朋友更大的方便,我会很高兴……,如果有疏漏之处,请各位GGJJ提出指正,本人将不胜感激! 1、启动python带提示符的解释器,传统
2023-01-31

socket.io学习教程之基础介绍(一)

前言Web端与服务器间的实时数据传输的是一个很重要的需求,但最早只能通过AJAX轮询询实现。在WebSocket标准没有推出之前,AJAX轮询是唯一可行的方式(通过Flash浏览器也可以,但这里不做讨论)。AJAX轮询原理是设置定时器,定时
2022-06-04

HTML语法在线教程:一步一步学习

HTML语法在线教程:一步一步掌握网页构建的基础
HTML语法在线教程:一步一步学习
2024-03-09

socket.io学习教程之深入学习篇(三)

前言 socket.io提供了基于事件的实时双向通讯,本文深入的介绍了socket.io,下面来看看详细的内容吧。 静态文件socket.io默认情况下会通过socket.io-client包提供socket.io.min.js和socke
2022-06-04

Python 机器学习初学者教程:一步一步构建你的第一个机器学习模型

Python机器学习入门指南:从零开始创建你的第一个机器学习应用程序
Python 机器学习初学者教程:一步一步构建你的第一个机器学习模型
2024-02-14

Kotlin基础学习之位运算

什么是位运算?程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进
2023-05-30

Python学习教程(Python学习路线):Python——SciPy精讲

Python学习教程(Python学习路线):Python——SciPy精讲SciPy 是 Python 里处理科学计算 (scientific computing) 的包,使用它遇到问题可访问它的官网 (https://www.scipy
2023-06-02

Python装饰器入门学习教程(九步学习)

装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。相对于其它方式,装饰器
2022-06-04

编程热搜

  • 人工智能你要知道的那些事
    编程学习网:早在1g时代我们只能接打电话。2g时代可以打电话发短信,玩早期的qq,但网络十分不稳定。3g时代带给我们很大的改变就是宽带上网,视频通话,看视频,听歌玩游戏。那时的人们认为4g无用,认为不会有什么改变,但当4g出来时我们才发现这是一次质的飞跃。
    人工智能你要知道的那些事
  • 人工智能无人机管制到底有多难?
    编程学习网:近日,一段“重庆网红列车遭无人机撞击逼停”的视频,在网络热传。
    人工智能无人机管制到底有多难?
  • 人工智能与人类
    欢迎各位阅读本篇,人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。本篇文章讲述了人工智能与人类,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    人工智能与人类
  • 两小时 Elasticsearch 性能优化,直接把慢查询干团灭了……
    公共集群的机器负载分布不均衡的问题,业务的查询和流量不可控等各种各样的问题,要节省机器资源就一定会面对这种各种各样的问题,除非土豪式做法,每个业务都拥有自己的机器资源,这里面有很多很多颇具技术挑战的事情。
    两小时 Elasticsearch 性能优化,直接把慢查询干团灭了……
  • 关于OpenStack的架构详细讲解
    欢迎各位阅读本篇文章,OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。本篇文章讲述了关于OpenStack的架构详细讲解,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    关于OpenStack的架构详细讲解
  • AI &神经网络
    欢迎各位阅读本篇,本篇文章讲述了AI &神经网络,人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。神经网络内容丰富,反映了当前国内外该领域的最新研究成果和动向,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    AI &神经网络
  • 人工智能对于网络安全的优缺点
    编程学习网:如今,产生的数据比以往任何时候都要多。由于数据分析工具的发展,各行各业的组织都更加重视大数据的收集和存储。
    人工智能对于网络安全的优缺点
  • Bash 初学者系列 7:bash 中的条件语句(if else)
    今天我们介绍一下如何在 bash 中使用条件语句。
    Bash 初学者系列 7:bash 中的条件语句(if else)
  • 人工智能机器学习的重要趋势是什么?
    编程学习网:在竞争日益激烈的技术市场中,从高科技初创公司到全球跨国公司都将人工智能视为关键竞争优势。但是,人工智能行业发展如此之快,以至于很难跟踪最新的研究突破和成就,甚至很难应用科学成果来实现业务成果。
    人工智能机器学习的重要趋势是什么?
  • 人工智能为什么会觉得Matplotlib用起来困难?
    编程学习网:Matplotlib是一个流行的Python库,可以很容易地用于创建数据可视化。
    人工智能为什么会觉得Matplotlib用起来困难?

目录