1 如果类没有主体,则不需要花括号
class Rational(n: Int, d: Int)
n和d是类参数,Scala编译器会创建带同样参数的主构造器primary constructor
2 如果代码不在方法中,且不是字段,则Scala编译器会把这部分编译到主构造器中
//因为把println放进了主构造器,所以每次创建新的Rational实例都会调用println
class Rational(n: Int, d: Int){
println("Created " + n)
}
3 重写方法override,修改父类方法(Scala编程书中称为重载,我觉得这样翻译不行)
class Rational(n: Int, d: Int){
override def toString = n + "/" + d
}
4 precondition 先决条件,限制传递给方法或者构造器的值
使用require方法,参数布尔值,如果是false,则组织对象构造,抛出IllegalArgumentException
class Rational(n: Int, d: Int){
require(d != 0)
override def toString = n + "/" + d
}
5 将类参数添加字段
Scala编译器只会提供调用方法的对象的类参数,无法提供作为参数的对象的类参数,只有把参数对象的类参数在类中添加为字段,才可以提供
class Rational(n: Int, d: Int) { // This won’t compile
require(d != 0)
override def toString = n +"/"+ d
def add(that: Rational): Rational =
new Rational(n * that.d + that.n * d, d * that.d)//无法提供that.d和that.n,
}
class Rational(n: Int, d: Int) { // This compiles
require(d != 0)
val numer: Int = n
val denom: Int = d
override def toString = numer +"/"+ denom
def add(that: Rational): Rational =
new Rational(
numer * that.denom + that.numer * denom,
denom * that.denom
)
}
6 关键字this指向当前调用方法的对象实例
7 primary constructor之外还有辅助构造器auxiliary constructor
> 辅助构造器定义一定是def this(...)开始
> 调用主构造器或者早于自身定义的构造器,最终都是对主构造器的调用,主构造器是构建实例的唯一入口
def this(n: Int) = this(n, 1)
8 Scala允许使用合法的标识符如+ ,* 等来定义方法名,且可以使用操作符语法调用,即定义操作符
四种标识符
> 字母数字标识符
字母或者下划线开始,之后可以是字母/数字/下划线
$也是字母,但是尽量不要使用,会与Scala编译器的标识符冲突
> 操作符标识符
一个或者多个操作符字符组成,如+, ++, :::, ->
> 混合标识符
字母数字 + 下划线 + 操作符标识符 如unary_-
> 字面量标识符
用反引号``包括的任意字符串,如Thread.`yield`()
9 重载方法,修改参数类型或个数
10 隐式转换,在需要的时候Scala编译器自动把一个类型转换为另一个类型的隐式转换implicit
implicit def intToRational(x: Int) = new Rational(x)
11 Scala命名
> 避免下划线
> 驼峰式与Java一致
> 常量名和Java不一样,Java全大写,Scala使用驼峰
JAVA: X_HELLOKITTY
SCALA: XHelloKitty