类字段必须初始化,编译后默认是 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 避免混淆参数