第一章(Kotlin:定义和目的)
Kotlin主要特征
目标平台
- 编写服务器端代码(典型的代表是Web应用后端)
- 创建Android设备上运行的移动应用(Android开发)
其他:可以让Kotlin代码运行在iOS设备上及编译成JavaScript,允许你在浏览器中运行Kotlin代码等
静态类型
Kotlin和Java一样是一种静态类型的编程语言。这意味着所有表达式的类型在编译期就已经确定了。与Java不同的是Kotlin不需要你在源代码中显示的声明每个变量的类型。很多情况下,变量类型可以根据上下文来自动判断,编译器这种根据上下文推断变量类型的能力被称作类型推导。
val i = 1 // 这里可以不用像下面那样显示的声明i为Int类型,编译器根据类型推导可以自动推导出i为Int类型
//val i:Int = 1 //这里和上面代码是等效的
静态类型带来的好处:
- 性能 — 方法调用速度更快,因为不需要在运行时才来判断调用的是哪个方法。
- 可靠性 — 编译器验证了程序的正确性,因而运行时奔溃的概率更低。
- 可维护性 — 陌生代码更容易维护,因为你可以看到代码中用到的对象的类型。
- 工具支持 — 静态类型使IDE能提供可靠的重构、精确的代码补全及其他特性。
函数式和面向对象
函数式编程的核心概念如下:
- 头等函数 — 把函数当作值使用,可以用变量保存它,把它当作参数传递,或者当作其他函数的返回值。
fun main(args: Array<String>) {
val a = test03(test())
//将test04()函数作为run函数的参数传递
run(::test04)
}
fun test(): Int {
//定义一个函数,并返回一个Int类型的值
val a = 1
return a
}
fun test02(): KFunction0<Int> {
//将test()函数作为test02()函数的返回值
return ::test
}
fun test03(i: Int) {
println("test03 i=$i")
}
fun test04() {
println("test04")
}
2. 不可变性: 使用不可变对象(用val
修饰,相当于Java中的final
),这保证了它们的状态在其创建后不能再改变。
3. 无副作用: 使用的是纯函数。此类函数在输入相同时会产生同样的结果,并且不会修改其他对象的状态,也不会和外面的世界交互。
免费并开源
Kotlin是免费和开源的,全面支持主流的IDE和构建系统。
Kotlin的设计哲学
务实
Kotlin没有强制使用某种特定的编程风格和范式。当你开始学习这门语言的时候,可以使用熟悉的来自Java经验的风格。然后,你会渐渐发现更多强大的Kotlin特性,并学习把它们应用到你的代码中,让代码更简洁、更符合语言习惯。很多情况下,IDE会发现那些可以用更简洁的结构来替换的通用代码模式,并给你提供修正这些代码的选择。
简洁
在Kotlin中,我们努力地保证你写的代码都具有实际的意义,而不是仅仅为了满足代码结构的需要。许多标准的Java样板代码,例如getter、setter以及将构造方法的参数赋值给字段的逻辑,在Kotlin中都是隐式的,并不会使你的源代码变得混乱。
安全
作为面向JVM的静态类型语言,Kotlin还保证了应用程序的类型安全。这比使用Java的成本要更低:不需要指定所有的类型声明,因为许多情况下编译器会自动地推断出类型。更重要的一点是,Kotlin努力地从你的程序中消除NullPointerException。Kotlin的类型系统跟踪那些可以或不可以为null的值,并且禁止那些运行时可能导致NullpointerException的操作。这所带来的额外的成本是极小的:把类型标记为可空的只要一个字符,就是在类型尾部加一个问号:
val s: String? = null //可以为null
val s2: String = "" //不可以为null
除此之外,Kotlin还有助于避免的另一种异常类型就是ClassCastException。在Java中,当你把一个对象转换成一种类型,而没有事先检查它是否是正确的类型时,就会发生这个异常。而在Kotlin中,检查和转换被组合成了一次操作:一旦检查过类型,不需要额外的转换(Java中还需要强制转换)就能直接引用属于这个类型的成员。
if (value is String) //检查类型
println(value.toUpperCase()) //调用该类型的方法
互操作性
Kotlin工具也对跨语言项目提供了全面支持。它可以编译任意混合的Java和Kotlin源码,不管它们之间是怎样互相依赖的。IDE的特性也能跨语言工作,允许:
- 自由地在Java和Kotlin源文件之间切换
- 调试混合语言的项目,可以在不同语言编写的代码之中单步调试
- 重构Java方法的时候,Kotlin代码中的对它们的调用也会得到正确的更新,反之亦然
总结
- Kotlin是静态类型语言并支持类型推导,允许维护正确性与性能的同时保持源代码的简洁。
- Kotlin支持面向对象和函数式两种编程风格,通过头等函数使更高级别的抽象成为可能,通过支持不可变值(val修饰)简化了测试和多线程开发。
- 在服务器端应用程序中它工作得很好,全面支持所有现存的Java框架,为常见的任务提供了新工具,如生成HTML和持久化。
- 在Android上它也可以工作,这得益于紧凑的运行时、对Android API特殊的编译器支持以及丰富的库,为常见Android开发任务提供了Kotlin友好的函数。
- 它是免费和开源的,全面支持主流的IDE和构建系统。
- Kotlin是务实的、安全的、简洁的,与Java可互操作,意味着它专注于使用已经证明过的解决方案处理常见任务,防止常见的像NullPointerException这样的错误,支持紧凑和易读的代码,以及提供与Java无限制的集成。
---恢复内容结束---
第一章(Kotlin:定义和目的)的更多相关文章
- 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介
前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...
- 第一章 数据库概述、MySQL的安装和配置
第一章 数据库概述.MySQL的安装和配置 1.为什么要使用数据库 最早是纸质文件来存储数据 缺点:不易保存,占用空间大 计算机出现以后,采用软件来进行保存(excel) 缺点:容易损坏 文件 ...
- 《css3实战》读书笔记 第一章 基于CSS需求而编写的HTML.
笔记说明 <CSS3实战手册第3版(影印版)>可以消除Web设计工作的痛苦,并且带给你:HTML--重新入门.如果你是HTML新手,你会学到如何以CSS友好的方式进行基本页面构造.若你是H ...
- SICP— 第一章 构造过程抽象
SICP Structure And Interpretation Of Computer Programs 中文第2版 分两部分 S 和 I 第一章 构造过程抽象 1,程序设计的基本元素 2,过 ...
- C#本质论读书笔记:第一章 C#概述|第二章 数据类型
第一章 1.字符串是不可变的:所有string类型的数据,都不可变,也可以说是不可修改的,不能修改变量最初引用的数据,只能对其重新赋值,让其指向内存中的一个新位置. 第二章 2.1 预定义类型或基本类 ...
- PRML读书会第一章 Introduction(机器学习基本概念、学习理论、模型选择、维灾等)
主讲人 常象宇 大家好,我是likrain,本来我和网神说的是我可以作为机动,大家不想讲哪里我可以试试,结果大家不想讲第一章.估计都是大神觉得第一章比较简单,所以就由我来吧.我的背景是统计与数学,稍懂 ...
- .net架构设计读书笔记--第一章 基础
第一章 基础 第一节 软件架构与软件架构师 简单的说软件架构即是为客户构建一个软件系统.架构师随便软件架构应运而生,架构师是一个角色. 2000年9月ANSI和IEEE发布了<密集性软件架构建 ...
- c#高级编程第七版 学习笔记 第一章 .NET体系结构
第一章 .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...
随机推荐
- Mysql索引进阶入门
1. 索引操作 MySQL 索引 菜鸟 2. 索引类型 PRIMARY 唯一且不能为空:一张表只能有一个主键索引 INDEX 普通索引 UNIQUE 唯一性索引 FULLTEXT 全文索引:用于搜索很 ...
- java多线程中wait/notify/sleep/join/yield方法以及多线程的六种状态
刚开始学线程的时候也是被这几个方法搞的云里雾里的,尤其是一开始看的毕老师的视频,老师一直在强调执行权和执行资格,看的有点懵逼,当然不是说毕老师讲的不好,就是自己有点没听明白,后来复习看了一些其他的博客 ...
- maven3实战之仓库
maven3实战之仓库(maven仓库分类) maven3实战之仓库(maven仓库分类) ---------- 对于maven来说,仓库只分为两类:本地仓库和远程仓库.当maven根据坐标寻找构件的 ...
- IPC机制1
1.Android IPC简介 Inter-Process Communication的缩写就是IPC,含义是进程间通信或是跨进程间通信,是指两个进程进行交换数据的过程. 进程是什么? 进程在pc上就 ...
- macOS 下的 MySQL 8.0.17 安装与简易配置
如果我写的这篇你看不懂,可能网上也没有你能看懂的教程了 虽然这篇针对的是8.0.x版本,但是关于MySQL配置之类的方法还是通用的 环境信息与适用范围 环境信息 环境/软件 版本 macOS macO ...
- Selenium+java - PageFactory设计模式
前言 上一小节我们已经学习了Page Object设计模式,优势很明显,能更好的体现java的面向对象思想和封装特性.但同时也存在一些不足之处,那就是随着这种模式使用,随着元素定位获取,元素定位与页面 ...
- IoT时代:Wi-Fi“配网”技术剖析总结
导读 近年来,物联网市场竞争激烈,从物联网平台厂商,设备生产商,到服务提供商,都在涌入这片红海.预计到2020年,全球联网设备数量将达到260亿个,年复合增长率达到20%:全球联网设备带来的数据将达到 ...
- (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅
字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...
- python webdriver 常用元素操作
1.新建实例 xx_driver = os.path.abspath(r"路径") os.environ["webdriver.xx.driver"] = xx ...
- 基于注解的SpringAOP源码解析(三)
注意,读完本篇文章需要很长很长时间 在之前的2篇文章:AOP源码分析(一)AOP源码分析(二) 中,我们搭建了SpringAOP源码分析的环境,介绍了@EnableAspectJAutoProxy注解 ...