接着(一)部分…
15.
将Kotlin导出生成为可执行的文件
在Module对应的build.gradle内,顶部加上
apply plugin:'application'
mainClassName = '包名.类名'
重新rebuild即可在IDE右边gradle.projects内看到
Tasks目录下面有distribution目录,里面有一个installDist.
双击运行
项目project空间内,build/install/Kotlin/bin内,包含有Kotlin和Kotlin.bat
其中Kotlin为linux执行程序,Kotlin.bat为window执行程序
build/Kotlin/lib内为依赖的的jar
16.
在Kotlin内常规的abstract class和java并没有什么区别
也是和Java一致,单继承多实现
在Kotlin内,默认的类和方法都是final
当把继承的abstract修饰取消,该类就变成了final,无法继承
就必须给该类添加 open修饰
- 父类需要open修饰才可以被继承
- 父类方法和属性需要 open修饰才可以被覆写
- 接口,接口方法,抽象类默认为open
- 覆写父类(接口)需要添加override关键字
- Kotlin默认的都是final
17.
接口方法冲突
当同时继承多个接口,且接口名一致.返回值一致时
可以通过 super<接口名>.方法 来调用各自接口的对应方法
18.
Kotlin的访问权限
在Kotlin内默认的权限是public…
和Java不同,Java的默认权限是 default.
其他的protected,private一致.
区别就是
Kotlin内有一个特有的权限修饰词 internal
internal的修饰的访问权限是 同一个 module内皆可访问
19.
Kotlin的object…
就是一个只有一个实例的类,不能自定义构造方法
这里的object并不是指
Java里面的父类,因为Kotlin里面的父类是Any
Kotlin内的object是类似于 interface,class一种类
通过查看编译文件发现,其实,Kotlin的object类型就是相当于Java内的最简单的单例模式.
在Java内可以通过
该Kotlin类.INSTANCE.XX()来进行调用
//Kotlin
object Cat{
fun eat(food:String){
println("$food")
}
}
//Java
public class CompareJava {
public static void main(String[] args) {
//cat在Kotlin内类是object...,可以看做也是一个class,对于java来说是一种最简单的单例
Cat.INSTANCE.eat("狗粮");
}
}
20.
Kotlin的静态方法和静态变量(伴生对象)
Kotlin内没有static修饰词,对应的 静态方法是创建一个
companion object{ }
companion object和19.里面的object是一样的,创建一个class,会对应创建一个object伴生对象,只有一个实例
而且伴生对象里面的方法是全局独一份,所以类似于静态方法和静态变量
将静态方法和静态变量写在里面…
在Koltin内可以和Java一样,直接调用,当Java调用Kotlin的companion object,即静态方法时.
要么通过Kotlin类名.companion.XXX调用
要么在Kotlin静态方法和静态变量上添加注解@JvmStatic和@JvmField
//Kotlin
//使用companion object创建静态方法
class Dog{
companion object{
fun speak(sound:String){
println("$sound")
}
@JvmStatic
fun lookDoor(){
println("看家护院")
}
@JvmField
val name = "中华田园犬"
}
}
//Java
public class Test1ForJava {
public static void main(String[] args) {
//提供给Java调动,要么通过.companion实例出来,要么添加@JvmStatic
Dog.Companion.speak("喵喵喵");
//添加了@JvmStatic,直接调用,等同于静态方法
Dog.lookDoor();
//添加了@JvmField,能够直接调用
System.out.println(Dog.name);
}
}
21.
Koltin方法重载(Overload)
与Java一致,方法名,返回值相同,参数不同.
因为都是使用Jvm虚拟机,Jvm函数签名涉及到 函数名和参数
Kotlin在使用重载函数时,推荐使用默认参数
同时如果使用默认参数的Kotlin方法被Java调用时,需要添加@JvmOverload注解
//Kotlin
class Overload{
@JvmOverloads
fun init(i:Int = 5){
println("$i")
}
fun init(a:Int,b:Int){
println("$a + $b")
}
}
//Java
public static void main(String[] args) {
Overload overload = new Overload();
//Koltin内添加了@JvmOverload注解,就可以直接使用默认参数,即不传入参数时,输出打印5
overload.init();
overload.init(2,3);
}
==Java和Kotlin==
List的remove()方法
//Java内
boolean remove(Object o); ==>Collection内的方法
E remove(int index); ==> List内的方法
同样都是移除,但是当List的泛型为Interger,因为自动拆箱,当你使用remove到底是移除的是对应下标的元素还是对应的元素呢?
//Kotlin内
list.removeAt(1) ==>remove(index i)
list.remove(5) ==>remove(object o)
分别对应不同方法.