private
字段,生成 private 的 getter/setterval
字段,只生成 getterprivate[this]
字段,不生成 getter/setter@bean.BeanProperty
注解可生成符合 JavaBean 规范的 get/set 方法(加上默认的两个方法,共四个方法)this
,只是参数不同private[this] val
字段self =>
自身类型,区分调用的内部类和外部类的字段、方法等class
或多个 trait
Accounts.newUniqueNumber()
而不是 newUniqueNumber()
apply
方法
Object(arg1, ..., argN)
, 返回伴生类的实例,如 Array(1,2,3)
new
关键字,在嵌套表达式中很方便extends App
Enumeration
帮助类实现Enumeration.Value(ID, name)
内部类, ID 依次累加, 默认 0 开始;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
只构造一次 > 子类trait
可继承类,混入该 trait
的类都是被继承类的子类,子类如果有继承其他的类也必须是被继承类的子类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
基类被继承之后,修改基类可能会对子类造成无法预期的影响
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 而不是抛出异常AnyVal
equals
和 hashCode
比较实际值class a(x: Int, y: Int)
设计为 class a(x: X, y: Y)
,定义值类 X
, Y
避免混淆参数原文:https://www.cnblogs.com/yuanzam/p/11610109.html