初學scala,和java存在很多不一致,有很多奇葩的語法,在日常使用中,可能自己不會這么寫,但是很多存在於源碼中,看源碼的時候,經常看的一臉懵逼,因此在此總結部門差異點,部分。
文件名
- java要求文件名和公共類名必須要求一致,scala不要求。
即
java: test.java -> public class test{}
scala: test.scala -> class xxx(任意){}
關鍵字
-
scala 中沒有public關鍵字,默認訪問權限就是public
-
scala中沒有void關鍵字,因為scala是完全面向對象的語言,所以采用特殊的對象來模擬:Unit
def main(args:Array[String]):Unit ={
}
方法和函數
scala中對函數和方法的聯系和區別:
Scala 有函數和方法,二者在語義上的區別很小。Scala 方法是類的一部分,而函數是一個對象可以賦值給一個變量。換句話來說在類中定義的函數即是方法。
我們可以在任何地方定義函數,甚至可以在函數內定義函數(內嵌函數)。更重要的一點是 Scala 函數名可以有以下特殊字符:+, ++, ~, &,-, – , , /, : 等
- 方法定義的參數順序不同,scala把參數類型放在之后
java中定義方法規則
public String test(String param){
}
scala中定義方法規則
def test(param:String):String = {
}
- scala的方法里面也可以聲明方法
object test{
def main(args:Array[String]):Unit = {
def test(): Unit={
}
}
}
- java中包含方法重載,scala中同一作用域不能有同名函數,即使函數參數不一致
object Test {
def main(arg: Array[String]): Unit = {
def test():Unit={
}
// 會報錯,不允許通過
def test(s:String):Unit={
}
}
4.傳遞多參數的時候,java用 ... scala使用*
public test(String args...){
}
def test(args:String*):Unit={
}
5.scala 在函數定義時,可以給定默認參數。
def test(param1:String = "morenzhi"):Unit={
}
但是默認參數推薦放參數列表后面,否則需要確保后面的無默認值參數從左到右能匹配到,
另外可以使用帶名參數傳遞參數
//聲明 默認值在前
def test1(param1:String = "t1",param2:String):Unit={
}
//調用 帶名參數
test1(param2="t2")
//從左到右都給了參數
test1("t1","t2")
異常
java的異常和scala的異常大體相同,catch的實現有些小區別
java異常:
try{
}catch(RuntimeException e){
}catch(Exception e){
}finally{
}
scala的異常:
try{
}catch{
case e:RuntimeException
case e:Exception =>
}
類和對象
-
scala類的定義和java一致,在屬性初始化的時候有些區別
java的屬性初始化時,若不指定初始值,jvm會補充上
scala初始化用 _ 代替,注意是var變量
var str:String = _ var num:Int = _
-
scala和java的包聲明方式默認方式一致,但是有其他使用方式
-
在同一個源碼文件中,可以多次聲明。聲明的類在最后的那個包中
java:
package com.lucky.test package test //會出問題
scala: 即源碼中的類所在位置不需要和包路徑相同
package com.lucky package test class Emp{ } //最終會組合,其中的Emp會在 com.lucky.test 中
-
scala中的所有語法都可以進行嵌套,package也可以嵌套.
如果有{} ,那么{}中聲明的類在這個包中,之外的不在這個包中
package test1{ package test2{ } }
-
scala中可以聲明父包和子包,父包中的類,子類可以直接訪問,不需要引入,和作用域一致
package test1{ class Emp{ } package test2{ object User{ def main(arg: Array[String]): Unit = { //可以訪問 val emp = new Emp } } } }
-
package中可以聲明類,但是不能聲明變量和函數(方法)
但是scala為了彌補包的不足,加入了包對象概念
package test1{ package object Emp{ val username = "object" } package test2{ object User{ def main(arg: Array[String]): Unit = { //可以訪問 println(Emp.username) } } } }
-
-
import
scala也使用import導入類,但也有些區別,在scala中
-
import可以在任意地方使用
-
導入一個包中所有的類,采用下划線
//java import java.lang.*
//scala import java.lang._
-
導入同一個包中部分類,用{}和, 組合
//java import java.util.ArrayList import java.util.HashMap
//scala import java.util.{ArrayList,HashMap}
-
import隱藏指定的類
//隱藏方式 {類名=>_} import java.util.{Date=>_}
-
import 可以導包
import java.util
-