Scala(2)-类

Scala是面向对象的语言。类是创建对象的模板。

定义一个类

最简单的类定义只有一个class 关键字和一个表示类名的标识符。类名首字母要大写。

class User

val user1 = new User

关键字new用于创建类的一个对象。上面例子中,因为没有特意定义一个构造器,所以User类有个不含参数的默认构造器。
下面我们再看一个比较完整的类的定义:

class Point(var x: Int, var y: Int) {

  def move(dx: Int, dy: Int): Unit = {
    x = x + dx
    y = y + dy
  }

  override def toString: String =
    s"($x, $y)"
}

val point1 = new Point(2, 3)
point1.x  // 2
println(point1)  // (2, 3)

这个叫做Point的类有4个成员:变量x、y和方法move、toString。和许多其它语言不同的是,Scala的主构造器在类签名处 (var x: Int, var y: Int)。move 方法接收两个整型参数并返回一个Unit类型的值(),类似于Java或C中返回void。toString方法不接收任何参数但返回一个String类型的值。由于toString方法重写了父类AnyRef 中的toString方法,一次前面有个override关键词。

构造器

可以为构造器提供默认参数,像下面这样:

class Point(var x: Int = 0, var y: Int = 0)

val origin = new Point  // x和y都是0
val point1 = new Point(1)
println(point1.x)  // 1
class Point(var x: Int = 0, var y: Int = 0)
val point2 = new Point(y=2)
println(point2.y)  // 2

私有成员和Getter/Setter

类成员默认访问权限是public的。使用private 访问限定符可以将类成员隐藏起来,类外面不可见。

class Point {
  private var _x = 0
  private var _y = 0
  private val bound = 100

  def x = _x
  def x_= (newValue: Int): Unit = {
    if (newValue < bound) _x = newValue else printWarning
  }

  def y = _y
  def y_= (newValue: Int): Unit = {
    if (newValue < bound) _y = newValue else printWarning
  }

  private def printWarning = println("WARNING: Out of bounds")
}

val point1 = new Point
point1.x = 99
point1.y = 101 // prints the warning

在上面的例子中,数据保存在私有变量_x_y中。通过方法def xdef y 来访问私有数据,也就是说它们是Getter方法。def x_= def y_= 用于对_x_y 进行验证和设置,它们是Setter方法。注意Setters的特殊语法:在Getter方法标识符后面缀上_= ,然后再接上参数。

主构造器中有valvar修饰的参数是public的。此外,由于vals关键字表示不可变,我们不能这样写:

class Point(val x: Int, val y: Int)
val point = new Point(1, 2)
point.x = 3  // 试图修改不可变对象,报错

没有valvar修饰的参数是私有的,仅在类内可见。

class Point(x: Int, y: Int)
val point = new Point(1, 2)
point.x  // 编译不过
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值