1.val 和var都是用来定义变量的,用val定义的变量是不可变的,初始化之后,值就固定下来。用var来定义的变量是可变的,修改多次也没关系。在scala中应该尽量优先使用val
for (i <- 1 to 3){
print(i + “,”)
}
i 是一个val ,每次循环都会产生一个新的val。这里的to 是一个方法,1 to 3 ,相当于 1.to(3)
更scala风格的方法是:
(1 to 3).foreach(i => print(i + “,”))
=> 是将左边的参数和右边的具体实现分开
scala的双重循环:
for (i <- 1 to 3; j <- 1 to 3) print((10 * i + j) + ” “)
// Prints 11 12 13 21 22 23 31 32 33
在循环体中,还可以嵌套处理语句
for (i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j) + ” “)
// Prints 12 13 21 23 31 32
或
for (i <- 1 to 3; from = 4 - i; j <- from to 3) print((10 * i + j) + ” “)
// Prints 13 22 23 31 32 33
2.Java 基本类型对应的Scala类
scala一切为对象:
val a = 20
建立了一个Scala的Int实例
scala的富封装类: RichInt,RichDouble,RichBoolean,它们可以在基本类型无法满足的时候,转换为相应的类型。
3.元组和多重赋值
元组是一个不变的对象序列,可以用逗号分开创建,下面是一个3个对象的元组
(“apple”,”blanana”,”orange”)元组是可以赋值给其他变量的。
4.字符串与多行原始字符串
scala的字符串就是java.lang.String,可以按照Java的方式使用字符串。Scala可以自动把String转换为scala.runtime.RichString
创建多行字符串”“” sdfsfsffds…….”“”
4.自适应的默认做法:
支持脚本,无需将所有的代码都放到类里
return是可选的。如果符合方法声明的返回类型,方法会自动返回最后求值得表达式
分号可选
类和方法默认是public
优化异常
优化javabean
默认情况下,scala会导入 java.lang scala scala.pref(包含了类型,隐式转换,以及scala中的常用方法)
5.运算符重载
6.一些区别
scala的赋值运算的结果是Unit, a = b =c 这样的语句在scala中是错误的。
Java中,基本类型中 == 是比较值, 对象中 == 是比较对象是否指向同一个对象,对象比较值是否相等的时候要用equals方法。 而在scala中 ,无论类型如何,==都是比较值得大小,而如果想比较他们的引用,则需要用eq()方法
分号是 可选的
scala 实例方法里可以访问任何类实例的私有字段和方法,也可以限制为当前实例。
scala中的protected
scala中被protected修饰的成员只对本类以及派生类可见。同一个包的其他类无法访问这些成员。而且派生类只可以访问本类内的protected成员。scala对派生类的保护更加严格
peckage automobile
class Vechile{
protected def checkEngine(){}
}
class Car extends Vechile{
def start(){ checkEngine() //OK}
def tow(car : Car){
car.checkEngine() //ERROR
}
def tow(vechile: Vechile){
vechile.CheckEngine() //ERROE
}
}
class GasStation{
def fillGas(vechile : Vechile)
vechile.checkEngine() //ERROR
}
}
细粒度访问控制
避免显示使用return
第二章scala的类
scala是一种纯面向对象的语言,不支持静态方法,但是相似功能的语法是:伴生对象(companion object)。伴生对象是一个与类相伴的单利对象,比如说Actor就是Actor类的伴生对象–在并发编程里经常用到。
1.定义字段,方法和构造函数
class CreditCard(val number : Int ,var creditLimit : Int )
它的编译结果是:
public class CreditCard extends java.lang.Object implements scala.
ScalaObject{
private final int number,
private int creditLimit,
public CreditCardd( int , int)
public void creditLimit_
eq(int)publicintcreditLImit()publicintnumber()publicint
tag()
}
短短的一句话,就把构造函数和成员变量交代清楚。放在类定义中的任何表达式或者可执行语句都会作为主构造函数的一部分来执行。
- 构造函数
主构造函数:
副构造函数
副构造函数的第一句要不是调用主构造函数,要么是调用其他副构造函数,两者二选其一。
最常用的副构造函数是this。
class Person(val firstName:String, val lastName, String){
private var position :String=_(下划线代表的是该类型的默认值,比如Int 就是0,Double 就是0.0 但是这些便利并不适合val 类型的变量,这些变量 不能修改,必须要在初始化的时候设定值)
println(“Creating ” + toString())
def this(firstName: String, lastName: String, positionHold: String){
this(firstName, lastName)
position = positionHold
}
override def toString(){
firstName + ” ” +lastName +” holds ” + position + ” position”
}
}
val john = new Person(“John ” ,”Smiths”,” Analyst”)
println(john)
3.类继承
重写方法需要加override
只有在主构造方法才能往基类构造函数中传参数
4.单例对象
单例对象是值得是只能有一个实例的类。创建单利对象只需要使用object关键字。单实例对象无法初始化,所以不能给它的主构造函数传递参数