如需转载请评论或简信,并注明出处,未经允许不得转载
Kotlin系列导读
Kotlin学习手册(一)类与继承
Kotlin学习手册(二)属性与字段
Kotlin学习手册(三)接口
Kotlin学习手册(四)内部类
Kotlin学习手册(五)函数
Kotlin学习手册(六)数组与集合
Kotlin学习手册(七)for循环
Kotlin学习手册(八)内联函数let、with、run、apply、also
Kotlin学习手册(九)空类型安全
Kotlin学习手册(十)带你真正理解什么是Kotlin协程
目录
声明属性
.java
public class Address {
private final String name = "西溪";
private String city = "杭州";
private boolean isEast = true;
private int zip = 123456;
public String state;
protected boolean isCapital;
public String getName() {
return name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public boolean isEast() {
return isEast;
}
public void setEast(boolean east) {
isEast = east;
}
}
.kotlin
Kotlin 类中的属性既可以用关键字 var
声明为可变的(get&set),也可以用关键字 val
声明为只读的(get)
class Address {
val name = "西溪"
var city = "杭州"
var isEast = true
private val zip = 123456
var state: String? = null
protected var isCapital: Boolean = false
}
get & set
.java
public class Person {
private String name;
public String getName() {
return name + "sir";
}
public void setName(String name) {
this.name = "geek" + name;
}
}
.kotlin
kotlin会自动帮我们生成get&set,但是我们也可以自己定义
注意:set&get中如果要用到当前变量,不能直接引用,需要用field字段来代表当前变量,否则会死循环
class Person {
var name: String? = null
//这里不能直接使用name,而要使用field
get() = field + "sir"
set(value) {
field = "geek$value"
}
}
static属性
.java
public class Address {
private static String name = "杭州";
private String street = "西溪街道";
public static String getName() {
return name;
}
public static void setName(String name) {
Address.name = name;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
.kotlin
kotlin中需要将静态变量放入companion object
代码块
class Address {
var street = "西溪街道"
companion object {
var name = "杭州"
}
}
延迟初始化属性
正常情况下,kotlin不允许声明一个未被初始化的属性(除了abstract的属性)
[图片上传失败...(image-67d5c8-1572176349512)]
但是我们可以通过lateinit
关键字延迟初始化属性
.kotlin
class Address {
lateinit var name: String
}
在初始化前访问一个 lateinit
属性会抛出一个特定异常,该异常明确标识该属性被访问及它没有初始化的事实
kotlin.UninitializedPropertyAccessException: lateinit property name has not been initialized
可以通过下面这种方法检测一个 lateinit var
是否已经初始化过
if (address::name.isInitialized) {
println(address.name)
}
属性覆盖
子类可以用override
关键字复写父类中的open
属性
.kotlin
open class Person {
open var name: String? = null
}
class Man : Person() {
override var name: String? = "geekholt"
}
kotlin中的属性可以声明为abstract
,如果一个类中有abstract
属性,那么这个类也是abstract
.kotlin
abstract class Person {
abstract var name: String
}
class Man : Person() {
override var name: String = "geekholt"
}