Kotlin核心技术详解视频课程

独家

下载课程

下载学院APP

缓存视频离线看

收藏(62)

Kotlin核心技术详解视频课程

适用人群: 最好有一定的Java编程语言基础;没有基础也没有关系,兴趣是最好的老师!

共130课时 共14小时2分钟 更新时间:2017-10-22

价  格

¥58

优惠活动

会员95折

2424小时内答疑

课时永久观看

相关专题

微职位学习

    课程介绍

    课程大纲

    学习资料

    学员评价

    课程目标
    帮助各位朋友快速入门Kotlin编程语言!
    适用人群
    最好有一定的Java编程语言基础;没有基础也没有关系,兴趣是最好的老师!
    课程简介
    • 说在前面的话

      在刚刚结束的2017年Google IO大会上,Google宣布了一个令人振奋的消息:编程语言Kotlin成为了Android的官方开发语言!这意味着,Java将会逐渐被Kotlin取代,就像Apple推出了编程语言Swift以取代Objective-C一样!

    • 在Windows操作系统中安装和配置Kotlin

      1. 下载、安装和配置JDK 2. 下载并配置Kotlin编译器

    • 在MacOS或Linux操作系统中安装和配置Kotlin

      1.下载、安装和配置JDK 2.下载并配置Kotlin编译器

    • 在文本编辑器中编写Kotlin的HelloWorld

      fun main(args: Array) {     println("Hello, World")}

    • 在命令行中运行Kotlin的HelloWorld

      kotlinc KotlinHelloWorld.kt -include-runtime -d KotlinHelloWorld.jarjava -jar KotlinHelloWorld.jar

    • 在IntelliJ IDEA中编写并运行Kotlin的HelloWorld

      IntelliJ IDEA和Kotlin都是JetBrains出品,所以IntelliJ IDEA是首选的IDE

    • 在Eclipse中编写并运行Kotlin的HelloWorld

      1. 下载并安装Eclipse2. 安装Kotlin插件3. 创建Kotlin Project4. 添加Kotlin源文件5. 运行Kotlin应用程序

    • REPL交互式shell和在线的Playground

      REPL交互式shell和在线的Playground可以快速验证小的Kotlin代码片段

    • 使用Kotlin开发Android App初探

      Android Studio 3.0测试版已经集成了Kotlin插件;使用插件Kotlin Android Extensions可以简化Android App的开发

    • 先来领略一下Kotlin

      通过编写Kotlin的示例代码,感受Kotlin一些有趣的特性:Data Class、Nullable Type、String Template、Lambda Expression、Elvis Operator

    • Kotlin的主要特征之目标平台

      目标平台:服务器端、Android、任何Java运行的地方;可以使用Intel的多操作系统引擎在iOS设备上运行Kotlin代码;可以使用Kotlin、TornadoFX和JavaFX来编写桌面应用程序;可以被编译成JavaScript,从而在浏览器中运行Kotlin代码;对于支持特定领域或编程范式的类库,Kotlin与其进行了很好的集成

    • Kotlin的主要特征之静态类型

      程序中每个表达式的类型在编译期间都是清楚明确的;与基于JVM的其它动态类型的编程语言是不同的,比如:Groovy和JRuby;与Java相比,Kotlin并不需要你在代码中显式指定每个变量的数据类型;静态类型的编程语言的优点体现在:性能、可靠性、可维护性、工具支持;nullable类型可以让你...

    • Kotlin的主要特征之函数式编程

      函数式编程的核心概念:一级函数、不变性、没有副作用;函数式编程可以让你可以获得的好处:代码的简洁、安全的多线程、更容易的测试;Kotlin从一开始就提供了丰富的特性以支持函数式编程

    • Kotlin的主要特征之免费开源

      2012年,JetBrains开源了Kotlin相关源代码;可以在Github上找到:https://github.com/JetBrains/kotlin;在Apache 2 license下是可用的;三个开源的集成开发环境:IntelliJ IDEA、Android Studio和Eclipse

    • Kotlin在Android平台的开发简介

      一个典型的移动应用程序与一个典型的企业级应用程序是有很大不同的;Kotlin的语言特性,加上支持Android框架的特殊编译器插件,使得Android开发更有生产力,更加让人愉悦;使用Kotlin进行开发的另外一大优势是可以提高应用程序的可靠性;Kotlin完全兼容Java 6,因此你在使用Kotlin的...

    • Kotlin在服务器端的开发简介

      服务器端编程至少包含:向浏览器返回HTML页面的Web应用程序、通过HTTP对外提供JSON API的移动应用程序后台、通过RPC协议与其它微服务通讯的微服务;Java编程语言已经用于开发这些应用程序很多年了;Kotlin的最大优势就是与既有Java代码的无缝集成;Kotlin使得开发这些系统的新技术应...

    • Kotlin的设计哲学之实用

      Kotlin是一门实践型的编程语言,当初设计这门编程语言的其中一个目的就是为了解决现实世界中遇到的问题;Kotlin也不是一个用于科学研究的编程语言;Kotlin并没有强迫我们使用特定的编程风格或范式;体现Kotlin实用性的另外一点是它对工具非常关注;对IDE的支持在很大程度上可以帮助我...

    • Kotlin的设计哲学之简洁

      代码越简单越简洁,你理解这些代码花费的时间就越少;选择哪种编程语言以及所选择编程语言的简洁性也是非常重要的;Kotlin提供了丰富的标准类库,通过调用类库中的方法,可以让我们替换掉那些冗长的、重复性的代码;Kotlin对lambda的支持可以让我们很轻松地把一些小的代码块传递给库函数

    • Kotlin的设计哲学之安全

      当我们说一门编程语言是安全的时候,我们其实是说,这门编程语言的设计可以预防程序中某些错误的发生;没有编程语言可以预防程序中所有可能的错误;JetBrains设计Kotlin的时候,努力让Kotlin达到比Java更高的安全级别,同时花费更小的成本开销;JVM已经提供了很多安全保证;很多错误...

    • Kotlin的设计哲学之可互操作

      可以在项目中的任何地方混合使用Java和Kotlin代码;体现Kotlin互操作性的另外一点是Kotlin以最大可能的程度使用既有的Java类库;对于跨语言的项目,Kotlin的相关工具也提供了足够的支持;完全可以使用既有的类库

    • 变量的声明和初始化

      变量相当于房间,变量名相当于房间号;变量中存储的数据相当于房间中的房客,变量中存储的数据的类型相当于房间中房客的类型;在Kotlin中声明变量可以省略变量的数据类型;如果没有指定变量的类型,编译器会分析等号右边的初始化表达式,并用其类型作为变量的类型

    • 可变变量和不可变变量

      当声明一个变量的时候,有两个关键字可以使用:val、var;默认情况下,应该使用关键字val声明所有变量,仅仅在某些必要的情况下才使用关键字var声明变量;可以通过条件判断语句,在不同的条件下为val变量初始化不同的值;使用关键字val声明的变量是不可变的,指的是变量所指向的引用...

    • 函数

      函数就是执行特定任务以完成特定功能的一段代码;函数就是个黑匣子,接收输入(参数),然后执行特定任务以完成特定功能,最后产生输出(返回值);Kotlin语言已经定义了很多函数,可以供我们在程序中通过函数名直接调用;通过在花括号前面添加冒号和类型来指定返回值的类型

    • 语句和表达式

      在Kotlin中,if是一个表达式,不是一个语句;表达式有返回值,语句不返回任何值;在Kotlin中,绝大多数的控制结构都是表达式,除了一些loops循环;Kotlin通过把控制结构和表达式组合在一起,让我们可以非常简洁地表达很多常见的模式;Java中的赋值是表达式,而在Kotlin中,赋值变成了...

    • 函数的简化

      函数的函数体中只包含一行语句,并且返回一个表达式,可以将这个表达式作为这个函数的函数体,并且省略掉return关键字和花括号;代码块函数体是把函数的函数体写在花括号中;表达式函数体是把一个表达式直接赋值给一个函数;每个变量和表达式都有明确的类型,每个函数都有明确的返回...

    • 字符串模板

      字符串中可以通过占位符的形式进行插值字符串中可以通过占位符的形式进行插值;如果需要在字符串中包含字符$,可以对其进行转义;当占位符是表达式时,需要用花括号把表达式括起来;可以在双引号中嵌套双引号,只要被嵌套的双引号在花括号的表达式中

    • 类和对象的关系

      对象是对问题领域中事物的抽象;对象的特征:世间万物皆对象、每个对象都是唯一的、对象具有属性和行为、对象具有状态、对象都属于某个类,每个对象都是某个类的实例

    • 声明类的基本语法

      Kotlin在面向对象编程领域的相关概念与Java是非常相似的,但是编写更少的代码就可以完成一些常见的任务;在Java中,构造方法的方法体经常包含完全重复的代码;只包含数据不包含代码的类,经常被称为值对象;转换前Java代码中的public修饰符,在转换后的Kotlin代码中消失了;在Kotlin...

    • 属性(上)

      在Kotlin中,属性是一级的语言特性,属性完全替代了字段和访问器方法;使用关键字val声明的属性是只读的,使用关键字var声明的属性是可读写的;当声明一个属性的时候,我们也隐式声明了相应的访问器;getter和setter的命名规则,有一种情况是例外的

    • 属性(下)

      Java中的getter在Kotlin中作为val属性进行访问;Java中的getter/setter对在Kotlin中作为var属性进行访问

    • 自定义属性访问器

      有时可能不需要一个单独的字段来存储属性的值;每次访问属性时,它的值都会被计算出来;如果描述类的特性,我们应该将其声明为属性

    • Kotlin源代码的布局之目录和包

      Kotlin也有包的概念,与Java是类似的;每个Kotlin文件的开头都有一个package语句;定义在文件中的所有声明,包括类、函数和属性,都放在包里;可以直接使用同一个包内定义在其它文件中的声明;如果在不同的包中,就需要导入这些声明;和Java一样,Kotlin的导入语句放在文件的开头,使...

    • 声明枚举类

      枚举就是将有限的可能取值一一列举出来,从而只限于从列举出来的范围内取值;在Kotlin中,声明枚举用enum和class两个关键字;在Kotlin中,enum是所谓的软关键字,当它写在关键字class前面时,它就有了特殊的含义;枚举类并不仅仅是值的列表,我们可以在枚举类里声明属性和方法;在创...

    • 使用when处理枚举类(上)

      在Kotlin中,使用when结构来替换Java中的switch结构,而且比switch结构的功能更强大,使用更广泛;与if相同,when也是一个表达式,具有返回值;与Java不同的是,我们无须在when结构的每个分支中添加break语句

    • 使用when处理枚举类(下)

      可以把多个值组合到一个分支中,多个值之间使用逗号进行分隔;可以导入枚举类的常量值来简化代码

    • 在when分支中使用不同的对象

      Java中的switch要求使用常量作为分支条件,这些常量包括枚举常量、字符串、或数字常量;Kotlin中的when允许任何对象作为分支条件;允许使用任何表达式作为when结构的分支条件,让我们可以写出简洁漂亮的代码

    • 使用不带参数的when结构

      如果when表达式没有指定任何参数,那么分支条件可以是任何的布尔表达式;代码的可读性虽然变差了,但是为了提高程序的性能,我们不得不要付出一些代价

    • 智能类型转换

      在Kotlin中,我们使用is来检查一个变量是否是某个指定的类型;如果我们检查一个变量是否是某个指定的类型,我们不必在检查之后对变量进行转换;我们可以把变量当做我们要检查的类型进行使用;实际上,编译器为我们进行了转换,我们将其称之为智能类型转换;在IDE中,智能类型转换的值...

    • 重构之使用when替换if

      在if分支中,如果仅仅有一个表达式,那么花括号是可选的;如果if分支是一个代码块,最后一个表达式将作为返回结果;when表达式并不局限于检查值的相等性,还可以检查参数值的类型

    • 使用代码块作为if和when结构的分支

      if和when结构都可以使用代码块作为分支,代码块中的最后一个表达式将作为返回结果;对于使用代码块并且需要返回结果的所有情况,都遵守一条规则:代码块中的最后一个表达式作为返回结果;对于代码块函数体的函数,必须在代码块中显式使用return语句

    • while循环

      Kotlin的while循环与Java完全一样;Kotlin也有while和do-while两种形式的循环,而且语法也与Java完全一样

    • 使用for-in循环遍历范围

      Kotlin没有Java中的for循环,取而代之的是for-in循环;一个范围本质上就是两个值之间的一个区间;如果我们可以遍历一个范围的所有值,那么这样的范围称为连续;如果我们想要遍历半闭半开的区间,可以使用util

    • 使用for-in循环遍历map

      创建范围的语法不仅适用于数值,而且适用于字符;在for-in语句中引入两个变量,一个存储key,一个存储value

    • 使用in判断是否属于集合或范围

      可以使用运算符in来检查是否某个值在指定的范围内,也可以使用!in来检查某个值是否不在指定的范围内;在when表达式中也可以使用in和!in;只要某个类实现了java.lang.Comparable接口,我们就可以创建这种类型的对象的范围;可以使用运算符in来检查是否某个值在指定的集合内,也可以使...

    • 异常处理概述

      Kotlin的异常处理机制与Java和其它编程语言的异常处理机制非常相似;当我们创建异常的实例时,无须使用new关键字;与Java不同的是,Kotlin中的throw是一个表达式

    • try-catch-finally

      和Java相同,Kotlin使用try结构及catch和finally子句处理异常;与Java最大的不同在于,Kotlin中没有throws语句;Kotlin并不区分检查异常和非检查异常;无需指定一个函数可能会抛出的异常,甚至可能会无需处理任何异常

    • try-catch可以作为表达式

      与if和when相同,try和catch都可以作为表达式;如果语句体中包含多个表达式,那么最后一个表达式的值将作为try或catch表达式的值;必须得把try或catch语句体用花括号括起来

    • 在Kotlin中创建集合

      Kotlin使用了标准的Java集合类,也就是说,Kotlin并没有自己的集合类;用标准的Java集合可以更加容易地与Java代码进行交互;尽管Kotlin与Java有完全相同的集合类,但是在Kotlin中我们可以对集合做更多的事情

    • 自定义函数以打印集合中的所有元素

      如何将集合中的内容都打印出来呢;Java集合有一个默认的toString实现,但是输出的格式是固定的,很多时候并不能满足我们的需要;Java中的实现方式是使用第三方的类库,比如:Guava、Apache Commons,或者在项目中重新实现需要的逻辑;在Kotlin中,标准类库中提供了一个函数,可以实...

    • 函数调用时的命名参数

      当调用Kotlin中的函数时,我们可以指定一些参数的名字;如果我们在调用时指定了其中一个参数的名字,那么我们也要指定其后面所有参数的名字以避免混淆;最好使用Rename或Change Signature这个action,而不是手动地对参数名进行编辑;当调用Java中的方法时,不能使用命名参数

    • 函数声明时的默认参数值

      Java中一个常见的问题:在一些类中有过多的重载方法;不管什么原因,最终的结果是一样的:很多代码都是重复的,参数名和参数类型一遍又一遍的重复;在Kotlin中,很多情况下,我们都可以避免创建过多的重载方法,因为我们可以在函数声明时为参数指定默认值;当使用普通的函数调用语法...

    • 去除静态的实用类之顶层函数

      Java作为一门面向对象的编程语言,需要把所有的代码都写在类的方法里;任何大型项目都包含着很难为其找到归属类的大量代码;通常的解决方案是,定义一些不包含任何状态和实例方法的类,其中包含了大量的静态方法;在Kotlin中,不必再创建这些无用的类,可以直接把函数作为源文件的最...

    • 去除静态的实用类之顶层属性

      与函数相同,属性也可以放在Kotlin源文件的最顶层;这种属性的值将被存储在一个静态字段里;就像其它属性一样,顶层属性会作为访问器方法暴露给Java代码;如果我们想要对Java代码暴露一个public static final的字段,可以使用const修饰符进行标记

    • 扩展函数的概述

      扩展函数就是一个函数,这个函数是被扩展的类的成员,因此可以被调用,但是定义在被扩展的类的外部;要被添加扩展函数的那个类型就是接受者类型,接受者类型的实例就是接受者对象;只要这个类被编译成Java class文件,我们就可以对这个类添加我们自己的扩展;在扩展函数的函数体中,...

    • 导入和扩展函数

      当我们定义一个扩展函数时,这个扩展函数并不会在整个项目自动变为可用的;就像其它类或函数一样,扩展函数需要被导入;导入扩展函数的语法与前面讲过的导入其它类或函数的语法是一样的;使用*进行导入也是可以的;可以使用as关键字改变我们要导入的类或函数的名字;对于普通的类或函...

    • 在Java中调用扩展函数

      在Kotlin的系统底层,一个扩展函数就是一个静态方法,这个静态方法的第一个参数是接收者对象;在Java代码中调用Kotlin中的扩展函数是相当容易的:我们调用扩展函数对应的静态方法,并且把接受者对象实例传递过去;与其它的顶层函数一样,包含扩展函数的Java类的名字,是由Kotlin中声...

    • 实用函数作为扩展

      继续重构前面课程中的joinToString函数,重构完之后你会发现,这几乎就是Kotlin标准库里的写法;为Collection这个类添加了扩展函数,并且为所有的参数提供了默认值;除了把一个泛型类型作为接受者类型,我们还可以把一个更加具体的类型作为接收者类型

    • 扩展函数不能被重写

      Kotlin中的方法重写与成员函数是一样的,但是不能重写扩展函数;到底是调用父类中的扩展函数还是子类中的扩展函数,这依赖于变量声明时的静态类型,而不是依赖于存储在变量中的值的运行时类型;扩展函数会被编译为Java中的静态函数,并且接受者对象会作为静态函数的第一个参数;如果...

    • 扩展属性

      除了为类添加扩展函数,还可以为类通过API添加扩展属性;在访问扩展属性的API时,是通过属性语法,而不是通过函数语法;尽管我们称之为属性,但是扩展属性不能有任何状态,因为没有任何合适的空间来存储扩展属性;与扩展函数一样,扩展属性看上去就是一个普通的属性,在属性名前面添...

    • 扩展Java集合API

      Kotlin中的集合类与Java中的集合类是相同的,但是,Kotlin添加了很多扩展的API;Kotlin中集合类的实例可以做很多Java中集合类的实例所不能做的事情,因为添加了很多扩展函数;IDE的代码完成功能会把某种类型的对象的所有可能的可用函数以列表的形式给我们列出来;标准类库的引用将所...

    • 可变参数的函数

      Kotlin的可变参数与Java是相似的,但是在语法上有一些不同;Java中的语法是在类型之后添加三个点,Kotlin中的语法是在参数之前添加修饰符vararg;当我们需要传递的参数已经打包在一个数组时,调用函数的语法是不同的;在Kotlin中,我们要显式地对数组进行解包,以便数组中的每个元素...

    • 中缀调用和分解声明

      mapOf函数中的to并不是一个内置的结构,而是一种特殊的方法调用,称之为中缀调用;在中缀调用中,方法名放在目标对象名和参数之间,没有其它分隔符;中缀调用可以用于只有一个参数的普通方法和扩展函数;如果想使用中缀标记调用某个函数,那么必须用修改符modifier对这个函数进行标记...

    • 劈分字符串

      Kotlin中的字符串与Java中的字符串是完全相同的;可以把Kotlin代码创建的字符串传给任何Java方法,并且对于Java代码中传过来的字符串,可以使用任何Kotlin的标准库方法;Kotlin提供了很多有用的扩展函数,可以让我们轻松地操作标准的Java字符串;Kotlin隐藏了很多让人感到困惑的方法...

    • 正则表达式和三个引号的字符串

      Kotlin的标准库中提供了相关函数用于得到指定的分隔符第一次(或最后一次)出现之前(或之后)的子串;即便没有使用正则表达式,Kotlin也可以很轻松地对字符串进行解析;虽然正则表达式的功能很强大,但是有时候不好理解;如果我们想用正则表达式对文件的全路径进行解析,Kotlin的标...

    • 多行三个引号的字符串

      三个引号的字符串可以包含任何字符,包括换行;多行字符串包含三个引号之间的所有字符,包括用于格式化代码的缩进;为了把缩进去掉,我们在字符串的内容上添加了一个前缀,用于标记左边空白的结束位置,然后调用函数trimMargin把每行的前缀及其前面的空格都删掉;三个引号的字符串可...

    • 局部函数和扩展(上)

      当我们使用Java编写代码的时候,并不能总是很好地遵守DRY;在Kotlin中,我们可以把提取出来的函数嵌套在这些代码之前所在的函数内

    • 局部函数和扩展(下)

      扩展函数也可以被声明为局部函数;通常情况下,不推荐使用嵌套层数超过一层的局部函数

    • Kotlin中的接口(上)

      Kotlin中的接口与Java8中的接口是非常相似的,它们都可以包含抽象方法的定义和非抽象方法的实现(与Java8中的默认方法是相似的),但是它们都不能包含任何状态;Kotlin在类名之后使用冒号来替换Java中的extends和implements关键字;与Java一样,一个类可以实现多个接口,但是只能继承...

    • Kotlin中的接口(下)

      在设计Kotlin1.0的时候,它与Java6是完全兼容的,而Java6并不支持接口中的默认方法;Kotlin会把包含默认方法的接口编译为一个组合,这个组合由两部分组成;如果我们需要在Java类中实现包含默认方法的接口,我们必须要自定义所有方法的实现,包括Kotlin中有默认实现的方法

    • 修饰符open、final和abstract

      如果对基类的修改会导致子类行为的异常,那么所谓的易碎基类问题就发生了,因为基类中修改的代码不再匹配子类中的假设;对继承进行设计并且编写文档,或者禁止继承;Kotlin的类和方法默认是final的;如果我们想要创建一个类的子类,需要使用open修饰符对这个类进行标记;此外,我们需...

    • 可见性修饰符

      可见性修饰符可以对我们代码中的声明进行访问控制;Kotlin中的可见性修饰符与Java中的可见性修饰符是相似的,它们都有public、protected和private修饰符;Kotlin与Java的默认的可见性是不同的,如果我们省略了修饰符,那么默认的声明时public的;Java中的默认可见性package-private在...

    • Kotlin的可见性修饰符与Java

      当编译为Java字节码的时候,Kotlin中的public、protected和private修饰符是被保留的;在底层private类被编译为package-priate的声明;在Java字节码中,internal修饰符会被编译为public的;一个类的internal成员的名字不能在Java代码中使用

    • 内部类和嵌套类

      正如在Java中一样,在Kotlin中我们可以在另外一个类中声明一个类;与Java的不同之处在于,Kotlin的嵌套类不能访问外部类的实例,除非特别指定要对其进行访问;如果没有为Kotlin中的嵌套类显式地添加修饰符,就相当于Java中的static嵌套类;如果想把嵌套类转换成内部类,以便内部类可...

    • 密封类

      当我们使用when结构计算一个表达式的时候,Kotlin编译器强制我们检查默认的选项;总是必须要添加一个默认的分支是不太方便的。更重要的是,如果我们添加一个新的子类,编译器不会检测到新的子类被添加了;Kotlin提供了这个问题的解决方案,那就是sealed类;使用sealed修饰符对父类进...

    • 类的初始化之主要构造器和初始化代码块(上)

      Kotlin中的构造器分为主要构造器和次要构造器;主要构造器通常以主要、简洁的方式来初始化一个类,并且声明在类的代码体的外部;次要构造器声明在类的代码体的内部;可以在初始化代码块中添加额外的初始化逻辑;主要构造器有两个作用:一是指定构造器参数,二是定义通过构造器参数进...

    • 类的初始化之主要构造器和初始化代码块(下)

      可以为构造器参数声明默认值,就像为函数参数声明默认值一样;当创建类的实例时,我们可以直接调用构造器,不需要使用new关键字;如果所有的构造器参数都指定了默认值,那么编译器会生成一个额外的构造器,这个构造器会使用所有的默认值并且没有参数;如果某个类有一个父类,那么这个...

    • 类的初始化之次要构造器

      通常而言,Kotlin中具有多个构造器的类比Java中要少得多;在大多数情况下,在Java中可能需要多个重载的构造器,在Kotlin中的替代解决方案是:默认的参数值和命名的参数语法;仍然存在需要多个构造器的情况。最常见的情况是,我们需要扩展一个框架类,这个框架类以不同的方式提供了多...

    • 实现在接口中声明的属性

      在Kotlin中,接口可以包含抽象的属性声明;接口本身并不包含任何状态,仅仅是实现了接口的类在需要的情况下可以存储属性的值;除了抽象的属性声明,接口中还可以包含具有getter和setter的属性,只要它们没有引用后备字段;与接口中实现的属性不同,在类中实现的属性拥有对后备字段的完全访问

    • 在getter或setter中访问后备字段

      两种属性:一种是用于存储值的属性;另一种是有自定义的访问器,并且在每次访问时都要计算值的属性;如何将这两种属性组合在一起以实现一个属性,这个属性可以存储值,并且可以提供额外的逻辑,当对值进行访问或修改时就会执行额外的逻辑;为了实现我们的需求,我们需要在访问器中能...

    • 改变访问器的可见性

      默认情况下,访问器的可见性与属性的可见性是相同的;如果需要的话,我们可以改变访问器的可见性,只需要在get或set关键字前面添加一个可见性修饰符就可以了;在后面的课程中,我们会继续讨论属性

    • 通用的对象方法之toString

      Kotlin编译器帮我们做了很多工作;正如Java一样,Kotlin中的所有类都提供了一种方式来获得类对象的字符串表示;默认情况下,一个对象的字符串表示看上去像是Client@5e9f23b4,好像不是那么有用;为了改变对象的默认字符串表示方式,我们需要重写toString方法

    • 通用的对象方法之equals

      在Kotlin中,==用于检查两个对象是否是相等的,而不是两个对象的引用,这会被编译为调用equals方法;在Java中,我们可以使用==运算符来比较原始数据类型和引用类型;在Java中,众所周知的最佳实践是总是调用equals,同时,经常会遇到的众所周知的问题是忘记了总是调用equals方法;在K...

    • 通用的对象方法之hashCode

      hashCode方法应该总是与equals方法一起被重写;hashCode方法的普遍约定:如果两个对象是相等的,它们必须具有相同的hash ;Hashset以一种优化的方式来比较其中的值:首先比较hash code,当且仅当hash code相等时,再比较实际的值;有很多代码是我们不得不要编写的,幸运的是,Kotl...

    • 数据类之自动生成通用方法的实现

      如果我们想让我们的类成为一个方便的数据容器,我们需要重写三个通用的对象方法:toString、equals和hashCode;像IntelliJ IDEA这样的IDE都会帮助我们自动生成并验证是否正确一致地实现了这三个方法;在Kotlin中,我们无须生成这三个方法。如果我们对类添加了修饰符data,编译器会为...

    • 数据类和不可变性之copy方法

      尽管数据类的属性不必非得是val的,我们也可以使用var,但是我们强烈推荐只使用只读的属性,从而使得数据类的实例是不可变的;在HashMap或相似的容器中,如果我们想要将数据类的实例作为键,就需要让数据类的实例成为不可变的,否则,在数据类的实例被添加到容器之后,如果作为键的该...

    • 类代理(上)

      在设计大型的面向对象系统时经常遇到的一个问题是实现继承导致的易碎性;默认情况下,Kotlin中的类是final的;在很多情况下,我们都需要对另一个类添加一些行为,即便这个类并不是设计用来被继承的;实现这种需求的一种通用方式被称为装饰器设计模式;这种方法的一个缺点是,需要大量...

    • 类代理(下)

      重构之后,类中所有的方法实现都不存在了 ;Kotlin编译器会自动生成这些方法,并且提供与DelegatingCollection类相似的方法实现;当我们需要改变某些方法的行为时,我们可以重写这些方法,这样,就会调用我们重写的方法,而不是编译器自动生成的方法;对于那些我们比较满意的默认方...

    • 对象声明(上)

      在Kotlin中,很多情况下,都要使用object这个关键字;这些情况都有相同的核心理念,那就是:object关键字定义了一个类并且同时创建了该类的一个实例;先来了解一下使用object关键字的几种不同场景;在设计面向对象的系统时,一个相当普遍的场景是:我们只需要某个类的一个实例;在Jav...

    • 对象声明(下)

      对象声明也可以继承类和实现接口;可以在任何使用普通对象的地方使用单例对象;也可以在一个类中声明对象,这样的对象也只有单个实例,每个外部类的实例并不会对应一个独立的对象实例;为了在Java代码中使用Kotlin代码中声明的对象,我们可以访问静态的INSTANCE字段

    • 伙伴对象(上)

      Kotlin中的类不能有静态成员;Java的static关键字并不是Kotlin语言的一部分;为了实现Kotlin中的static功能,Kotlin是通过包级的函数和对象声明;在大多数情况下,我们推荐使用顶层函数,但是顶层函数不能访问类的private成员;我们需要编写一个函数,该函数可以不通过类实例进行调用...

    • 伙伴对象(下)

      还记得在前面的课程中我们提到过调用private构造器的好地方吗?那就是companion object;companion object可以访问类中的所有private成员,包括private构造器;companion object是实现工厂模式的极好选择;通过工厂方法创建User实例,而不是通过多个构造器;工厂方法是非常有用的...

    • 伙伴对象作为普通对象(上)

      companion object就是声明在类中的一个普通object;companion object可以被命名,可以实现一个接口,可以有扩展函数和扩展属性;如果需要的话,我们可以指定companion object的名字;如果我们省略了companion object的名字,系统分配的默认名字是Companion;可以直接使用外部类的...

    • 伙伴对象作为普通对象(下 )

      如果我们需要定义一些函数,这些函数可以被类本身所调用,就像是companion object中的方法或是Java中的静态方法,我们该怎么办呢?;如果类中定义了companion object,那么可以通过定义扩展函数来实现;如何使用系统提供的默认名字Companion来引用类中声明的、没有显式命名的compan...

    • 对象表达式

      object关键字不仅可以用于声明命名的、类似单例的对象,而且可以用于声明匿名对象;匿名对象可以作为Java中匿名内部类的替代实现方案;除了省略了对象的名字之外,声明匿名对象的语法与对象声明的语法是一样的;对象表达式声明了一个类并且创建了该类的一个实例,但是并没有为该类或...

    • lambdas简介

      lambda表达式或lambdas,本质上都是小的代码块,这些代码块可以被传给其它函数;通过lambdas,我们可以轻松地将通用的代码结构提取为库函数,Kotlin标准库就大量使用了lambdas;lambdas的最常见用法之一就是用于集合;lambdas可以被用于Java库,即便那些Java库最初设计的时候并没有考...

    • lambdas和集合

      良好编码风格的主要原则之一就是避免出现重复的代码;大多数对集合的操作都遵循一些通用的模式,因此实现这些操作的代码应该放在类库中;如果没有lambdas的话,很难提供一个良好、方便的类库来实现集合的相关操作;如果一个lambda仅仅对一个函数或属性进行代理,那么这个labmda可以被...

    • lambda表达式(上)

      可以独立地声明lambda并将其存储在变量中;在绝大多数情况下,当把lambda传递给函数时是直接声明lambda的;声明lambda表达式的语法;Kotlin中的lambda表达式总是放在花括号中;参数列表并没有放在小括号中;参数列表和lambda的代码体使用箭头进行分隔;可以将lambda表达式存储在变量...

    • lambda表达式(中)

      回到前面课程中编写的示例程序,在一个Person列表中查找年龄最大的那个Person;重写这个示例程序,不适用任何语法缩写形式;花括号中的代码是一个lambda表达式,我们把这个lambda表达式作为参数传递给函数;在Kotlin中,如果lambda表达式是函数调用中的最后一个参数,那么该lambda表...

    • lambda表达式(下)

      joinToString这个函数已经被定义在了Kotlin标准库中,所不同的是,标准库中的joinToString函数接收一个函数作为额外的参数;对于局部变量,如果lambda参数的类型可以被推断出来,那么我们无需显示地指定lambda参数的类型;对于maxBy函数,其参数类型总是与集合元素的类型是相同的;编...

    • 访问作用域中的变量

      如果我们在函数中使用lambda,我们可以访问函数的参数以及在lambda之前声明的本地变量;forEach是最基本的集合操作函数之一;该函数所做的事情就是在集合中的每个元素上调用给定的lambda;Kotlin和Java的主要不同之一在于:在Kotlin中,并不限制访问final变量;也可以在lambda中修改...

    • 成员引用

      如果我们想要作为参数进行传递的代码已经被定义为函数了,该怎么办呢?;我们可以传递一个调用该函数的lambda,但是这样做会有些冗余。我们可以直接传递函数吗?;在Kotlin中,就像在Java8中一样,如果我们把函数转化成一个值,我们就可以直接传递函数;使用两个冒号的::运算符进行转...

    • 集合的函数式API之filter和map

      当我们操作集合时,函数式风格提供了很多好处;filter和map这两个函数是操作集合的基本函数;filter函数会遍历集合,过滤出那些能使给定的lambda返回true的元素;filter函数可以从集合中删除不想要的元素,但是不能改变元素的值;map函数把给定的函数应用到集合中的每个元素,并且将...

    • all、any、count和find

      如果我们想要检查是否集合中的所有元素都满足某个假设条件,那就调用all函数;如果我们想要检查是否集合至少存在一个元素满足某个假设条件,那就调用any函数;!all加上一个假设条件,可以被替换为any加上该假设条件的取反;!any加上一个假设条件,可以被替换为all加上该假设条件的取...

    • groupBy

      我们可能需要将集合中的所有元素根据某个条件分成不同的组;可以方便地把分组条件直接作为参数。groupBy这个函数可以帮助我们实现这个需求;groupBy函数的返回结果是一个map,其key是分组条件,其value是该组所有元素组成的列表;对于返回的map,我们可以调用mapKeys和mapValues做进一步的操作

    • flatMap和flatten

      flatMap函数做了两件事:根据作为参数的函数,将每个元素都映射为一个集合;相当于先根据参数调用map函数;将所有的列表扁平化为一个;相当于再调用flatten函数;当我们处理元素集合的集合,并且想要将其组合成一个时,就可以考虑调用flatMap函数;如果我们不需要对元素进行转换或映...

    • 序列简介

      对集合函数进行链式调用的例子,比如map和filter函数。这些函数都会立即创建一个中间的集合,也就是说,每一步函数调用的中间结果都被存储在一个临时的列表中。序列就给我们提供了一种执行这些操作的替代方案,可以避免创建中间的临时对象。为了让链式调用的效率更高,可以对操作...

    • 序列的中间操作和末端操作(上)

      在序列上执行的操作可以分为两类,一类是中间操作,一类是末端操作。中间操作返回的是另外一个序列,这个序列知道如何对原始序列中的元素进行转换。末端操作返回的是一个结果,这个结果可能是一个集合,可能是一个元素,可能是一个数字,也可能是从初始集合的变换序列中获得的任何...

    • 序列的中间操作和末端操作(下)

      在集合上执行操作的顺序也可能会对性能产生影响。假设我们有一个people的集合,我们想要打印那些长度小于特定限制的人名。Java 8中的流与Kotlin中的序列是完全相同的概念。Java 8中的流并不支持那些基于Java老版本的平台,比如Android。可以基于Java的目标版本和特定需求在流和序列之中进行选择。

    • 创建序列

      另外一种创建序列的方式是调用generateSequence函数。对于给定的序列中的前一个元素,generateSequence函数会计算序列中的下一个元素。通过调用generateSequence函数计算100以内的所有自然数的和。另外一种常见的用例是父序列。如果一个元素的父元素和它有相同的类型,我们可能会对...

    • 使用Java函数式接口

      我们用到的绝大多数API可能是用Java编写的而不是用Kotlin编写的。好消息是Kotlin中的lambda可以与Java API进行无缝地操作。这种方式可以工作的原因是OnClickListener接口只有一个抽象方法。这样的接口被称为函数式接口,或SAM接口,其中,SAM表示单个抽象方法。当调用以函数式接...

    • 把lambda作为参数传给Java方法

      可以把lambda传给任何期望函数式接口的Java方法。当我们说“一个Runnable的实例”的时候,我们指的是“一个实现了Runnable接口的匿名类的实例”。编译器会为我们创建相应的实例,并使用lambda作为单个抽象方法的方法体。为了达到同样的效果,我们也可以通过显式地创建一个实现Runn...

    • 显式地把lambda转换为函数式接口

      在大多数情况下,从lambda到函数式接口实例的转换都是自动进行的,不需要我们做任何事情。但是在某些情况下,也需要我们显式地执行转换。SAM构造方法是编译器生成的函数,该函数可以让我们执行从lambda到函数式接口实例的显式转换。可以在编译器不会进行自动转换的上下文中使用SAM...

    • 带接收者的lambda之with函数(上)

      Kotlin标准库中的with和apply函数是两个非常方便的函数。在lambda的函数体内不需要任何额外的限定符就可以调用一个不同对象的方法。很多编程语言都提供了特定的语句,我们可以使用这些语句对同一个对象执行多次操作,而不需要反复把对象的名称写出来。with结构看起来像是一种特殊...

    • 带接收者的lambda之with函数(下)

      在扩展函数的函数体内,this指向了这个函数扩展的那种类型的实例,而且this也可以被省略掉从而让我们可以直接访问接收者的成员。扩展函数在某种意义上就是一个带接收者的函数。Lambda是一种类似普通函数的定义行为的方式。带接收者的lambda是一种类似扩展函数的定义行为的方式。...

    • 带接收者的lambda之apply函数

      apply函数和with函数几乎是相同的,唯一的不同在于apply函数始终返回作为实参传递给它的对象,也就是说,接收者对象。apply函数被声明为一个扩展函数,它的接收者变成了作为实参的lambda的接收者。apply函数在很多情况下都很有用,其中一种情况是我们创建了一个对象实例并需要用正...

    • 类型系统的概述和可空性

      与Java相比,Kotlin的类型系统引入了一些新特性,这些新特性是增强代码可读性的基本要素。Kotlin的类型系统也删除了一些Java的类型系统中不必要或有问题的特性。可空性是Kotlin类型系统的一个特性,这个特性可以帮助我们避免NullPointerException错误。包括Kotlin在内的现代编程语...

    • 可空类型(上)

      Kotlin和Java的类型系统之间的第一条也可能是最重要的一条区别是:Kotlin对可空类型提供了显式的支持。如果一个变量可以为null,那么在这个变量上调用方法就是不安全的,因为这样会导致NullPointerException。Kotlin不允许这样的调用,因此可以阻止很多可能的异常。当我们调用strL...

    • 可空类型(下)

      如果我们想在调用strLen这个函数时它可以接收各种类型的参数,包括哪些可能为null的参数, 那么我们需要显式地在类型名称后面添加一个问号来标记这个类型。我们可以在任何类型的后面添加一个问号,以表明这个类型的变量是可空类型的变量,可以存储null引用。没有问号的类型表示这...

    • 类型的含义

      让我们来思考一下最普遍的问题:什么是类型,为什么变量是有类型的?类型是对数据的分类,决定了该类型的可能值,以及该类型的值上可能完成的操作。String类型的变量可以有两种值:要么是String类的实例,要么是null。这两种值完全不一样:就连Java自己的instanceof运算符都会告诉...

    • 安全调用运算符(上)

      Kotlin给我们提供的最有效的工具之一就是安全调用运算符?.,它允许我们把null检查和方法调用合并为一个操作。如果我们试图调用一个非空值的方法,那么这次方法调用会被正常地执行。 如果我们在空值上调用方法,那么这次调用不会发生,并且把null作为整个表达式的值。也就是说,安...

    • 安全调用运算符(下)

      如果我们的对象图中有多个可空类型的属性,通常可以在同一个表达式中方便地使用多个安全调用。

    • Elvis运算符(上)

      Kotlin有一个方便的运算符?:,可以提供用来代替null的默认值。它被称为Elvis运算符或者null合并运算符。Elvis运算符接收两个运算数,如果第一个运算数不为null,运算结果就是第一个运算数;如果第一个运算数为null,运算结果就是第二个运算数。Elvis运算符经常和安全调用运算符一起...

    • Elvis运算符(下)

      在Kotlin中有一种场景下Elvis运算符会特别顺手,像return和throw这样的操作其实是表达式,因此可以把它们写在Elvis运算符的右边。

    • 安全类型转换

      在前面的课程中,我们学习了用来类型转换的常规Kotlin运算符:as运算符。与常规的Java类型转换一样,如果被转换的值不是我们试图转换的类型,as就会抛出一个ClassCastException。as?运算符会尝试把值转换为指定的类型,如果被转换的值没有合适的类型就返回null。使用安全类型转换...

    • 非空断言(上)

      非空断言是Kotlin给我们提供的用于处理可空类型值的最简单最直接的工具。非空断言用两个感叹号表示,它可以把任何值转换为非空类型。对null值使用非空断言会抛出异常。抛出异常的位置是非空断言所在的那一行,而不是接下来试图使用那个值的那一行。在某些情况下,非空断言的确是...

    • 非空断言(下)

      CopyRowAction期望把一个列表中选中的行拷贝到剪贴板。actionPerformed只有当isEnabled为true时才会被调用。当函数isEnabled返回true时,已经判断了list.selectedValue!=null,因此,在函数actionPerformed中,使用非空断言list.selectedValue是没有问题的。如果我们不想使用!!,...

    • let函数

      let函数可以让可空表达式的处理变得更容易。和安全调用运算符一起,let函数允许我们对表达式求值,检查求值结果是否为null,并把求值结果存储在一个变量中。let函数最常见的一种用法就是处理可空参数,而这个可空参数应该被传给一个期望非空参数的函数。let函数做的所有事情就是把...

    • 延迟初始化的属性

      很多框架会在对象实例被创建之后调用专门的方法来初始化对象。但是我们不能在构造方法中完全放弃非空属性的初始化,仅仅在一个特殊的方法中对其初始化。Kotlin通常要求我们在构造方法中初始化所有属性,如果属性是非空类型,我们就必须提供非空的初始化值。如果我们不能提供,我们...

    • 可空类型的扩展

      为可空类型定义扩展函数是一种更强大的处理null值的方式。并不是在方法调用之前确保变量不为null,而是我们在调用时可以允许null作为接收者,并在函数中处理null。只有扩展函数可以做到这一点,普通成员方法的调用是通过对象实例来分发的,因此当实例为null时成员方法永远不能被执...

    • 类型参数的可空性

      默认情况下,Kotlin中所有泛型函数和泛型类的类型参数都是可空的。任何类型,包括可空类型在内,都可以替换类型参数。在这种情况下,使用类型参数作为类型的声明都允许为null,尽管类型参数T并没有以问号结尾。如果我们想让类型参数是非空的,需要为它指定一个非空的上界。那样就...

    加载中
    所属章节 资料名称 文件大小 下载
    相关资料推荐

    暂时还没有学习资料~

    综合评分

    0人评价

    好于0%的课程

    暂无

    课程与描述相符 5 非常满意

    老师的讲解表达 5 非常满意

    老师的答疑服务 5 非常满意

    全部

    好评 0

    中评 0

    差评 0

    加载中
    没有了哦~
    你可能还感兴趣的课程

      讲师介绍

      张荣超

      张荣超

      好评率:100%

      曾就职于联想、HTC、阿里巴巴;丰富的Swift、iOS、Android开发及培训经验;努力打造最好的Swift、iOS、Android学习视频

      105141人学习过

      推荐图书

      7日学霸榜 有105141人与你一起学习

      课程介绍

      课程大纲

      学习资料

      学员评价

      ¥58

      课程评价

      综合评价在4颗星及以上最高可获得35分奖励

      Kotlin核心技术详解视频课程

      该课程已有 人评价

      课程与描述相符

      老师的讲解表达

      老师的答疑服务

      匿名

      可以开发票么?

      可以的,购买课程或者充值余额后都是可以开具发票的,具体详情点击:我要开发票

      购买的课程可以下载么?

      目前PC端暂不支持下载课程视频,请手机或者平板电脑下载“51CTO学院”APP后再下载视频哦!

      优惠券如何使用?

      非折扣课程(不包含1元课程/套餐)可使用,一个订单(可包含多个课程)只可使用一张;优惠券一经使用,不再返还;若被冻结请在PC端删除订单即可返还。

      更多问题查询点击 帮助中心

      欢迎您提供宝贵意见,对于您的意见我们都会认真、慎重的讨论,每一个意见都是我们更好为您服务的鞭策和激励,感谢您帮助学院成长,我要反馈意见