怎么查看网站备案商,昆明网络公司网站,wordpress 主题 免费,百度爱采购官网首页文章目录 什么是类类的属性类的方法#xff08;行为#xff09;构造函数主构造次构造 类的实例化#xff08;对象#xff09;伴生对象this 什么是类
在 Kotlin 中#xff0c;变量类型都是类#xff0c;像我们常见的Int、String等等#xff0c;都是类。
为什么要分类行为构造函数主构造次构造 类的实例化对象伴生对象this 什么是类
在 Kotlin 中变量类型都是类像我们常见的Int、String等等都是类。
为什么要分类其实原因很多就像有些时候只要提起猫你的脑海中立马浮现出猫捉老鼠、猫吃鱼······至少不是汪汪叫的猫。有了猫这一类别我们就能很容易地将其与它所拥有的行为、特点联系起来。还有些情况像是一个巨大的图书馆如果各种书都没有一定规律地堆放在一起我们很难去找到我们想要的书。
在 Kotlin 中使用class去定义一个类
class 类名 { 属性/方法 }我们能够像描述一只猫一样去定义一个类这样就足够了
class Cat类名首字母需要大写而一般情况下变量和函数采用驼峰命名首个单词小写后面如果有其他单词首字母大写
class MyClassval myVariable 变量fun myFun() {}类的属性
属性例如一只猫是什么颜色的有多高喜欢吃什么就是用于描述类状态的一系列变量。直接将其定义于类中即可
class Cat {val name: String 小橘
}类的方法行为
方法或者叫函数可定义该类所具有的行为
class Fishclass Cat {fun eat(fish: Fish) {}
}构造函数
构造函数可以让我们在初始化类对象将猫这一类具体到某一只猫上时传入参数或者直接在构造函数中声明类的属性。
主构造
可以在类名后加一个小括号并写入对应的参数、属性。这与函数类似
class 类名([[val|var] 属性名: 类型], [参数名: 类型], ...) { 属性/方法 }我们可以给猫定义一些属性
class Cat(var name: String, val color: String)也可以给它们设置默认值
class Cat(var name: String, val color: String 橘色)我们也可以使用lateinit var将其定义于类中并使用init和参数将其初始化constructor可省
class Cat constructor(var name: String, colorParam: String) {lateinit var color: Stringinit {color colorParam}
}或者是直接将color赋值为colorParam
class Cat(var name: String, colorParam: String) {val color colorParam
}NoteKotlin 中可以使用lateinit关键字修饰可变变量这样变量就可以暂时不用赋值。但是在使用时如果还未赋值就会抛出异常kotlin.UninitializedPropertyAccessException。lateinit不支持基本类型Primitive Types包含数字、字符和可空类型。 // 这些是不被允许的
// 数字
lateinit var byte: Byte
lateinit var short: Short
lateinit var int: Int
lateinit var long: Long
lateinit var float: Float
lateinit var double: Double
lateinit var boolean: Boolean
// 字符
lateinit var char: Char
// 任何可空类型
lateinit var nullableAny: Any?次构造
很多时候主构造并不能满足我们的需求我们可以再定义次构造。次构造使用constructor声明必须基于主构造使用this()调用主构造。
class Cat(val name: String, val color: String) {constructor(name: String): this(name, 橘色) {}
}fun main() {val myCat Cat(小橘)println(${myCat.name} 是 ${myCat.color} 的)
}小橘 是 橘色 的类的实例化对象
可以像调用函数一样调用它生成Cat对象使用.即可访问对象的属性或方法行为
class Cat(val name: String, val color: String)fun main() {val myCat Cat(小橘, 橘色)print(${myCat.name} 是 ${myCat.color} 的)
}小橘 是 橘色 的伴生对象
对象实例化后每个对象都拥有自己的属性值例如两个Cat对象可能有不同的color。如果我们要声明一些该类所有对象都共有的并且是不受对象影响的属性或方法可以借助companion object来定义
class Cat {companion object {const val FAMILY 猫科}
}Note在定义不可变的顶层变量文件中的最外面或对象变量object时如果该变量为基本类型Primitive Types包含数字、字符或String则建议使用const关键字修饰。特别地如果该变量为对象变量IDEA会提示需要将变量名改为全大写 object Object {const val NAME 一个单词直接全大写const val A_MULTI_WORDS_NAME 多个单词需要加下划线分割
}我们可以通过以下两种方式来访问该属性通常采用Cat.FAMILY
fun main() {println(Cat.FAMILY)print(Cat.Companion.FAMILY)
}猫科
猫科本质上是定义一个对象object默认名称为Companion我们可以指定该对象的名称这并不影响我们使用它
class Cat {companion object CatCompanion {const val FAMILY 猫科}
}fun main() {println(Cat.CatCompanion.FAMILY)print(Cat.FAMILY)
}猫科
猫科甚至可以继承Kotlin 中使用: 被继承类()表示继承这将在后续文章提到
class Cat {companion object CatCompanion: Base() {const val FAMILY 猫科}
}open class BaseKotlin 并不支持使用对象来访问伴生对象的属性或方法
fun main() {val cat Cat()// cat.FAMILY 这是错误的
}this
Kotlin 类中可以使用this指定类中的属性或方法这在很多时候是可以省略的。如果有时候出现混淆可以通过使用this避免这一情况
class Cat(var name: String) {fun changeName(name: String) {// 函数参数的 name 与 Cat 的 name 并不是同一个// 使用 this.name 指定 Cat 的 name// 如果不指定默认会访问到最小范围内的 name// 这里的最小范围是函数作用域中的 namethis.name name}
}伴生对象中的this只能访问到伴生对象的属性或变量因为它是独立于类对象的
class Cat(var name: String) {companion object {const val FAMILY 猫科fun test() {this.FAMILY// this.name 错误的}}
}在扩展函数中使用
class Cat(var name: String)fun Cat.speck() {print(${this.name}: 喵喵喵)
}fun main() {Cat(小橘).speck()
}小橘: 喵喵喵