Kotlin(2)-类与对象

点击量:101

主要介绍Kotlin中遇到的类与对象

类与对象

类的定义
//kotlin可以定义一个空类
class Empty

//其他与java相同
属性定义
//用var 或 val来定义属性
class MyClass {
   var name: String = ……
   var url: String = ……
   var city: String = ……
}
对象的创建
//kotlin中没有new关键字
//可以像使用普通函数一样使用构造方法创建类实例
val obj=MyClass()

//使用属性和java一样
obj.username
obj.password

Koltin 中的类可以有一个 主构造器,以及一个或多个次构造器,主构造器是类头部的一部分,位于类名称之后:
class Person constructor(firstName: String) {}
如果主构造器没有任何注解,也没有任何可见度修饰符,那么constructor关键字可以省略。
class Person(firstName: String) {
   
}
GETTER AND SETTER
//kotlin中的getter 和 setter

var allByDefault: Int?
// 类型为 Int, 默认实现了 getter 和 setter
var initialized = 1  
// 类型为 Int ,默认实现 getter ,但必须在构造函数中初始化
val simple: Int?      
// 类型为 Int 类型,默认实现 getter
val inferredType = 1  

*** set()中对属性赋值,必须要使用field字段,否则使用了等于号则相当于调用了一次setter.会造成递归死循环
延迟加载
lateinit var username: String
//在变量定义时无需初始化
//不是用此修饰符则不需要在定义时就初始化
初始化方法
init{} 初始化代码首先执行,相当于static
(java中,静态代码块比构造方法更早执行)
如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
class Person(val name: String) {
   constructor (name: String, age:Int) : this(name) {
       // 初始化...
  }
}
嵌套类(内部类)
//创建对象的时候也是层级调用
val demo2 = Outer().Inner().innerTest()  
类的修饰符
abstract    // 抽象类  
final       // 类不可继承,默认属性
enum        // 枚举类
open        // 类可继承,类默认是final的
annotation  // 注解类
访问权限修饰符
private    // 仅在同一个文件中可见  在 test.kt中可见
protected  // 同一个文件中或子类可见
public     // 所有调用的地方都可见
internal   // 同一个模块中可见

Kotlin继承

Kotlin中所有类都继承Any类,Any类是所有类的超类
Any类默认提供了三个函数
equals()
hashCode()
toString()
继承(一个类要被继承,可以使用open关键字进行修饰)
//使用fun定义的函数,默认为final修饰
//标记了open修饰符的属性才能被继承
open class Base(username: String){
   open var username: String="12"

   open fun Mypr() {
       println(username)
  }
}

class Child():Base("张三"){

   override var username: String="2" //属性重写
   override fun Mypr() {  //方法重写
       print(this.username)
  }
}
接口
Kotlin中允许方法有默认实现
interface MyInterface {
   
   var name:String    //属性必须是抽象的,不允许初始化值
   
   fun bar()    // 未实现
   
   fun foo() {  //已实现
     // 可选的方法体
     println("foo")
  }
}
接口的实现
class Child : MyInterface {
   override fun bar() {
       // 方法体
  }
}

扩展

函数扩展
class C1{
   fun PL() {
       println("这是类中的方法")
  }
}

fun C1.PL2() {
   println("这是扩展出来的方法")

}

fun main(args: Array<String>) {
   var obj = C1()
   obj.PL()
   obj.PL2()
}

输出:
这是类中的方法
这是扩展出来的方法

若扩展函数和成员函数一致,则会优先使用扩展函数
属性扩展
对get set进行扩展
半生对象
//伴生对象内的成员相当于 Java 中的静态成员,其生命周期伴随类始终,在伴生对象内部可以定义变量和函数,这些变量和函数可以直接用类名引用。
class MyClass {
   companion object {
       val myClassField1: Int = 1
       var myClassField2 = "this is myClassField2"
       fun companionFun1() {
           println("this is 1st companion function.")
           foo()
      }
       fun companionFun2() {
           println("this is 2st companion function.")
           companionFun1()
      }
  }
   fun MyClass.Companion.foo() {
       println("伴随对象的扩展函数(内部)")
  }
   fun test2() {
       MyClass.foo()
  }
   init {
       test2()
  }
}

Kotlin数据类与密封类

数据类
** kotlin可以创建数据类
**相当于java中的实体类
**使用data修饰类,无需写类体

data class User(var username: String, var password: String)
fun main(args: Array<String>) {
   var user1 = User("zhangsan", "ppp")
   var user2 = User("lisi", "qqq")
   var user3 = User("wangwu", "ooo")

   println(user1)
   println(user2)
   println(user3)

   println(user1 == user2)
   println(user1 === user3)
}

输出
User(username=zhangsan, password=ppp)
User(username=lisi, password=qqq)
User(username=wangwu, password=ooo)
false
false
对象声明
** kotlin可以使用object关键字来声明一个对象
**进而很方便的获取有个一个单例对象
object DataProviderManager {
   fun registerDataProvider(provider: DataProvider) {
       println("sss")
  }
   val allDataProviders: Collection<DataProvider>
       get() = // ……
}


感谢您的阅读
文章由作者个人总结,欢迎指出文章错误

1楼  肖东燕  2019-06-23 09:25

不错




上一篇:JMS操作ActiveMQ

下一篇:Lucene全文检索