kotlin

1、与Java对比

Java中的可见性修饰符和Koltin中的可见性修饰符不同之处:
1、 四种修饰符的不同。Koltin的四种修饰符(public、interna、protected、private),Java的的四种修饰符(public、protected、privavte、default(即不使用任何修饰符))。
2、默认修饰符的不同。Kotlin的默认修饰符为public,Java的默认修饰符为default。

2、kotlin的四种访问修饰符<变量、函数、属性>

1、概述

public修饰符表示 公有 。此修饰符的范围最大。当不声明任何修饰符时,系统会默认使用此修饰符。
internal修饰符表示 模块 。对于模块的范围在下面会说明。
protected修饰符表示 私有+子类。值得注意的是,此修饰符不能用于顶层<包中>声明,在下面可以看到。
private修饰符表示 私有 。此修饰符的范围最小,即可见性范围最低。

2、顶层

顶层: 直接在包下声明
在顶层情况下声明的变量、方法、类、接口等,不能使用protected修饰符。
public修饰符可省略,因为它是系统默认的。
在同一文件下,用任意修饰符都可以访问,当然此处除开protected修饰符
在不同文件下,只能访问public、internal修饰符修饰的变量、方法等
image.png


在类中声明属性、方法等,可以使用任意修饰符修饰。并且在类中的任意位置都能访问各个修饰符修饰的属性、方法等。
在类外,只能访问由public、internal修饰符修饰的属性、方法。此情况不管是不是在同一个文件中去操作。
在接口中声明的情况下,只能由public修饰符修饰属性。方法可由public、private两个修饰符去修饰,但是,用private修饰符修饰符修饰的方法不能被实现该接口的类重写。
为了使用接口中由public修饰符修饰的属性、方法等。只能定义一个类去实现该接口,然后重写其属性、方法。这样就能在可在类中或类外去操作。

4、小结

在顶层情况下声明的变量、方法、类、接口等,不能使用protected修饰符。
public修饰符可省略,因为它是系统默认的。
在同一文件下,用任意修饰符都可以访问,当然此处除开protected修饰符
在不同文件下,只能访问public、internal修饰符修饰的变量、方法等;

3、final、open修饰符

1、概念

final 用于修饰类、属性和方法,代表类、属性和方法是不可被继承的,kotlin 类、属性、方法如果不添加修饰符(final/open 修饰符)默认使用 final 修饰。
open 是 final 的反义词,用于对类、属性和方法开放继承权限。

  1. /**
  2. * 默认final修饰的类
  3. */
  4. class FinalClass
  5. //class sub1 : FinalClass()//子类不能继承final类
  6. /**
  7. * open修饰的类
  8. */
  9. open class OpenClass
  10. class sub2 : OpenClass()//子类可以继承open类

2、注意点

final 和 open 不可用于修饰局部变量。

4、const修饰符

1、概念

const 用来修饰可执行“宏替换”的常量。
宏替换:“宏变量”被称为“编译时”常量,宏替换指在编译阶段就会被替换掉。
const 只能修饰不可变变量(val)

2、“宏替换”常量条件

  • 使用const修饰;
  • 位于顶层或者是对象表达式的成员;
  • 初始值为基本数据类型(java8大类型);
  • 没有自定义的getter方法;
  • const val定义的变量,如果进行拼接或者运算,被拼接的其他变量也要是宏变量,否则编译不通过。

    3、使用

    fun main(args: Array<String>) {
      //const1和const2是宏变量,因此在编译时就会被替换成对应的常量
      println(const1 === "const1")//true,相当于println("const1" === "const1")
      println(const2 === "const2")//true,相当于println("const2" === "const2")
    }
    //定义宏变量const1
    const val const1 = "const1"
    //定义宏变量const2(发生字符串拼接,即使拼接时有隐式转换,该变量还是宏变量)
    const val const2 = "const" + 2
    //定义普通变量
    val common = "common"
    //下面两种定义宏变量方式编译报错
    //const val errorConst1 = "errorConst1$common"
    //const val errorConst2 = "errorConst2${getStr()}"
    /**
    * 定义一个方法返回str
    */
    fun getStr(): String = "str"