[笔记迁移][Spark开发语言][Scala][6]面向对象

版权声明:Collected by Bro_Rabbit only for study https://blog.csdn.net/weixin_38240095/article/details/84104810

一、 类

ClassExample

  1. 方法与函数的定义一样,需要使用"=",对于“不需要返回”的方法,可以直接省略"="(隐式返回Unit的过程)。

  2. 没有参数且只有一条语句的方法可以省略参数列表定界()和方法体定界{}。

  3. 定义时没有括号的无参方法在外部调用时也不能加括号。

  4. 域: getter与setter的规则
    (1) 每个字段必须在定义时指定默认初始化值

    (2) 定义时未使用private修饰的var field,当Scala生成面向JVM的类时,会定义private的字段及与之对应的public getter/setter

    (3) 如果使用private修饰的var field,则自动生成与之对应的private getter/setter,需要自定义方法获取/设置该field的值

    (4) 如果定义val field,则只会生成getter

    (5) 自动生成的getter与setter分别叫做FIELDNAME,FIELDNAME_,可以对其进行重写
    redefineSetter

    (6) 如果不希望自动生成getter/setter,则将field的访问修饰符声明为private[this]
    注意:即使定义为private var,同类对象的实例之间还是可以互相访问其private var。如果不希望被其他同类实例访问,则需要声明为private[this] var
    privatethis

    (7) 让Scala自动生成Java风格的getter/setter,使用@BeanProperty标注字段,将自动生成四个方法:两种风格各一对
    AutoSG1AutoSG2

  5. 构造器(炒鸡特别)
    (1) 主构造器
    [1] Scala主构造器与类名放在一起定义,默认即无参
    [2] Scala类中没有定义在任何方法或置于任何代码块中的语句都属于主构造器的定义,这就是为什么在class域内定义字段时必须初始化
    mainConstructor
    ※ 如果主构造器定义的参数任何修饰符(var, private var, val, private[this])都没有,比如name:String,且类内部的方法使用到了,则会自动声明为private[this] name,否则链field都不会自动创建,只能作为主构造器参数列表的占位符

    [3] 同样可以在主构造器参数列表中声明默认值

    (2) 辅助构造器:类似Java构造器重载
    [1] 辅助构造器第一句必须调用主构造器或其他辅助构造器
    [2] 以this作为辅助构造器名
    sideConstructor

  6. 内部类:与Java不同,每个外部类实例的内部类都是 “自己独有” 的类
    InternalClass

二、object

  1. object,全局singleton对象(单例模式),通常保持共享“非this”的值和方法,类似Java的静态成员

  2. 第一次访问object时,才会执行object的构造器(仅一次),即那些位于object域内且不在方法域内的代码

  3. object不能定义接收参数的构造器

  4. object继承抽象类
    ExtendsAbstractClass

  5. object实现枚举
    (1) Scala 没有直接可用的Enum
    (2) 实现枚举需要extends Enumeration,并且调用Value方法来初始化枚举值
    objectEnum
    InitEnum
    EnumOps

三、伴生对象

  1. 如果有一个class,还有一个与class 同名 的object,那么这个object就是这个class的伴生对象(class是object的伴生类)

  2. 伴生类和伴生对象必须放在同一个.scala源文件中

  3. 伴生类和伴生对象可以互相访问private 域

  4. apply()
    (1) 伴生对象中定义的工厂方法,返回伴生类的新对象
    (2)Scala中,通常不会使用new创建对象,而是直接使用 “伴生类名()”,隐式调用了伴生对象的apply()的工厂方法,使创建对象更加简洁

  5. main()
    (1) Scala中的main()标准定义为def main(args : Array[String])
    (2) 除了手动编写main()之外,还可以extends App,把需要在main()中运行的代码直接作为object的“一次构造器”代码。而且使用args可以接收控制台传入的参数
    objectExtendsApp

四、 继承

  1. 关键字与Java一样,使用extends
    ExtendsExample1
    ExtendsExample2

  2. override 和 super
    (1) override必须显式声明
    (2) Scala中可以override val域及getterOverrideFiledAndGetter

  3. 类型判断与向下转型:isInstanceOf与asInstanceOf[]
    (1) 如果引用没有关联对象(为null),那么isInstanceOf一定返回false,asInstanceOf一定会返回null

    (2) 如果没有用isInstanceOf先判断对象是否为指定类的实例,就直接用asInstanceOf转换,则可能会抛出异常
    InstanceOf

  4. 确切类型:getClass 与 ClassOf
    SpecificClass

  5. 使用模式匹配函数进行匹配(仍然是多态匹配)
    match

  6. protected 与 protected[this]

  7. 父类构造器的调用
    (1) 由于Scala类中每个辅助构造器的第一行都必须调用主构造器或其他辅助构造器,因此子类的辅助构造器一定不能直接调用父类的构造器
    (2) 使用特殊语法 在子类的主构造器中调用父类的构造器
    SubClassConstructor

五、匿名内部类

定义形式与Java一致

六、抽象类

定义形式与Java一致
只要注意一点:方法签名写全!!!尤其注意返回类型

七、抽象域

  1. 如果在父类中定义了field,但没有给出初始值,则此field为抽象field
  2. Scala为var/val定义的field生成对应的getter和setter,但在父类中没有该field
  3. 子类必须覆盖抽象field,但不需要override关键字

猜你喜欢

转载自blog.csdn.net/weixin_38240095/article/details/84104810
今日推荐