var a:Int = 10
Java中 == 比较的是地址值,kotlin中 == 相当于java的equals
没写问号又传递一个null值程序将不能运行
step代表步长
加?号是因为num1Str有可能为空,只有不为空才让它toInt ,
报错的原因是num1Str为空的时候num1也就为空,那就不能执行相加了
两个!!感叹号意思是确保一定不为空
普通函数已经无法处理这么多次的运算,报出StackOverFlowError,
需要加关键字tailrec进行尾递归运算
警告说明尾递归必须调用函数本身,所以修改如下:
编译期常量:在编译的时候就已经知道了具体的值,并且把具体的引用改为具体的值
运行时常量:其实还是变量
相当于Java中最简单的单例
public static MyClass class = new MyClass();
private MyClass(){}
如果没有JvmStatic注解的话不能直接调用,要先调用companion这个对象(哈???? 貌似高版本也可以了)
JvmOverloads:给Java调用的函数加这个注解就可以调用有默认参数的方法并且不传递参数
start Activity
var intent = Intent(this , SecondActivity::class.java)
startActivity(intent)
第二个参数是要显示的activity类的class(activity的元数据),在Kotlin中要转换一下,SecondActivity::class获得的是Kotlin类的元数据,要想获得Java类的元数据,还要调用class中的Java属性
lazy相当于代理,上述代码是模仿lazy,将X设计成代理,hello设置了代理之后,hello就相当于一个傀儡,set和get方法都是交给代理去处理
data数据类默认没有空构造方法,并且设置成final类,使用这两个插件可以解决这个问题。不过这是编译期修改的,所以在代码里面还是不能直接继承或者使用空构造
Kotlin中内部类默认是static的,如果想设置成非静态加inner关键字。内部类调用同名属性用this@Outter
匿名内部类其实会有一个类名在字节码文件中。可以继承接口还可以实现类
枚举,实例可数。枚举的实例跟方法是需要分号隔开的
密封类,就是私有类
带有receiver的是Kotlin1.1开始的
相当于it.toDouble
fold函数的值要是前面类型的父类。join相当于遍历
有个错误 不能直接调用read Line 要it.readLine
with跟apply类似,不过with里面的值不能为空,因为还要继续传递
read Text相当于对with做了一个封装,还有read Line是获取说有行
use是封装了close方法
Java和kotlin都是伪泛型,用reified可以具体化,加上inline关键字,把代码植入到调用点处。实际运行出来是printlin(String::class.java)
注意反射获取注解要运行时注解才能拿到,编译器的要特殊处理。
要获取属性的还要注意Target
直接调用remove(0)有歧义,到底是要删除索引是0 的还是值为0的元素,kotlin为了优化这个问题就有了removeAt这个方法