前言
每个刚入门的程序员都会感觉学一门新的语言好累呀,总是感觉这门语言的语法和概念都会了怎么还是没发正常使用呢,其实这都是你的错觉,在学习一门新的语言的时候你最起码也要把官网的知识看个三遍才能说知识基本记住了 之后你要在实际的开发中使用一阶段才能算是入门
对象的声明
通过使用object关键字来声明一个对象 ,通常在单例模式的时候使用(备注这里只是对对象的声明还没有初始化)
// 这是声明了一个ObjectTest对象
object ObjectTest{
fun getObject(string:String){
println("我创建了一个对象"+string)
}
}
使用的时候直接使用类名应用即可
注意:对象声明不能在局部作用域(即直接嵌套在函数内部),但是它们可以嵌套到其他对象声明或非内部类中。
伴生对象
如果我们要在一个类中声明一个对象的话 ,就要用到伴生对象的语法了
/***
* 伴生对象是在我们想要在一个类中创建对象的时候使用的语法
* 使用的是 companion object 来实现的
* 通过类名来应用伴生对象的函数
*/
class Peoplel(val name:String,val age:Int){
companion object Factory {
fun CreateClass():Peoplel= Peoplel("栾桂明",24)
}
}
对象表达式
在我们要创建继承某些类的匿名内部类的时候使用,在创建处立即进行初始化
// 这是创建一个继承了某个接口的匿名的内部类的创建和使用
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ……
}
override fun mouseEntered(e: MouseEvent) {
// ……
}
})
// 这是我们只需要一个匿名的内部类的时候的操作
fun foo() {
val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)
}
请注意,匿名对象可以用作只在本地和私有作用域中声明的类型。如果你使用匿名对象作为公有函数的返回类型或者用作公有属性的类型,那么该函数或属性的实际类型会是匿名对象声明的超类型,如果你没有声明任何超类型,就会是 Any。在匿名对象中添加的成员将无法访问。
class C {
// 私有函数,所以其返回类型是匿名对象类型
private fun foo() = object {
val x: String = "x"
}
// 公有函数,所以其返回类型是 Any
fun publicFoo() = object {
val x: String = "x"
}
fun bar() {
val x1 = foo().x // 没问题
val x2 = publicFoo().x // 错误:未能解析的引用“x”
}
}
对象表达式和对象声明的区别
- 对象表达式是在使用的地方立即进行初始化
- 对象声明是在第一次被访问的时候延迟初始化
- 伴生对象的初始化是在相应的类被加载(解析)时,与 Java 静态初始化器的语义相匹配。