Scala_类和对象

目录

类的继承 

单例对象

Enumeration类 


 


import scala.beans.BeanProperty

class ChecksumAccumulator(xc: Int, yc: Int){
  // Scala 的类定义可以有参数,称为类参数,如上面的 xc, yc,类参数在整个类中都可以访问。
  // 必须初始化字段,生成面向JVM的类时候,会生成一个私有字段name和对应的公有getter、setter方法,getter,setter方法分别叫做name,name_
  private var sum=0 
  
  // val修飾的只生成getter方法
    val name = "" 
  
  // 将私有字段的getter和seeter改成公有方法
  private var privateHeigth = 0.0
  // 重新定义getter和setter
  // 定义getter
  def heigth = privateHeigth
  // 自定义setter方法的时候一定要注意scala的语法限制,签名、=、参数间不能有空格(这个非常重要)
  def heigth_=(heigth : Double) {
    privateHeigth = heigth
  }
  
  // Scala的getter和setter方法的命名与java是不同的,是field和field_=的方式
  // 如果要让scala自动生成java风格的getter和setter方法,只要给field添加@BeanProperty注解即可
  // 此时会生成4个方法
  // sex: String
  // sex_=(newValue: String): Unit
  // getSex(): String
  // setSex(newValue: String): Unit
  
  @BeanProperty var sex : String = _ 
  
  var x : Int = xc
  var y : Int = yc
  
  // 没有返回值的函数,可以省略掉=,因此如果你希望函数返回某个值,但忘了方法定义中的“=”,Scala 会忽略方法的返回值,而返回 Unit。
  def add(b:Byte) :Unit ={ 
    // 要注意的 Scala 的方法的 参数都是 val 类型,而不是 var 类型,因此在函数体内不可以修改参数b的值
    // 结尾,也不需要使用 return返回值,函数的最后一行的值就作为函数的返回值
    sum +=b  
             
  }

   def move(dx: Int, dy: Int) { // move 方法没有返回值
      x = x + dx
      y = y + dy
      println ("x 的坐标点: " + x);
      println ("y 的坐标点: " + y);
   }
  def checksum() : Int = ~ (sum & 0xFF) +1
}

object Test {
  def main(args: Array[String]) {
    val pt = new ChecksumAccumulator(10, 20);  // 使用new创建类的对象
    // 移到一个新的位置
    pt.move(10, 10);
  }
}

类的继承 

Scala继承一个基类跟Java很相似, 但我们需要注意以下几点:

  1. 重写一个非抽象方法必须使用override修饰符,以及重写父类属性也必须使用override修饰符。
  2. 只有主构造函数才可以往基类的构造函数里写参数。
  3. 在子类中重写超类的抽象方法时,你不需要使用override关键字。
  4. 可以使用super关键字,显式地指定要调用父类的方法
class Point(val xc: Int, val yc: Int){
  var x: Int = xc
  var y: Int = yc
  def move(dx: Int, dy: Int): Unit ={
    x = x + dx
    y = y + dy
    println("x点的坐标是:" + x)
    println("y点的坐标是:" + y)
  }
  
  var name = ""
  override def toString = getClass.getName + "[name=" + name + "]"
}
class Location(override val xc: Int, override val yc: Int,
               val zc: Int) extends Point(xc, yc){  // 继承   重写了父类的字段
  var z: Int = zc
  def move(dx: Int, dy: Int, dz: Int){
    x = x + dx
    y = y + dy
    z = z + dz
    println("x点的坐标是:" + x)
    println("y点的坐标是:" + y)
    println("z点的坐标是:" + z)
  }
  
  var salary = 0.0
  override def toString = super.toString + "[salary=" + salary + "]"
}
object Test{
  def main(args: Array[String]): Unit = {
    val loc = new Location(10, 20, 30)
    loc.move(10, 10 ,5)、
    loc.name = "lc"
    loc.salary = 35000.0
    println(loc)
  }
}

单例对象

在 Scala 中,是没有 static ,但是它也为我们提供了单例模式的实现方法,就是使用关键字 object。

对象的无参构造器在第一次使用时被调用,且单例对象没有有参构造器。

Enumeration类 

scala并没有提供枚举类,而是通过对象继承Enumeration类实现枚举类,并且调用Value方法来初始化枚举值。

object Test extends Enumeration{
      val name = Value(0, "name_0")
      val sex = Value(1, "man")
      val age = Value(2, 30)    
}

object app{
    println(Test(0)) //通过id查询
    println(Test.withName("man"))  // 通过name查询

    for(el <- Test.values){
       println(el)  
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值