Scala中的字面量与Java中的基本一样,只有String类型略有差别。
例如:
val i =1 (普通数字)
val i = 0xf(16进制)
val i = 35L(long)
val big = 1.2345 浮点数
val big = 1.2345el
val big = 1.2345E45
字符串:
Scala中的转义字符与Java一致例如:
\n 换行
\t 制表
等等
同时使用 反斜杠进行转义
对于大量转义字符及换行的字符串可以使用三个双引号,例如:
val stringSample = """Welcome to
Scala, "Hello World" """
但是这样输出的结果是:
Welcome to
Scala, "Hello World"
非常忠实的把字符串输出了,这种时候我们可能需要左对齐,可以使用|进行对其,例如:
val stringSample = """|Welcome to
|Scala, "Hello World" """
在使用的时候就会输出:
Welcome to
Scala, "Hello World"
====操作符======================================
在Java中,操作符是不能重载的,因此大家需要编写很多看上去很丑的函数来实现操作符的效果,在Scala中,所有的函数都可以像操作符一样使用,例如 +,-
以及之前介绍的for循环中的to和until。
因为Scala中调用单参数的方法可以不写括号,调用成员函数可以不写. 所以看上去就像是操作符一样,例如:
[java]
- class A(X : Int){
- def add(y :Int) = new (X + y)
- }
这里的类的定义似乎和标准的类定义不一样,有一个函数,其实这只是一种简写的方法,他的作用是增加一个名为X的字段,并在构造函数中为其赋值,类似于:
[java]
- class A{
- var X = 0
- def A(x : Int) { X = x }
- def add(y :Int) = new (X + y)
- }
这只能说是类似,因为第二种定义中的X是可变的,而第一种方法中X是val类型的。
这样就可以在A的成员中使用方法add了,例如,a1变量是A类型,则:
val a3 = a1.add(5)
但这不是我们想要的效果不是,根据Scala的规则,我们可以省略 add 和 . 则,最后变成了:
val a3 = a1 add 5
嗯,看上去舒服多了,但是用add总觉得还是不是很舒服不是,我们把函数名换为 + 就好了:
[java]
- class A(X : Int){
- def +(y :Int) = new (X + y)
- }
然后就可以这样使用了:
val a3 = a1 + 5
嗯,好看多了不是,其实这句话是编译成: val a3 = (a1).+(5)
只是我们省略了其中的一些括号和.
有人这时候就会想,如果我把参数调过来会怎么样呢:
val a3 = 5 + a1
这种时候就会报错了,因为在Int类型中,找不到 +(A)的方法,这种时候我们可以使用Scala的隐式转换,在你需要起作用的范围内增加一个函数定义:
inplicit def intToA(X:Int) = new A(x)
则,在使用
val a3 = 5 + a1 就可以了
需要注意的是,隐式转换可以带来很多的方便,但也会扰乱我们代码的可读性,所以怎么使用需要自己把握了。
数学运算及逻辑操作,
常用的数学运算符与Java中一样,都是+,-,*,/,%
逻辑运算符则包含了 >,<.>=,<=,!
其中需要说明的是!操作符,因为与其他的操作符不太一样,它是前置操作符,例如 !(a == ""), 所以在定义前置操作符的时候,方法名需要以 unary_开头,也就是说以unary_开头的函数可以作为前置函数使用。
例如 : -3,!true
位操作符:&,^,~
对象的相等性
scala中对象相等性的对比与C#更为接近,我们知道Java中的 == 操作符对比的是两个变量的内存位置是否一致,而Scala中则是调用equals方法。
Scala中的内存指针的比较请使用 eq 与 nq 两个方法
下面一节会讲述标准的继承与特质(类似于接口的东西)