Kotlin 与Java的一些区别,open\final\abstract\val\const等

目录

前言

 1、final的作用

 3、在Kotlin中,类默认都是final的

4、在kotlin中,abstract的用法几乎和Java一致

5、在Kotlin中,接口默认都是open

6、val和var 的区别

7、const val 

8、const val和val区别:


前言

这篇书写风格可能比较简单,只作为Kotlin与Java在语言,在使用中的一些区别。

 


 1、final的作用

final关键字可用于修饰类、属性和方法,表示它所修饰的类、属性和方法不可改变。

 


 2、Kotlin与JAVA的一个重大区别

Kotlin的 final 修饰符不能修饰局部变量。

Kotlin的 open 也不能修饰局部变量。

 


 3、在Kotlin中,类默认都是final的

如果你需要允许它可以被继承,那么你需要使用open声明:

open class People: Speakable{//这个类具有`open`属性,可以被其他类继承
 
    override fun say() {} //`open`的方法被实现和覆写,该方法也是`open`的

    fun sayHello() {}    //`final`属性的方法,不可被覆写
   
    open fun sayName() {} //`open`属性的方法,可以被继承和覆写
}

  当然,你也可以阻止某些方法被覆写:


open class People: Speakable{
    //`final`修饰一个原本具有`open`属性的方法,使其变得不可再被覆写
    final override fun say() {}
}

 


 

4、在kotlin中,abstract的用法几乎和Java一致

当你使用abstract修饰符的时候,可以忽略open修饰符,因为被abstract修饰的类默认具有open属性。

修饰符 特性 注解
final 不能被覆写 kotlin中默认所有的方法和类都是final属性
open 可以被覆写 需要被明确指出
abstract 必须被覆写 不能被实例化,默认具有open属性。
override

覆写超类的方法

如果没有被指定为final,则默认具有open属性

 


5、在Kotlin中,接口默认都是open

对于接口类来说,基本用不上fianlopenabstract。

因为接口类默认是open,且不能被声明为final。

如果接口实现类的方法没有函数体,那么其为abstract,但是不需要你明确指出他是abstract的。

 


6、val和var 的区别

var为可变变量,即可以通过重新赋值来改变其内容的变量,与java中传统的声明变量方式基本一致。

val为只读变量,可以将它理解为java变量常用修饰符中的final,在初始化的时候需要赋值,且不能被修改。

其中,var 在kotlin里面你可以指明属性的数据类型,也可以不指明属性的数据类型, kotlin可以很智能的帮你区别这个属性的值。

var value1 = 10  // Kotlin自动进行标识

val value2: Long = 10  

val value3: Long = value1 //error   

请注意,当Kotlin同样会有类型转换错误,在Kotlin中转换是通过显式进行的,即通过使用辅助函数完成的。 


val value3: Long = value1.toLong() 

 


7、const val 

Kotlin提供了const用来修饰可执行“宏替换”的常量。这种常量也被称为“编译时”常量,因为它在编译阶段就会被替换掉。const使用时满足如下条件:

  • const 必须修饰val
  • const 只允许在top-level级别和object中声明
//定义支持“宏替换”的常量
const val MAX_AGE = 100

fun main(args: Array<String>) {
    println(MAX_AGE)
}

输出结果: 100


如果被赋值的表达式只是基本的算术表达式或进行字符串连接运算,没有访问普通变量、常量、方法,Kotlin编译器同样会将这种const常量当成“宏变量”处理。

//定义3个“宏变量”
const val a = 1+2
const val b:Double=1.2/3
const val str:String="疯狂"+"外星人"

fun main(args: Array<String>) {
    println(str === "疯狂外星人")
}

输出结果:true 

 


8、const val和val区别:

const和val 修饰的两个String类型,如下:

object myObject {
    const val constObject: String = "constObject"

    val normalObject: String = "normalObject"
}

打开Android studio 点击 Tools->Kotlin->Show Kotlin ByteCode,如下:

public final class com/example/kotlin/myObject {
  public final static Ljava/lang/String; constObject = "constObject"

  private final static Ljava/lang/String; normalObject = "normalObject"

  public final getNormalObject()Ljava/lang/String;
}

主要区别:

  • const val 可见性为public final static,可以直接访问。
  • val 可见性为private final static,并且val 会生成方法getNormalObject(),通过方法调用访问。

注意:当定义常量时,出于效率考虑,我们应该使用const val方式,避免频繁函数调用。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章