目录
Kotlin简介来自于著名的IDE IntelliJ IDEA(Android Studio基于此开发) 软件开发公司 JetBrains(位于东欧捷克)
是一种基于JVM的静态类型编程语言,2017年谷歌I/O大会确定Kotlin为Android的官方语言
一:基础语法
1.1 特性
在Kotlin中定义包与Java有点不同,在Kotlin中目录与包结构无需匹配,
Kotlin的源码可以在磁盘上的任意位置。
// 包格式 和 java 一致
package com.ymc.hellokotlin
fun main(args: Array<String>) {
println("Hello world")
println(max(2,3))
}
fun max(a:Int ,b:Int):Int{
return if(a>b) a else b;
}
- main 函数不需要在class 中就可以运行
- fun 代表一个函数,后边紧跟函数名称,参数列表和返回值类型
- 参数实现写 参数名称 然后冒号隔开,再写参数类型(和java 相反)
- 函数的返回值是在后边的(和java刚好相反的)当然 有返回值 也可以不写返回类型(前提是:只有表达式体 函数返回类型可以省略,如果是代码块体函数就必须要 写明函数返回类型),因为kotlin 通过 类型推导 也是可以知道返回值类型的
- system.out.println 被包装为 println
- 在行末可以省略 分号 (类似 js)
- 看到max函数中 if类似于三元表达式 kotlin中,if 是有结果值的表达式
- 如果返回值 类似于 java 中的 void 则可以写成 :Unit ,当然也可以省略不写
在kotlin 中,除了部分循环(for do 和 do/while)大多控制结构都是表达式,是有返回值的。另一方面 java 中的赋值语句为表达式,而kotlin 中则为语句。
与Java定义包名一样,在源文件的开头定义包名:但是不同的是,包名和文件夹路径可以不一致。
1.2 变量
kotlin 的变量声明是可以省略类型的,所以kotlin 变量声明有别于java ,kotlin变量声明顺序为关键字变量名称类型(可不加),如果变量没有初始化则需要明确表明变量类型。
常量与变量都可以没有初始化值,但是在引用前必须初始化编译器支持自动类型判断,即声明时可以不指定类型,由编译器判断。如果不在声明的时候初始化则必须提供变量的类型
主要分为两种定义:
(官方推荐 尽量使用val 声明变量,使程序更接近函数式编程风格)
- val :不可变引用 ,在val声明变量后不能再初始化之外再次赋值与java final一致
- var :可变引用 , 该类型变量可以随便赋值
1.2.1 可变变量的定义: var 关键字
var <变量名> : <变量类型> = <初始值>
var sum: Int = 3
sum = 8
//由于编译支持类型推导可以省略Int类型
var sum = 3
sum = 8
1.2.2不可变变量的定义: val 关键字
( 不能进行二次赋值,类似Java中的final类型)
val <常量名> : <常量类型> = <初始值>
val sum: Int //没有赋值初始化之前必须指定类型
sum = 5
1.2.3 常量
已知值的属性可以使用 const 修饰符标记为 编译期常量。需要满足如下几种条件 (类似 java 中的 constanUtil 中的 常量值)
- 位于顶层或者是 object 的一个成员
- 用 String 或原生类型 值初始化
- 没有自定义 getter
const val SUBSYSTEM_KEY: String = "key"
@Deprecated(SUBSYSTEM_KEY) fun foo() {
…… }
1.2.4 字符串模板
字符串可以包含模板表达式,以$开始
val book = Book("Thinking In Java", 59.0f, "Unknown")
val extraValue = "extra"
Log.d("MainActivity", "book.name = ${
book.name}; book.price=${
book.price};extraValue=$extraValue")
1.3 类与属性
1.3.1 基础
在Kotlin中所有类都有一个共同的超类Any
//类定义,继承类和实现接口
class FeedBackActivity : NativeBaseActivity(), View.OnLongClickListener, BitmapUtil.SaveImageCall {
}
创建类的实例
val invoice = Invoice()
val customer = Customer("Joe Smith")
//注意 Kotlin 并没有 new 关键字。
我们比较一下 java 和 kotlin 中类的写法的不同
java:
public class DemoBean {
private final String name;
public DemoBean(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Kotlin:
class DemoBean(val name: String)
类是将数据和处理数据的代码封装成一个单一的实体。
class Person{
var name :String = "ymc" // 可读可写
val isMarried : Boolean = false // 只读
}
上段代码中 isMarried 会生成一个字段,一个getter ,而 name 则会生成 一个 getter和一个 setter 。
kotlin 在你声明属性的时候,你就声明了对应的访问器,默认的访问器 就是返回值的 getter 和 更新数值的 setter ,kotlin 会暴漏一个 getName 方法,当然我们也可以自定义访问器。
fun main(args: Array<String>) {
var person = Person()
println(person.name +";"+ person.isMarried )
}
可以看到我们直接调用而不需要get,感觉很像js…
1.3.2 自定义访问器
class Person{
var name :String = "ymc"
var sex : Int = 0; // 0 为女性 1为男性
val isMarried : Boolean = false
val isBoy :Boolean
get() {
return if(sex==1) true else false
}
}
将Person 添加 sex 和 isboy 属性,重写getter ,这样就可以做到自定义访问器。
如果 我们设置属性为val ,但是通过自定义 getter修改属性?
fun main(args: Array<String><


被折叠的 条评论
为什么被折叠?



