1. Scala中的超类Any
在Scala中,Any类是所有类的超类,Any有两个子类:AnyVal和AnyRef
1.1 AnyVal
- AnyVal是所有值类型的基类,它描述的是值,而不是代表一个对象。
- 它包括9个AnyVal子类型:
- scala.Double
- scala.Float
- scala.Long
- scala.Int
- scala.Char
- scala.Short
- scala.Byte
- 上面是数字类型,还包括scala.Unit和scala.Boolean是非数字类型。
1.2 AnyRef
- 是所有引用类型的基类。除了值类型,所有类型都继承自AnyRef。
2. Scala中方法和函数的区别
- 函数可作为一个参数传入到方法中,而方法不行。
- 在Scala中无法直接操作方法,如果要操作方法,必须先将其转成函数,有两种方法可以将方法转成函数
- 在方法名称后面紧跟一个空格和下划线告诉编译器将方法转成函数;
- 通常情况下,编译器会自动将方法转换成函数,例如一个应该传入一个方法。编译器会自动将传入的方法转换成函数。
- 函数必须要有参数列表,而方法可以没有参数列表。
- 在函数出现的地方我们可以提供一个方法;在需要函数的地方,如果传递一个方法,会自动进行ETA展开(把方法转换为函数)
如果我们直接把方法赋值给变量会报错。如果我们指定变量的类型就是函数,那么就可以通过编译。
当然我们也可以强制把一个方法转换给函数,这就用到了scala中的部分应用函数; - 函数是继承了trait,他就具有toString,apply,curried,~;方法不具有这些特性;
- 函数定义的的时候,需要传递形式参数,但是再函数中,传递函数的参数个数有限制,最多能传递22个参数。
3. class和object
- class可以new
- 每个辅助构造器执行必须以主构造器或者其他辅助构造器的调用开始
- 因此子类的辅助constructor是一定不可能直接调用父类的constructor的;
- object
- 相当于java中的静态代码块,单例的
- 存放静态的field或者method
- 有apply()方法,伴生类(参数…)会调用这个方法,创建一个伴生类对象。