函数(表达式函数体)
java 写法:
public Int methodName(int a){//TODO}
kotlin 写法:
fun methodName(a:Int):Int{if(a>b)return a else return b }
特性: 可以使用表达函数体同时省略返回类型(当函数体只有一个表达式组成的时候)--as 可以自己转换
fun methodName(a:Int)=if (a>b) a else b
变量
java 写法:
int a =0; 使用确定类型
kotlin 写法:
val 只能赋值不能改变值 --不可变引用 对应java finial
var 可以赋值也可以改变值 --可变引用
var a=0; 可以使用不明确类型 能够根据值 确定类型 赋值之后 类型就确定了 再改变类型 a="a" 报错
字符串模板
java 写法:
Log.d(TAG,"a="+a);
kotlin 写法:
${} 括号里面不仅可以放变量 表达式 还可以放双引号引用文字
Log.d(TAG,"a=${if(a>0) a else "anything"}")
类和属性
java 写法:
public class Person{ String name; int age;}
kotlin 写法:
kotlin 中省略publish 因为 默认就是public
class Person { val name:String var age:Int}
只读字段name 会对应生成一个get方法
可变字段age 会生成set和get 一对方法
简化引用
val person=Person(“”小a“”,12)
person.name 省略调用get方法的必要 直接调用变量
自定义访问器
class Retangle{
val isSquare:Boolean
get(){ return width==heigh }}
目录和包
java 写法:
java结构中 每个文件 的包名是固定的 每个文件夹下的所有类 包名都是相同的 (同一个包下)
kotlin 写法:
包名可以自己定义 不同包名的文件 可以放在同一个包下 (为了结构清晰 本人不太推荐使用这种分包方式)
枚举 和 when
java 写法:
枚举 enum Color{RED,YELLOW,GREEN,GRY}
选择器 switch(i){case ...}
kotlin 写法:
改变了枚举类型写法 对于enum这个关键字 kotlin 规定 不写在class前面 没有意义 只是普通名称
和java类相同 enum 并不是值得列表 同时可以添加属性和方法
enum class Color(val r: Int;val g:Int;val b:Int){
RED(255,0,0),YELLOW(255,255,0);
fun rgb()={(r*256+g)*256+b}
}
大概了解的人 都知道 kotlin 已经省略了; 但在枚举中 属性和方法之间必须有;
kotlin 中使用when 代替switch选择器
when(color){
Color.RED->{ //TODO}
Color.YELLOW,
COLOR.GREEN ->{//TODO}//多种情况使用,分割
...
else//使用else 代替default
...
}
对于when 不仅能够使用switch 所能使用的 同样 可以使用表达式 以及空参
when(set(c1,c2)){
set(Color.RED,Color.YELLOW)->{//TODO }
}
使用这种表达式 效率可能会有点低 我们转化下
when{
(c1==Color.RED&&c2==Color.YELLOW)->{//TODO}
}
这种无参写法 可以省略创建对象 但是很难理解
for新特性(in 的用法)
java 写法:
很简单不在写了
kotlin 写法:
常见的 1-100输出 使用了区间 1..100 是不是很简单
for (i in 1..100){//TODO }
可以设置 倒叙
for (i in 100 dowmTo 1 step 2){// 设置倒叙 步长为2 }
in不仅可以可以检查数字类型的区间 还可以 检查字符
for(a in 'A'..'Z')
when(char){
in 0..9->{}
in 'a'..'z'->{}
}
不仅有in 还有 !in 这个不再介绍
map新特性
java 写法:
赋值 map.put(key,value)
迭代 很简单不写了==
kotlin 写法:
map新特性
赋值 map[key]=value
迭代
for((key,value) in map){//TODO }
异常处理
java 写法:
try{ return num;}cache(Exception e){}
throw new Exception("msg")
int persentNum=0;
if(num>0&&num<100){
persentNum=num;
}else{
throw new Exception("num must between 0 and 100")
}
kotlin 写法:
与实例创建一样 省略new
throw Exception("msg")
特性一:
上面我们提过表达式函数体这个概念 那么 上面的 if else 就可以改写成表达式函数体
val persentNum=try{num}catch(e:Exception){}
val persentNum= if(num in 0..100) num else throw Exception("num must between 0 and 100")
特性二:
取消了受检异常和非受检异常区分
在java中 我们使用读写 比如 BufferReader reader reader.readLine()方法的时候as直接出现提示 必须 处理 或者抛出异常
这是因为 IOException在java中属于受检异常(在java.lang库内部定义。Java编译器要求程序必须捕获或声明抛出这种异常--checkException。)对于受检异常 必须显示抛出 。
kotlin像许多语言 一样取消了受检异常 和非受检异常的区分 也就是 我们只在必要的时候 处理异常 不会再有强制性必须处理的异常了