关键字object 三种方式:声明对象、对象表达式、伴生对象
声明对象
对象可以用于整理代码 管理变量与状态
// 定义类
class Person(_name:String){
var name = _name
get() = field
}
// 声明对象
object Game{
// 变量
var person = Person("bbb")
// 初始化
init {
println(" create game ")
}
// 定义对象方法
fun play(){
println("${person.name} play game")
}
}
代码调用
// 调用
Game.play()
对象表达式
用于需要使用某个类的变体示例 但是只需使用一次
var teacher = object :Person("teacher"){
override fun saySomething(){
println("i am a teacher my name is $name")
}
}
伴生对象 关键字companion 一个类里只能有一个伴生对象
open class Person(_name:String){
var name = _name
get() = field
open fun saySomething(){
println("i am $name")
}
//伴生对象
companion object{
var age = "18"
fun sayAge(){
println("age is $age")
}
}
}
数据类
//数据类 关键字data 专门用来存储数据的类
data class Touch(val x:Int , val y:Int){
}
数据类里的属性自动声明了 get set 方法
复写了 tostring equals copy 方法
var touch1 = Touch(1,1)
var touch2 = Touch(1,1)
println(touch1.equals(touch2))
枚举类 关键字enum
和java一样
enum class Direction{
NORTH,
EAST,
SOUTH,
WEST
}
调用时直接使用枚举类名.枚举常量名
Direction.EAST
运算重载符 关键字 operator
重载运算符可以重新定义运算规则
data class Touch(var x:Int , var y:Int){
// 重新定义加号运算符 +
operator fun plus(other:Touch) = Touch(other.x+x,other.y + y)
}
var touch1 = Touch(1,1)
var touch2 = Touch(1,1)
println(touch1.equals(touch2))
println(touch1 + touch2)
常见操作符
操作符 | 函数名 | 描述 |
---|---|---|
+ | plus | 把一个对象添加到另一个对象里 |
+= | plusAssign | 把一个对象添加到另一个对象里 然后给第一个对象赋值 |
== | equals | 判断两个对象是否相等 |
> | compareTo | 如果左边对象大于右边对象返回true 否则返回false |
[ ] | get | 返回集合中指定位置的元素 |
.. | rangeTo | 创建一个 range 对象 |
in | contains | 如果对象包含在集合里 返回true |
接口
定义接口
//定义接口关键字 interface
interface sayEnable{
//定义属性
var type:String
// 定义属性 并提供默认实现
val hello:String
get() = "hello world"
// 定义函数
fun saySomeThing()
}
实现接口 与调用
// 实现接口 :接口名
class Student:sayEnable{
// 实现属性
override var type : String = "student"
// 实现函数
override fun saySomeThing() {
println("$hello i am a $type")
}
}
class Teacher:sayEnable{
override var type : String = "teacher"
override fun saySomeThing() {
println("$hello i am a $type")
}
}
var student = Student()
student.saySomeThing()
var teacher = Teacher()
teacher.saySomeThing()
抽象类
// 定义抽象类 关键字abstract
abstract class Person(){
// 定义抽象方法 关键字abstract
abstract fun doWork()
}
// 继承抽象类 :抽象类名
class Staff : Person(){
// 实现抽象方法
override fun doWork() {
println("i do somework")
}
}
class Boss : Person(){
override fun doWork() {
println("i do busyness")
}
}
//调用
var staff = Staff()
staff.doWork()
var boss = Boss()
boss.doWork()