一.对象
1.object关键字
使用object关键字,你可以定义一个只能产生一个实列的类-单例
1.对象声明
对象声明有利于组织代码和管理状态,尤其是管理整个应用运行生命周期内的某些一致性状态。
//object 表示单例
object ApplicationSingle {
init {
print("ApplicationSingle")
}
fun setMatter(){
print("setMatter")
}
}
fun main() {
print(ApplicationSingle)
ApplicationSingle.setMatter()
}
2.对象表达式
有时候你要使用一个类的实例,只用一次,那么对于这种用完就丢的类实例,连命名都可以省了。下面这个例子中对象表达式XX类的子类,使用object关键字后,一旦实例化,该匿名类只能有唯一一个实例存在。
//父类
open class Player{
open fun load()="loading nothing.."
}
fun main(){
//对象表达式
//匿名内部类 单例 继承子类
val p=object : Player(){
override fun load()="anonymous class"
}
print(p.load())
}
3.伴生对象
如果你想将某个对象的初始化和一个类实例捆绑在一起,可以考虑使用伴生对象,使用companion修饰符,一个类定义里只能定义一个伴生对象
class ConfigMap {
//伴生对象为一 且只有调用时才会创建 也是静态
companion object{
private const val PATH="xxxx"
fun load()= File(PATH).readBytes()
}
}
fun main() {
ConfigMap.load()
}
二.类
1.嵌套类
如果一个类只对另一个类有用,那么将其嵌入到该类中并使用两个类保持在一起是合乎逻辑的,可以使用嵌套类。
class ImplantClass {
//嵌套类
class Equipment(var name:String){
fun show()= print("equipment:$name") // STOPSHIP: 2021-09-11
}
fun battle(){}
}
fun main(){
//链式调用
ImplantClass.Equipment("xiaohua").show()
}
2.数据类
1.定义
数据类,就是用来存储数据的类。 数据类直接提供了toString方法的实现。
数据类不能使用abstract,opne,sealed和inner修饰符
==符号默认情况下,比较两个普通类对象就是比较他们的引用值,数据类默认情况下提供了equals和hashCode函数的实现。、
data class Coordinate (var x:Int,var y:Int){
private val isInBounds=x>0 && y>0
//重写
override fun toString(): String {
return "Coordinate(x=$x, y=$y, isInBounds=$isInBounds)"
}
}
fun main() {
print(Coordinate(10,20))
//data 类比较的是值
//class 类比较的是内存地址
print(Coordinate(10,20)==Coordinate(10,20))
val coordinate = Coordinate(10, 20)
}
2.copy
除了重写Any类的部分函数,提供更好用的默认实现外,数据类还提供了一个函数,它可以用来方便地复制一个对象。假设你想创建一个S