02:最基础语法
变量声明
var age: Int = 18
var name: String = "liujia"
//如果变量声明时有直接赋值,则可省略类型
var age2 = 18
var name2 = "liujia"
//kotlin空安全类型
var name3: String? = null
fun main(args: Array<String>) {
name = name3//可空类型不可赋值给不可为空类型
name = name3!!//强转,表示:确定name3不会为空
name3 = name //反过来可以,其是包含关系
}
函数声明
fun printLen(str:String):String{
println(str)
println("这个字符串是:$str")//可在kotlin字符串中用$符合引入一个变量
return str
}
03:Kotlin与java互调
java调kotlin
Test.kt文件中,声明的所有函数,包括类型,变量最终都会编译成这个类的public static方法或变量
//Test.kt
fun echo(name:String){
println("$name")
}
//Main.java
public static void main(String[] args){
TestKt.echo("张三");
}
特殊语法
以object关键字开头,后面跟一个类的声明,这种语法在kotlin中是创建一个匿名内部类的写法。kotlin可以通过类名调用这个类的成员方法。
object Test {
fun sayMessage(msg:String){
println(msg)
}
}
//kotlin调用
Test.sayMessage("张三")
//java调用
Test.INSTANCE.sayMessage("张三");
可以观察到,在kotlin用object创建一个匿名内部类的时候,生成的java代码会编译成一个Test的类,Test中会创建一个INSTANCE的单例对象,并且构造方法会被改写成private。
这是在kotlin中声明单例的写法。
kotlin中调用class
//java code
TestMain.class
//kotlin code
TestMain::class.java
fun main() {
testJavaClass(JavaMain::class.java)
testKotlinClass(KotlinMain::class)
}
fun testJavaClass(clazz: Class<JavaMain>){
println(clazz.simpleName)
}
fun testKotlinClass(clazz: KClass<JavaMain>){
println(clazz.simpleName)
}
kotlin调关键字方法
println(JavaMain.`in`)
04:新手常遇到的问题
1. kotlin没有封装类
java中的所有封装类都会转成kotlin的基本数据类型
1,如果java中有两个同名函数,参数类型一个是int,一个是Integer。
2,kotlin中去调用的时候,会调参数为int的那个函数。
3,如果在kotlin中想调用封装类参数的函数,得用反射。
2. 空值敏感的问题
1,如果在java中有一个函数返回值可能为空。
2,kotlin去接收这个函数自动推断类型为String!
3,这是kotlin的一个兼容类型,只会出现在kotlin调java的时候
4,如果用一个空安全类型去接收就不会有问题了
3. kotlin中没有静态变量和静态方法
1,如果想在java中调用kotlin静态方法但不想点出INSTANCE
2,可以在kotlin函数上加一个@JvmStatic注解
3,被@JvmStatic注解修饰的方法编译后会变成public static方法。