Kotlin相关基础及与Java的不同 的 笔记(两)

接着(一)部分…

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)
分别对应不同方法.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值