目录
4、在kotlin中,abstract的用法几乎和Java一致
前言
这篇书写风格可能比较简单,只作为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
对于接口类来说,基本用不上
fianl
、open
、abstract。
因为接口类默认是
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方式,避免频繁函数调用。