scala笔记
- 程序开始
- 可以在某一个object中定义main方法
object MyObject
{
def main(args:Array[String]
{
Println("Hello world")
}
}
- 也可以通过对象扩展APP类,将代码放在构造器的方法中 (The App trait can be used to quickly turn objects into executable programs. It should also be noted that the main method will not normally need to be overridden: the purpose is to turn the whole class body into the “main method”. You should only chose to override it if you know what you are doing.)
Object MyObject extends APP {println("hello world"}
- 定义
- def defines a method
- val defines a fixed value (which cannot be modified)
- var defines a variable (which can be modified)
- val 用来声明常量,var用来申明变量
- 声明变量时候,可以不指定类型,可以通过初始化值来推断;声明值或者变量而不做初始化,会报错
var str = "hello"
- 在必要的时候可以指定变量的类型
val greeting:String = "hello"
- Scala 提供七种数值类型(Byte, Char, Short, Int, Long, Float, Double) 和 Boolean
- Scala 没有提供++和--操作,需要使用+=1 或者-=1
- 调用方法
- A function B
- A.function(B)
- 可以重载操作符
- 相比于java,调用scala的数学函数,更方便,不需要从某个类调用静态方法
- Import
Import scala.math._ (import scala开头的包时,可以省略scala前缀如: import math._)
- apply 方法.
- s(i) 表示字符串s的第i个字母
- Scala 的表达式都是有值的。
- If/else 对应的值就是
- Class AnyRef is the root class of all reference types. All types except the value types descend from this class.
函数
- 定义函数必须给定所有参数的类型
def abs(x:Double) = if (x>=0) x else -x
- 只要函数不是递归,就不需要指定函数的返回值,scala编译器通过=右边的表达式获取返回类型
- 如果函数包含多个语句,则可以使用代码块。代码块最后一个表达式的值就是函数的返回值
- 对于递归函数,必须指定函数的返回值类型。
def fac(n:Int) = if(n<0) 1 else n * fac(n-1)
- 默认参数和带名参数
- 默认参数。 Def fun(str:String, left:String = "{", right:String = "}") = left + str + right
- 带名参数。可以在调用函数时候,指定参数名称。 一旦指定函数名称,则带名参数顺序不需要和参数列表中的完全一致。 fun(left = "[", str = "hello", right = "]")
- 也可以混用 带名和未带名参数。 fun(left = "[", str = "hello")
- 变长参数。 Scala allows you to indicate that the last parameter to a function may be repeated. This allows clients to pass variable length argument lists to the function. Following is a simple example to show the concept.
Note: 变长参数在函数中是一个list,但是在函数调用时候不能传入一个list。
类
- 类中方法默认是public
- 必须初始化字段
- 主构造函数和类定义在一起。参数被编译成字段,值被初始化成传入参数的值
- 主构造函数可以被被定义成如下任意形态
- Class Person(val name:String, private var address:String)
- 可以在主构造函数中使用默认参数来避免使用更多的自定义构造函数
- 主构造函数会执行类定义中的所有语句。
- 自定义构造函数必须调用已定义的主构造函数。
Object
- Scala 没有静态方法和静态字段,可以使用Object来解决
- Object的构造函数会在Object第一次被使用的时候调用
- 如果一个对象从来没有被使用过,则构造函数不会被调用
- 不能对Object构造函数提供参数。
- 用途
- 作为存放工具函数或者常量
- 高效共享单个不变的实体
- 需要用单个实体来协调某个服务时候
- 调用apply 方法可以返回对象相对应类的实例
继承
- 使用extends扩展一个类。 可以将类或者方法声明为final,则其不能被扩展或者重写
- 重写非抽象方法,需要使用override修饰符
- 调用基类的方法,使用super关键字
- 判断某一个实例是否属于某一个给定的类,可以使用 isInstanceOf方法。如果结果为ture,则可以使用 asInstanceof方法将引用类型转化为子类的引用
apply方法
可以理解为对()操作符的重载。下面是两种不同的使用场景
1. 在class中定义apply方法
class Test { def apply(i:Int) = println(i) } var t = new Test t(2)
t(2)将会输出2
2. 用作伴生对象.
class Test { def apply(i:Int) = println(i) } Object Test { def apply() = new Test } val t = Test() t(2)
用作伴生对象可以简化我们对于class对象创建的代码冗余。 从根本上来说,伴生对象的生成并不是什么高级语法。 val t= Test() 可以看作是对object中的apply方法的调用,这里的Test指的是object Test。 apply方法返回了一个class Test对象。 所以对象t是一个class Test对象。