写在前面的话
最近看到github和掘金上面kotlin的文章越来越多了 正好项目闲下来了 所以趁此机会学习一下kotlin 借鉴别人的demo练手 怕遗忘 做笔记 更是一种鞭策。
感谢《Kotlin for android developers》中文版翻译 也由衷感谢所有为开源做出贡献的技术人员。
放在前面的养眼图
我们为什么学习Kotlin?
仅仅是为了语法糖吗?问这个问题或者疑问的时候 表明我们自身是存在几个问题的 1.身为一个开发者 不断学习才能不被淘汰。(检讨中 这段时间过于安逸 危机意识较淡薄。)2.你对Kotlin的了解不够 它不仅仅是语法糖 它还有着java1.7所没有的新特性。
它更加易表现:这是它最重要的优点之一。你可以编写少得多的代码。
它更加安全:Kotlin是空安全的,也就是说在我们编译时期就处理了各种null的情况,避免了执行时异常。如果一个对象可以是null,则我们需要明确地指定它,然后在使用它之前检查它是否是null。你可以节约很多调试空指针异常的时间,解决掉null引发的bug。
它是函数式的:Kotlin是基于面向对象的语言。但是就如其他很多现代的语言那样,它使用了很多函数式编程的概念,比如,使用lambda表达式来更方便地解决问题。其中一个很棒的特性就是Collections的处理方式。
它可以扩展函数:这意味着我们可以扩展类的更多的特性,甚至我们没有权限去访问这个类中的代码。
它是高度互操作性的:你可以继续使用所有的你用Java写的代码和库,因为两个语言之间的互操作性是完美的。甚至可以在一个项目中使用Kotlin和Java两种语言混合编程。
详见: 什么是Kotlin?
这里让我觉得比较酸爽的地方:
关于Javabean:
<code>
public class Artist {
private long id;
private String name;
private String url;
private String mbid;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMbid() {
return mbid;
}
public void setMbid(String mbid) {
this.mbid = mbid;
}
@Override
public String toString() {
return "Artist{" +
"id=" + id +
", name='" + name + '\'' +
", url='" + url + '\'' +
", mbid='" + mbid + '\'' +
'}';
}
}
</code>
Kotlin写法:
<code>
data class Artist (
var id: Long,
var name: String,
var url: String,
var mbid: String)
它会自动生成所有属性和它们的访问器,以及一些有用的方法,比如,toString()
</code>
函数支持(支持Lambdas)
view.setOnClickListener { toast("Hello world!") }
还有空指针,扩展方法。这个我还刚开始学 还没了解到 😀
再次感谢译文 详见 我们通过Kotlin得到什么
Kotlin开始项目
Intellij 15开始,插件是被默认安装了的,所以Intellij不需要做特别设置。大部分使用的是Android Studio 你需要进入Android Studio 的Preferences的plugin栏搜索“Kotlin”。安装Kotlin插件 重启Android Studio即可。
详见 Kotlin开始项目
最后 kotlin 官方文档翻译
类和函数
类
Kotlin中
<code>
class MainActivity {
//大括号可以省略 如果没有类体
}
</code>
构造函数
在 Kotlin 中类可以有一个主构造函数以及多个二级构造函数。主构造函数是类头的一部分:跟在类名后面(可以有可选的类型参数)。有点拗口 代码如下:
1.主构造函数
<code>
class Person constructor(firstname: String){
//如果主构造函数没有注解或可见性说明 constructor字段可以省略
}
//如果构造函数有注解或可见性说明 譬如public 那么constructor则不能省略并且可见性字段在前面
class Person private constructor(name: String){
// ... 私有不可见
}
//主构造函数不能包含任意代码 初始化代码可以放在init{}的代码块中
class Person constructor(firstname: String) {
init {
// ... 初始化代码块
}
}
//注意主构造函数的参数可以放在初始化代码块中 也可以用在类的属性初始化声明处 即:
class Person(name:String) {
val personKey = name. toUpperCase() //name字符串大写处理
}
//也可以这样声明
class Person(val name: String,val age: Int){
//var 修饰可变 val只读 注意
}
参考可见性
</code>
2.二级构造函数
类可以加二级构造函数 需要添加前缀 constructor
<code>
class Person {
constructor(parent: Person){
}
}
</code>
关于二级函数后面还有些内容不太理解 所以不做必要的记录后面会一一学习。
更多参考 二级构造函数
创建类的实例以及类继承
1.创建类的实例:
kotlin没有new 这个字段的,所以实例化如下
val person = Person()
类成员
类可以包含:
-- 构造函数和初始化代码块
-- 函数
-- 属性
-- 内部类
-- 对象声明
2.类继承:
默认任何类都是基础继承自Any(与java中的Object类似),但是我们可以继承其它类.这些其他类需要明确声明open或者abstract
<code>
open class BasePerson(name: String)
class Person(name: String,surname: String) : BasePerson(name)
abstract class BasePerson2(name: String)
class Person2(name: String,surname: String) : BasePerson2(name)
</code>
open注解与java中的final相反:它允许别的类继承这个类。默认情形下,kotlin 中所有的类都是 final ,对应 Effective Java :Design and document for inheritance or else prohibit it.
class类中的函数
fun修饰如果没有指定返回值会返回Unit,与Java的void相似。但Unit是一个真正的对象 也可以指定它的返回值类型
fun add(x: Int,y: Int) : Int = x + y
更多参考 构造函数