Scala之对象和继承

1. 对象

1.1. 单例对象

在 Scala 中没有静态方法和静态字段,但是可以使用 object 这个语法结构来达到同样的目的。
(1) 存放工具函数和常量
(2) 高效共享单个不可变的实例
(3) 单例模式

package logging
//使用关键字object定义单例对象
object Logger {
  def info(message: String): Unit = println(s"INFO: $message")
}

单例对象的使用

//导入单例对象信息,使之在当前类可见
import logging.Logger.info

class Project(name: String, daysToComplete: Int)

class Test {
  val project1 = new Project("TPS Reports", 1)
  val project2 = new Project("Website redesign", 5)
    //调用单例对象中定义的方法
  info("Created projects")  // Prints "INFO: Created projects"
}

1.2.伴生对象

在 Scala 的类中,与类名相同并且用 object 修饰的对象叫做伴生对象,类和伴生对象之间可以相互访问私有的方法和属性,他们必须存在同一个源文件中。

class AccountInfo {
  //类的伴生对象的功能特性并不在类的作用域
  //所以不能直接用newUniqueNumber()调用伴生对象的方法
  var id = AccountInfo.newUniqueNumber()
}

object  AccountInfo {
  private var lastNumber = 0
  private def newUniqueNumber() = {
    lastNumber += 1; lastNumber
  }

  def main(args: Array[String]) {
  //相当于Java中的静态方法调用
    println(AccountInfo.newUniqueNumber())
  }

}

1.3. apply 方法

通常我们会在类的伴生对象中定义 apply 方法,当遇到类名( 参数1,...参数n )时 apply 方法会被调用。

class AccountInfo {

}

object  AccountInfo {
  private var lastNumber = 0
  private def apply(arg :Int) = {
    lastNumber = arg*2 + 1; lastNumber
  }

  def main(args: Array[String]) {
    println(AccountInfo(1))
  }

}

1.4. 应用程序对象

Scala 程序都必须从一个对象的 main 方法开始,可以通过扩展 App 特质,不写 main 方法。

object Hello extends  App{
  println("Hello World")
}

等同于

object Hello {

  def main(args: Array[String]): Unit = {
    println("Hello World")
  }

}

1.5. 提取器

带有 unapply 方法的对象,经常用在模式匹配或者偏函数中。

import scala.util.Random

object CustomerID {

  def apply(name: String) = s"$name--${Random.nextLong}"

  def unapply(customerID: String): Option[String] = {
    val name = customerID.split("--").head
    if (name.nonEmpty) Some(name) else None
  }
}
//调用apply方法创建一个对象,等价于CustomerID.apply("Sukyoung")
val customer1ID = CustomerID("Sukyoung")  // Sukyoung--23098234908
customer1ID match {
    //调用unapply方法,提取name信息
  case CustomerID(name) => println(name)  // prints Sukyoung
  case _ => println("Could not extract a CustomerID")
}

2. 继承

2.1. 扩展类和重写方法

在 Scala 中扩展类的方式和 Java 一样都是使用 extends 关键字。
在 Scala 中重写一个非抽象的方法必须使用 override 修饰符。 

2.2. 类型检查和转换

2.3. 超类的构造

下面代码定义了一个子类和一个调用超类构造器的主构造器。

class Employ(name: String, age: Int, val Salary:Double) extends Person (name,age)

下面的代码展示类的继承,以及接口的实现等。

object ClassDemo {
    def main(args: Array[String]) {
      val h = new Human
      println(h.byScala())
    }
  }
  //相当于Java的接口
  trait Coding{
    def byJava(flag : Boolean): Unit ={
      if(flag)
      {
        println("I can code by Java")
      }
      else{
          println("I can't code by Java")
      }
    }
    //未被实现的方法默认为抽象方法
    def byScala(): String
  }

  //抽象类
  abstract class Animal {
    def run(): Int
    val name: String
  }

  class Human extends Animal with Coding{

    val name = "abc"

    //打印几次"ABC"?
    val t1,t2,(a, b, c) = {
      println("ABC")
      (1,2,3)
    }

    println(a)
    println(t1._1)

    //在Scala中重写一个非抽象方法必须用override修饰
    override def byJava(flag: Boolean): Unit = {
      println("Coding by Java and Scala")
    }

    def byScala(): String={
      "coding by Scala"
    }
    //在子类中重写超类的抽象方法时,不需要使用override关键字,写了也可以
    def run(): Int = {
      1
    }

}

 

本文为原创文章,如果对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!

 

转载于:https://my.oschina.net/aibinxiao/blog/2993730

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值