scala与java的区别_Scala学习笔记及与Java不同之处总结
Scala與Java具有許多相似之處,但又有許多不同。這里主要從一個Java開發人員的角度,總結在使用Scala的過程中所面臨的一些思維轉變。這里只是總結了部分兩種語言在開發過程中的不同,以后會陸續更新一些切換后在開發過程中值得注意的地方。下面列舉了部分,但令人印象深刻的Scala語言的不同之處,具體的代碼示例及詳細闡述見下文。
Scala中可直接調用Java代碼,與Java無縫連接;
語句可以不用“;”結束,且推薦不適用“;”;
變量聲明時以var或val開頭,可不必指定變量類型,編譯器可推斷變量類型;
函數可以不定義返回值類型(特殊情況除外);
函數返回值可不用return返回;
無參函數定義及調用時,函數名后可不跟括號;
數組訪問下標使用括號,而不用中括號;
元組使用“._n”的方式訪問元素,n從1開始;
……。
指定Main函數
在Java中運行程序,只要指定入口的Main函數即可。一個工程中可以有多個Main函數,每個類內都可以定義Main函數。但是與Java不同的是,Scala工程中,只有定義在object中的Main函數才能作為程序入口,下圖中定義在class中的Main函數是無法作為程序入口的。
要想程序能夠執行,需要如下圖所示,將Main函數定義在object中。在Scala中,class同Java中的類一樣,但是Scala中沒有static類型的類,與此同時,Scala中提供了一種object的定義方式,通過這種方式定義的“類”類似于Java中的static類,使用時不需要new相應的對象,直接使用外面能訪問的變量和函數。object中定義的方法也類似于static方法,直接通過object名訪問。
變量和字段聲明
與Java中定義變量不同,在Scala中變量是通過“var|val 變量名 [: 類型] = 值”這種方式聲明和定義的。在聲明字段的時候,可以使用編譯器自動推斷類型,即不用寫“ : 類型”,比如
var i : Int = 2;
或直接
var i = 2;1
2
3
var和val的區別是:var聲明的變量的值之后還可以改變,而val聲明的變量只能在聲明時賦值,之后不能改變該變量的值(類似只讀變量,但不是常量)。Scala的函數式編程更推薦使用val。
類的定義及不同
如下圖所示,在Scala中也是通過class關鍵字定義類,看起來與Java中類似。在Scala類中默認的訪問符是public,如果不明確的寫明private或其他訪問符,則類里的成員默認都是可以公開訪問的。
但是Scala在構造函數方面與Java存在許多不同,Scala類中包括主構造器和附屬構造器。Scala中類的主構造器:主構造器直接跟在類名后面,主構造器中的參數會被編譯成類的字段;主構造器執行的時候會執行類中的所有不包含在方法體中的語句;如果在主構造器函數的參數中沒有用val或者var去聲明變量,那此時的變量是private[this]級別的,只能夠被類內部訪問。Person類的主構造器如下圖所示,主構造器中的參數name和age會被作為Person類的兩個成員變量,未被包含在任何方法內部的打印語句會作為主構造器中的語句被執行。
由于上圖中定義的age沒有使用val或var修飾,所以會被作為private類型的成員變量使用,這類變量只能在類內部訪問。因此如下圖所示,name能在類外部訪問,而age不能被外部訪問。
以上是主構造器的情況,Scala中還包括一類附屬構造器,即除主構造器外的其他構造函數,附屬構造器有以下特點:附屬構造器是用this來聲明的;附屬構造器中必須調用主構造或者其它附屬構造器。如下圖所示為附屬構造器的例子。
特別的函數定義
Scala中的函數定義與Java中有所區別,總體來說如下這種方式,返回值類型在參數列表后面通過“: 類型”這種方式指定,然后通過“=”承接函數體。對于無返回值類型的,類型可以寫“Unit”(類似Java中的void),對于函數體簡單的,“=”后面可直接接語句,不用“{}”。
與Java不同的是,語句塊或函數返回值可以不用顯示的通過“return”語句返回,一般塊的最后一個表達式的值就是函數的返回值。因此上述函數可修改為下面的形式。
同變量聲明不需要顯示指定類型相同(變量可以推斷變量類型),所以函數也可以推斷返回類型,因此可以簡寫成如下所示:
然而,需要注意的是:如果函數使用return返回,那么必須明確指定函數的返回類型;此外如果是遞歸函數,也需要指定返回類型。下圖所示為通過“return”返回的函數,函數定義時沒有指定返回類型,編譯器報錯。
對于函數參數列表為空的,定義時函數名后可以不跟“()”,使用時也可以不跟“()”,如下圖所示:
數組及元組的使用
兩種數組定義如下圖所示,與Java不同的是需要用到Array關鍵字。同Java中一樣,數組長度不可變,數組元素可變。
Scala中數組通過下標對元素訪問的方式如下圖所示,主要通過2種方式,第一種是通過“arr(i)”這種方式,與Java中不同,Java中主要通過“arr[i]”這種方式訪問。這是因為在Scala中,任何操作符都是函數調用的方式進行的。此外還提供了“arr.apply(i)”這種訪問方式。
數組賦值和修改可通過下面兩種方式進行,第一種適合代碼顯示賦值和修改,第二種適合程序運行階段根據條件對特定元素賦值和修改。
對于數組的遍歷可通過以下2種方式。其中第一種注意for循環的to也會取到;第二種遍歷方式是通過foreach的方式傳遞匿名函數,如果數組元素需要指定類型,需要用“(item : String)”括號括起來,如果處理代碼較復雜,可用“{}”語句塊表示。
Scala中元組的定義和元素訪問如下所示,定義時直接使用“()”將不同的類型的若干變量或字面值包圍起來即可。值得注意的是,對于元組元素通過“._n”的方式進行訪問,且n從1開始計數。
參考
總結
以上是生活随笔為你收集整理的scala与java的区别_Scala学习笔记及与Java不同之处总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php mysql redis mq_d
- 下一篇: idea 调节背景护眼_夜间用电脑亮瞎眼