Kotlin属性,数据类型,运算符

时间:2020-02-23 14:37:31  来源:igfitidea点击:

在本教程中,我们将深入研究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 == ba!= b
  • 比较运算符:a &lt;ba> ba &lt;= ba> = b
  • 范围实例化和范围检查:a..ba..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不支持三元运算符。