Kotlin属性,数据类型,运算符
在本教程中,我们将深入研究Kotlin的基本基础知识,即Kotlin属性和数据类型。
Kotlin 属性
属性无疑是任何编程语言中最重要的元素。
它们在任何代码库中都是必不可少的。
让我们看看它们在Kotlin中的定义以及使它们在Java中脱颖而出的原因。
打开IntelliJ并创建一个新的Kotlin项目,然后创建一个Kotlin文件。
每个kotlin属性声明都以关键字" var"或者" val"开头。
当变量是不可变的(即只读)时使用" val"。
您只能设置一次该值。
以下是kotlin编程中为int变量定义的语法。
var x: Int = 0 val y: Int = 1 x = 2 y = 0 //This isn't possible. var a: Int a = 0 val b: Int b = 1 b = 2 //Not possible val z: Double = 1 //Not possible. We need to pass an Int here.
从上面的代码中可以明显看出,变量的类型在冒号之后指定。
注意:Kotlin在每个语句的末尾不需要分号。
属性类型和语法
以下是Kotlin属性的完整语法。
var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>]
Getter和Setter是可选的。
因为val属性是不可变的,所以无法使用setter。
Kotlin中的类可以具有属性。
如果未定义getter或者setter,则使用默认值。
Getter 和 Setter
当前,在Kotlin中有一些getter和setter的变体。
通过创建如下所示的Kotlin类,让我们分别看一下它们。
class A { var name: String set(value) = println(value) get() = this.tutorial var tutorial : String = "Kotlin" set(value) { println("Old value was $field New Value is $value") } get() { return "${field.length}" } } fun main(args: Array<String>) { var a = A() println(a.name) a.name = "Kotlin Getters And Setters" println(a.tutorial) a.tutorial = "Kotlin Properties" } //Following is printed in the log. //6 //Kotlin Getters And Setters //6 //Old value was Kotlin New Value is Kotlin Properties
在上面的代码中,我们使用设置器在设置新值后打印旧值和新值。
我们尚未初始化属性"名称"。
因此,它需要获取方法的价值。
名称属性的获取者调用属性教程。
因此,"名称"的初始值是从"教程"字段的getter获取的,其中包含属性的后备值。
我们还可以在setter和getter上进一步指定修饰符。
var name: String private set(value) = println(value) get() = this.tutorial
获取上的可见性修饰符必须与属性相同。
现在,无法从类之外的任何函数设置以上属性。
const vs val
const
类似于val
,只是它们是编译时常量。
const只允许作为对象的顶级或者成员。
const val x = "Hello, Kotlin" //would compile val y = printFunction() //works. const val z = printFunction() //won't work. const works as a compile time constant only. fun printFunction() { println("Hello, Kotlin") } class A { const val x = "Hello, Kotlin" //won't compile. const can be only used at top level or in an object. }
const
不能与var一起使用。
lazy vs Lateinit
lazy是惰性初始化。
在您的代码中首次使用" val"属性之前,不会对其进行初始化。
此后,将使用相同的值。
该值存在于lazy()函数中,该函数采用lambda形式表示该值。
val x: Int by lazy { 10 }
lateinit修饰符与var属性一起使用,并在以后阶段用于初始化var属性。
通常,Kotlin编译器要求您在初始化期间为属性指定一个值。
借助lateinit
,您可以延迟它。
fun main(args: Array<String>) { var a = A() a.x = "Hello Kotlin" } class A { lateinit var x: String }
lateinit不能与val一起使用。
lateinit不能与基本类型一起使用。
lateinit var可以从创建对象的任何地方初始化。
Kotlin使用类型推断
Kotlin编译器可以根据您指定的值确定属性的类型。
作为一种静态类型的语言,类型是在编译时而不是运行时推断的。
类型推断使我们不必指定每个变量的类型。
因此,我们的代码库看起来不那么冗长。
以下代码段使用类型推断来确定属性类型。
var x= 0 //Kotlin infers the type as Int val y = 1.5 //Kotlin infers the type as Double x = "Hello" //Won't work. Can't set a String value to an Int. val a = 1.5 a = 2.5 //Won't work. val is immutable
重要说明:您需要定义类型或者将值设置为属性。
否则会发生编译时错误。
var a //won't compile. You need to specify either type or value. var x= 1 val y: Double //val variable can be assigned only one value in a single block. if(x>0) { y = 1.5 } else{ y = 2.5 }
Kotlin数据类型
以下是可分配给变量的基本kotlin数据类型。
- Numbers
- Characters
- Boolean
- Arrays
- Strings
数字类型
在Kotlin中,下列任何一个都可以是数字。
每种类型都有编译器分配的特定位宽。
- 双精度– 64
- 浮点数– 32
- 长整数– 64
- 整数– 32
- 短整数– 16
- 字节– 8
Kotlin编译器无法推断出Short和Byte类型。
我们需要如下定义它们
var a: Int = 0 var b: Short = 10 var c: Byte = 20
与Java相似,对于Long和Float类型,可以将字母L和F(或者f)分别附加到变量值之后。
val l = 23L var f = 1.56F var d = 1.55 var e = 1.55e10 //Alternative form to define a double value.
在Kotlin中,较小的类型不能隐式转换为较大的类型。
以下将引发错误。
var b: Short = 10 val i: Int = b //Error
Kotlin为我们提供了将较小的类型显式转换为较大的类型的方法。
var b: Short = 10 val i: Int = b.toInt() //Works
Kotlin提供了用于在每种类型之间进行转换的辅助函数:toByte()
,toInt()
,toLong()
,toFloat()
,toDouble()
,toChar()
,toShort()
,toString()
(如果有效,将字符串转换为数字!)。
我们可以在数字文字中添加下划线以提高可读性。
val tenMillion = 10_000_000 //reads 10000000 val creditCardNumber = 1234_5678_9012_3456L //reads 1234567890123456
字符类型
字符类型用Char
表示,值用单引号引起来。
var c: Char = 'A' //or using the shorthand form var c = 'A' var d: Char = 'AB' //this won't work. Only one character allowed.
此外,也可以为字符分配Unicode值,如下所示。
val character : Char = '\u0041'
与Java不同,无法使用ASCI值设置Kotlin中的字符。
以下内容无法编译
var c:Char = 65 //won't work
出现上述异常的原因是类型推断。
但是,我们可以将int添加到char或者将其转换为int以获取ASCII。
var c:Char = 'A' var newChar = c + 1 //B
布尔型
布尔类型表示布尔值,并具有两个值:true和false。
布尔值的内置操作包括
- || –延迟析取(OR)
- && –懒惰连词(AND)
- ! –否定(NOT)
var characterA = 'C' var characterB = 'E' var characterC = 'A' if(characterA>characterB || characterA>characterC) { println("CharacterA isn't the smallest") //this gets printed } if(characterA>characterB && characterA>characterC) { println("characterA isn't the smallest") //this gets printed } else{ println("characterA is definitely smaller than characterB") //this gets printed }
注意:在后面的教程中,我们将详细介绍Strings和Array类型。
Kotlin运算符
以下是Kotlin中使用的主要运算符。
- 相等运算符:
a == b
和a!= b
- 比较运算符:
a <b
,a> b
,a <= b
,a> = b
- 范围实例化和范围检查:
a..b
,a..b
中的x(检查x是否在a到b的范围内),a..b
中的x!(检查x是否不在a到b的范围内)在a到b)的范围内 - 递增和递减运算符:
++
和--
。
后和前增加/减少都存在。
另外,我们也可以使用函数inc()和dec()(两者都用作后期增量/减量)
增量递增/递减后存储当前值,然后递增/递减。
预先递增/递减递增/递减,然后存储该值。
- 按位运算符:与Java不同,Kotlin中的按位运算符不是特殊字符。
而是将它们命名为这些字符的形式。
shl(bits)–左移符号(Java的<<)
shr(bits)-带符号的右移键(Java的>>)
ushr(bits)–无符号右移(Java >>>)
和(位)–按位和
或者(位)–按位或者
xor(bits)–按位异或者
inv()–按位补码
注意:Kotlin不支持三元运算符。