Kotlin学习系列----定义变量及基本属性

时间:2021-07-05 20:05:49

Kotlin官网: https://kotlinlang.org/
Kotlin的中文文档: http://www.kotlindoc.cn/
kotlin官方中文翻译文档网址(这个翻译较准确):https://www.kotlincn.net/docs/reference/
知乎上看到的一篇视频教学地址:https://zhuanlan.zhihu.com/p/23101437

由于最近几天工作量不大(其实就是闲(lll¬ω¬)),于是继续鼓捣Kotlin,今天来和大家分享下使用Kotlin后遇到的一些不同。

首先来说变量

我们先定义几个变量看看:

var name = "皮小智"           //等价于 String name = "皮小智";
var age = 0 //等价于 int age = 0;
var sex : String ?= null //等价于 String sex;

上面代码相信对比注释看都能看懂,就是定义了姓名,年龄,性别3个变量而已。然而给我最不习惯的并不是不需要定义变量类型(String,int之类),直接通用var,而是句尾不需要“;”。我自己写的时候经常就在句尾加上个“;”,虽然Android studio没有报错,但是“;”变灰了,感觉就是哪里不对似的(有点小强迫症(⊙o⊙)?)。

var(变量)val(常量)的区别:

//var是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量。这种声明变量的方式和Java中声明变量的方式一样。
var name = "pixiaozhi"
println(name)
name = "皮小智"
println(name)

//val是一个只读变量(常量),这种声明变量的方式相当于java中的final变量。一个val创建的时候必须初始化,因为以后不能被改变。
val finalValue = "我是不可改变的";
println(finalValue);

看文档的同学应该都咯看到Kotlin有空安全,正确写法就是上面定义性别sex变量写法。让我们接着看有什么需要注意

var nullable : String ? = null
val non_Nullable: String = "pixiaozhi"

nullable = null //编译通过
non_Nullable= null //编译错误

val nullable_l = nullable .length //正确:我先看的中文翻译文档例子中是length()方法,实际中没有这个方法,
//然后去打开官方文档看这里是length而不是length(),/(ㄒoㄒ)/~~现阶段还是得已官方为准啊
val non_Nullable_l = non_Nullable.length // 错误:变量“non_Nullable”可能为空

//空安全正确写法
nullable?.toString()//多了一个?,这里我是这样理解的:当代码执行这一句的时候如果nullable == null时则什么都不干,也就是后面的方法不执行

接着看看get() 和set()

kotlin里 变量定义默认是有get()和set()的,文档中声明一个属性的完整语法是这样的:

var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]

说实话第一次看到这个的时候不太明白,但是根据“顾名思义”我们也可以大概理解:

var <属性名>[: <属性类型>] [= <属性初始化>]
[<get方法>]
[<set方法>]

其初始器(initializer)、getter 和 setter 都是可选的。 属性类型(PropertyType)如果可以从初始器或者父类中推导出来,也可以省略。
另外var是变量,所以有get和set方法
val是常量,所以只有get方法,即:

var initialized = 1
var allByDefault: Int? = initialized // 类型 Int、默认 getter 和 setter
val onlyHasGet: Int? = initialized //类型 Int 、默认 getter

实例:

class MainActivity : AppCompatActivity() {
/**
* override用于覆写继承父类或者实现接口中方法
* fun 用于标识方法
* 参数形式: 参数名: 类型
* ? 是用于指定可以为空对象
*/

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

var person: Person = Person("pixiaozhi")
println(person.name) //调用get
person.name = "123" //调用set
println(person.name)
}

class Person (name:String) {
var name: String = name //一般只写这一句即可,Kotlin如果没有任何指定,属性会默认使用getter和setter
// field(幕后字段)表示当前的变量,field 标识符只能用在属性的访问器内。
get() = field //使用field代表当前的变量,不能直接使用变量名(会无限调用直到报java.lang.*Error)
set(value) {
field = value //setter是没办法像get一样简写的,因为它set(value) = field = value编译报错
}

}
}

要注意的是:field标识符只能用于getter与setter中,不能用在别的地方。
另外,只有当使用到field字段或者getter,setter中有一个默认实现时,才有field字段。别的时候并没该字段。

Kotlin学习还在探索前进中,以上全是根据官方文档定义然后自己使用后的理解写的,如有错误请指正,我会尽快更改。最后谢谢大家观看!


为了向别人、向世界证明自己而努力拼搏,而一旦你真的取得了成绩,才会明白:人无须向别人证明什么,只要你能超越自己。