Kotlin基础概念(一)

来源:互联网 发布:伊藤美诚 知乎 编辑:程序博客网 时间:2024/06/07 03:02

一、类和对象(Classes and Objects):

    1、Kotlin定义类的关键字还是class跟Java一个样: 

class MyKolin{}
    2.构造方法(Constructors):

      *构造方法可以有主构造方法和其他的构造方法,参数的定义为

       参数名:参数类型

class person constructor(fristName:String){    }//或者省略掉constructorclass person (fristName:String){    init{         logger.info("这是在构造方法中初始化的代码          块")    }    //也可以定义一些初始化参数    val customerKey=name.toUpperCase()}
       *如果构造方法有注解或是显示的修饰,constructor关键字必须出现在构造函数中且出现在修饰符之后:
class Cutsomer public @Inject constructor (name:String){}
       *val和var的区别:var是为可变的数据类型,val为只读类型

class Person(val firstName: String, val lastName: String, var age: Int) {// ...}
      3.类的实例化(Creating instance of classes),在Kotlin中创建实例没有new这个关键字这是与Java中不同的区别:
val invoice=Invoiceval customer=Customer("EverBrilliant")
      4.类的成员:类中可包含构造方法(Constructors)和初始化代码块(initializer blocks)、方法(Functions)、成员变量属性(Properties)、内嵌类与内部类(Nested and Inner Classes)、对象声明(Object Declaration)。

二、继承(Inheritance):

    1.所有的Kotlin类都有一个共同的超类Any,在类中没有继承的父类声明时默认的超类都是Any。Any不同于Java中的Object,在它里面没有任何的成员方法

为了明确声明超类,把类型放在冒号后面:

open class Base(p:Int)class Derived(p:Int):Base(p)
    open关键字是注解于类之前与Java中final是相对的,它允许其他类继承这个类,只有在open修饰下才能被继承或是重写

    2.方法重载(Overriding Methods):在方法重载中不像Java中方法重载,Kotlin明确的注解(override)在方法重载时:

open class Base{   open fun v(){}   fun nv(){}       //没有open是不可被重写的}class Derived():Base(){    override fun v(){}}
open class AnotherDerived():Base(){   final override fun v(){}         //在此之后不可被重写}
    3.属性重载:与方法重载相类似。
interface Foo{   val count :Int}class Bar1(override val count :Int):Fooclass Bar2:Foo{     override var count:Int =0}
    4.重载的规则:在Kotlin中实现继承的规则为如果类从直接父类继承实现同一成员,必须重载这个成员并提供实现。为了标记这个方法是从哪里继承实现的我们使用super鉴定从哪个类型名以扩符号来标记:

open class A{   open fun f(){print("A")}   fun a(){print("a")}}interface B{   fun f() {print("B")}   //接口的成员默认是open   fun b(){print("b")}}class C():A(),B{   override fun f(){    super<A>.f()    //调用A.f()    super<B>.f()    //调用B.f()   }}
    5.抽象类(Abstract classes):

open class Base{     open fun f(){}}abstract class Derstract :Base(){     override abstract fun f()}
   6.Companion Object:

在Kotlin不像Java中类是没有静态方法,推荐包级函数去代替。

三、属性和方法(Properties and fileds):

   1.属性的声明: 不定的类型用使用var关键字或者只读的使用val关键字:

class Adress{   var name:String=……   //属性的定义   val street:String=}//属性的使用fun copyAdress (adress:Adress):Adress{  val result=Adress()    //创建对象Kotlin中没new  result.name=address.name   //使用属性}

   2.声明属性的全语法:

//var 属性名:[属性类型][=初始化值][get方法][set方法]var <propertyName>[:<PropertyType>] [=<property_initializer>][<getter>][<setter>]
    3.在全语法中只读(read-only)属性声明不同于可变属性:*用val去修饰 *不允许有set方法。
   4.备用属性(Backing Properties):隐式对属性值初始化声明避免了空指针。

private var _table:Map<String,Int>?=nullpublic val table:Map<String,Int>   get(){      if(_table==null){         _table=HashMap()    //参数类型是自动推导      }      return _table?:thrw AssertionError("set to null by another thread")    }
不管是备用变量或者备用属性,都是Kotlin对于空指针的一种解决方案,可以避免函数访问私有属性而破坏它的结构 。  

   5.编译时常量(Compile-Time Constants):在编译时就可以知道具体的属性值可以用const修饰,也可以当做注解时使用:

const val SUBSYSTEM_DEPRECATED:String="This subsystem is deprecated"@Deprecated (SUBSYSTEM_DEPRECATED) fun foo(){ ……}
   6.延时初始化属性(Late-Initialized Properties):

在Kotlin中,声明为具有非空类型的属性必须在构造函数中初始化,但是往往不希望在构造函数中初始化,例如在通过依赖注入或单元测试的设置方法来初始化属性的时候,不能在构造器中提供一个非空的初始化语句,为了处理这种情况,就要在属性上加lateinit关键字来延迟初始化