caseclass:
也是一种class,不需要new,但是写了也没错
默认是public,可以在任何地方使用
默认实现了toString,hashCode,equals等的实现
不能被继承
提供了fatory method来方便的构造object(就是定义了参数和类型,不需要类中的构造函数了)
object:单例类,不能被new,可以直接调用方法
trait:(特征)
java通过接口实现多重继承,scala通过trait。但是trait是可以有属性和方法实现的
可以用with的方式来使用:class PianoplayingTeacher extendsPerson with TTeacherwithTPianoPlayer
Sealed:主要有两个作用
修饰trait、class只能在当前文件中被继承
修饰后scala编译器在做模式匹配的时候,会检查了所有可能的情况,减少编程错误
举例:首先要理解模式匹配和case class
下面这段代码是正确的,但是如果改为sealedabstract class A,则在编译的时候会告诉你a match缺少了对D的检查,需要增加一行就对了:case _ => throw newRuntimeException("??");
如下代码中,object是单例模式的语言层面的支持
object HelloWorld {
def main(args: Array[String]): Unit= {
println("Helloworld")
}
}
要想实现这种功能,也可以直接继承App,这样对象体中的所有代码,都会被对象调起并立即执行一次(仅执行一次)
object HelloWorldThatExtendsApp extends App{
println("Hello world")
}
package:java中包名是绝对的,scala中是相对的
串联式包
package com.horstmann.impatient {
// com和com.horstmann的成员在这里是不可见的
packagepeople {
classPerson
...
}
}
文件顶部标记
package com.horstmann.impatient
package people
class
...
// 上面的等同于
package com.horstmann.impatient {
packagepeople {
classPerson
...
}
}
import:可以出现在文件的任何地方,作用域从开始延伸到语句块的结束
import java.awt.{Color, Font}
import java.util.{HashMap =>JavaHashMap}// 重命名成员
import java.util.{HashMap => _, _} //引入了util包的所有成员,但是HashMap被隐藏了
scala总会引入java.lang._ scala._ Predef._ 最先引入java.lang,scala包会覆盖java.lang的内容,最后引入Predef包
implicit:对象类型的隐式转换,隐式参数,隐式类。如:
class A {}
class RichA(a:A) {
def rich:Unit ={
println("so rich....")
}
}
object Implicit extends App {
//隐式转换
implicit defA2RichA(a:A) = new RichA(a)
val a = newA
a.rich
//隐式参数
deftestParam(implicit name: String) = println(name)
implicit valname = "implicit name"
testParam
testParam("Sparking!!!!")
//隐式类
implicitclass Calculator(x: Int) {
defadd(a:Int): Int = x + a
}
println(2.add(3))
}
泛型:和java类似,这样声明:classResettableQueue[T],泛型的默认值可以这样用:privatevar contents:T= _。
异常声明:在函数前面声明:
@throws(classOf[JsonGenerationException])
@throws(classOf[JsonGenerationException])
@throws(classOf[IOException])
现在incognito中使用的是这种,@throws[IndexOutOfBoundsException]("当头对象不存在时")应该是引入了其他包
Unit:scala里面的Unit可以简单理解,对应到Java中的void
s:替换字符串里面的变量、执行函数、做计算等,比如:
class Person(val name: String){
def say(what: String) =s"say $what"
}
val person = new Person("Unmi")
println(s"Hello ${person.name},${person.say(person.name)}") //Hello Unmi, say Unmi
f是格式化,比如:
val height = 1.9d
val name = "James"
println(f"$name%s is $height%2.2f meters tall") // Jamesis 1.90 meters tall
raw是打印原始的字符串,比如:
println(raw"a\nb\tc") //a\nb\tc