类字段必须初始化,编译后默认是 private,自动生成 public 的 getter/setter ; Person 示例
private val private[this]
@bean.BeanProperty
注解可生成符合 JavaBean 规范的 get/set 方法(加上默认的两个方法,共四个方法) 构造器:1 个主构造器,任意个辅构造器
this private[this] val
内部类
解决路径依赖
self =>
自身类型,区分调用的内部类和外部类的字段、方法等 用于单例及工具类方法
可继承一个 class
或多个 trait
伴生对象
Accounts.newUniqueNumber()
而不是 newUniqueNumber()
伴生对象中的 apply
方法
Object(arg1, ..., argN)
, 返回伴生类的实例,如 Array(1,2,3)
new
关键字,在嵌套表达式中很方便 应用对象
extends App
scala 默认无枚举类型
Enumeration Enumeration.Value(ID, name)
可以有抽象的和具体的方法
trait
中未实现的方法默认是抽象的 (abstract) 类可以实现多个 trait
,从最后一个开始调用
extends
关键字实现 override
关键字 trait
则对其他的 trait
使用 with
关键字 trait
使用 trait
,从最后一个开始调用 多个 trait
的情况下, super.someMethod
会根据从右向左的顺序调用下一个 trait
的方法
trait
存在抽象方法,则子 trait
需使用 abstract override
关键字,否则 super.someMethod
无法编译 trait
也有构造器
trait
从左向右,有父 trait
的先构造,共享的父 trait
只构造一次 > 子类 考虑到构造顺序,如果子类中使用抽象字段,则可使用提前定义(early definition,会在构造器之前执行)的语法讲改字段初始化
trait
可继承类,混入该 trait
的类都是被继承类的子类,子类如果有继承其他的类也必须是被继承类的子类 与自身类型(self type)比较
trait
不继承类,直接在 body 内定义 this: Type =>
,则混入的类必须是该 Type 类型的/子类型的 this: { def log(msg: String) } =>
,则混入的类必须包含结构类型中定义的方法 trait
最终会翻译成类和接口 package
包名和文件路径并不一定对应 java.lang
, scala
, Predef
始终默认会导入 collection.mutable
实际是 scala.collection.mutable
package a.b.c
与 package a { package b { package c {}}}
不同
package a
或 package b
中定义的资源可在带括号的包声明中访问,但 package a.b.c
无法访问 包对象
private[package.name]
限制资源的可见性 import
collection.mutable
import collection.mutable._
selector
import java.awt.{Color, Font} import java.util.{HashMap => JavaMap} import java.util.{HashMap => _, _}
隐式导入,默认导入三个 java.lang
, scala
和 Predef
scala
fragile base class
基类被继承之后,修改基类可能会对子类造成无法预期的影响
继承类,与 Java 一样使用 extends
关键字
final
类不能被继承, final
字段、方法不能被覆盖 override
关键字 抽象方法
abstract
关键字;子类覆盖时也可以省略 override
抽象字段
abstract
关键字,子类覆盖式也可省略 override
super
关键字 类型检查和转换, isInstanceOf
, asInstanceOf
;获取类型, classOf
protected
不同于 Java,受保护成员在包内不可见 辅助构造器不可直接调用超类构造器
覆盖字段
def
只能覆盖 def
val
只能覆盖 无参数的 def
var
只能覆盖 抽象的 var
继承层级
Any
定义了 asInstanceOf
, isInstanceOf
,判断相等,hash值等方法 AnyRef
是除基础类型外所有类的父类,等价于 java.lang.Object
wait
, notify/notifyAll
, synchronized
AnyVal
不包含任何方法,只是个值类型的标记 ScalaObject
这个标记接口,该接口无任何方法 Null
的唯一实例 null
,可分配给引用类型,但不可分配给值类型( Int
不可为 null
) Nothing
无实例,在泛型构造时有用, Nil
类型为 List[Nothing]
???
方法声明返回类型为 Nothing
, 无返回值,会抛出 NotImplementedError
,用于预留未实现的方法 Unit
代表空/ void
,类型唯一值为 ()
Any
或 AnyRef
, 当传递多个参数时,会被替换为 tuple
equals
和 hashCode
判断对象相等
equals
equals
参数类型为 Any
而不是具体的类型 ##
是 hashCode
的安全版本,遇到 null
会返回 0 而不是抛出异常 值类 Value Class
AnyVal
equals
和 hashCode
比较实际值 用于隐式转换
class a(x: Int, y: Int)
设计为 class a(x: X, y: Y)
,定义值类 X
, Y
避免混淆参数