[译]Scala类
2017-05-03 本文已影响9人
steanxy
Scala中的类用于创建对象。类中可以包含方法,值,变量,类型,对象,特征以及类,统称为成员。类型,对象和特征稍后介绍。
定义类
最简单的类定义只有关键字class
和一个标识符。类名应该大写。
class User
val user1 = new User
关键字new
用于创建类的实例。因为没有定义构造函数,所以User
类有一个默认的不带参数的构造函数。不过,多数时候你会想要构造函数和类主体。下面定义了示例类Point
:
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) // prints (x, y)
Point
类包含4个成员:变量x
,y
以及方法move
和toString
。和很多语言不同的,主构造函数在类的签名(var x: Int, var y: Int)
中。move
方法带两个参数并返回Unit
值()
,不承载任何信息.类似Java这类语言中的void
。toString
不带任何参数但是返回一个String
值。因为toString
重写了AnyRef
的toString
,所以需要用override
关键字标记。
构造函数
构造函数可以通过提供默认值来包含可选参数,像这样:
class Point(var x: Int = 0, var y: Int = 0)
val origin = new Point // x and y are both set to 0
val point1 = new Point(1)
println(point1.x) // prints 1
在这个版本的Point
类,x
和y
都有默认值0
,所以没有参数是必须要传的。不过,由于构造函数从左到右读取参数,所以如果你想只传y
的值,需要使用命名参数。
class Point(var x: Int = 0, var y: Int = 0)
val point2 = new Point(y=2)
println(point2.y) // prints 2
这也是提高清晰度的好方法。
私有成员和Getter/Setter语法
成员默认是公有的,使用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
这个版本的Point
类,数据存储在私有变量_x
和_y
中。方法def x
和def y
用于访问私有数据。def x_=
和def y_=
用于验证并设置_x
和_y
的值。注意setter的特殊语法:在getter标识符后附加_=
的方法,后面紧跟着参数。
带val
和var
的主构造函数参数是公有的。不过,val
是不可变的,所以你不能像下面这样写。
class Point(val x: Int, val y: Int)
val point = new Point(1, 2)
point.x = 3 // <-- does not compile
不带val
和var
的参数是私有值,只在类中可见。
class Point(x: Int, y: Int)
val point = new Point(1, 2)
point.x // <-- does not compile