scala 基礎(chǔ)語(yǔ)法
scala 與 java 的最大區(qū)別是:scala 語(yǔ)句末尾的分號(hào) ; 是可選的。
我們可以認(rèn)為 scala 程序是對(duì)象的集合,通過(guò)調(diào)用彼此的方法來(lái)實(shí)現(xiàn)消息傳遞。接下來(lái)我們來(lái)理解下,類,對(duì)象,方法,范例變量的概念:
- 對(duì)象 - 對(duì)象有屬性和行為。例如:一只狗的狀屬性有:顏色,名字,行為有:叫、跑、吃等。對(duì)象是一個(gè)類的范例。
- 類 - 類是對(duì)象的抽象,而對(duì)象是類的具體范例。
- 方法 - 方法描述的基本的行為,一個(gè)類可以包含多個(gè)方法。
- 字段 - 每個(gè)對(duì)象都有它唯一的范例變量集合,即字段。對(duì)象的屬性通過(guò)給字段賦值來(lái)創(chuàng)建。
1. 第一個(gè) scala 程序
交互式編程
交互式編程不需要?jiǎng)?chuàng)建腳本文件,可以通過(guò)以下命令調(diào)用:
$ scala welcome to scala version 2.11.7 (java hotspot(tm) 64-bit server vm, java 1.8.0_31). type in expressions to have them evaluated. type :help for more information. scala> 1 + 1 res0: int = 2 scala> println("hello world!") hello world! scala>
2. 腳本形式
我們也可以通過(guò)創(chuàng)建一個(gè) helloworld.scala 的文件來(lái)執(zhí)行代碼,helloworld.scala 代碼如下所示:
object helloworld { /* 這是我的第一個(gè) scala 程序 * 以下程序?qū)⑤敵?hello world!' */ def main(args: array[string]) { println("hello, world!") // 輸出 hello world } }
接下來(lái)我們使用 scalac 命令編譯它:
$ scalac helloworld.scala $ ls helloworld$.class????helloworld.scala helloworld.class????
編譯后我們可以看到目錄下生成了 helloworld.class 文件,該文件可以在java virtual machine (jvm)上運(yùn)行。
編譯后,我們可以使用以下命令來(lái)執(zhí)行程序:
$ scala helloworld hello, world!
3. 基本語(yǔ)法
scala 基本語(yǔ)法需要注意以下幾點(diǎn):
- 區(qū)分大小寫 - ?scala是大小寫敏感的,這意味著標(biāo)識(shí)hello 和 hello在scala中會(huì)有不同的含義。
- 類名 -?對(duì)于所有的類名的第一個(gè)字母要大寫。 如果需要使用幾個(gè)單詞來(lái)構(gòu)成一個(gè)類的名稱,每個(gè)單詞的第一個(gè)字母要大寫。 示例:class myfirstscalaclass
- 方法名稱 - 所有的方法名稱的第一個(gè)字母用小寫。 如果若干單詞被用于構(gòu)成方法的名稱,則每個(gè)單詞的第一個(gè)字母應(yīng)大寫。 示例:def mymethodname()
- 程序文件名 - 程序文件的名稱應(yīng)該與對(duì)象名稱完全匹配(新版本不需要了,但建議保留這種習(xí)慣)。 保存文件時(shí),應(yīng)該保存它使用的對(duì)象名稱(記住scala是區(qū)分大小寫),并追加".scala"為文件擴(kuò)展名。 (如果文件名和對(duì)象名稱不匹配,程序?qū)o(wú)法編譯)。 示例:?假設(shè)"helloworld"是對(duì)象的名稱。那么該文件應(yīng)保存為'helloworld.scala"
- def main(args: array[string]) -?scala程序從main()方法開(kāi)始處理,這是每一個(gè)scala程序的強(qiáng)制程序入口部分。
4. 標(biāo)識(shí)符
scala 可以使用兩種形式的標(biāo)志符,字符數(shù)字和符號(hào)。
字符數(shù)字使用字母或是下劃線開(kāi)頭,后面可以接字母或是數(shù)字,符號(hào)"$"在 scala 中也看作為字母。然而以"$"開(kāi)頭的標(biāo)識(shí)符為保留的 scala 編譯器產(chǎn)生的標(biāo)志符使用,應(yīng)用程序應(yīng)該避免使用"$"開(kāi)始的標(biāo)識(shí)符,以免造成沖突。
scala 的命名規(guī)則采用和 java 類似的 camel 命名規(guī)則,首字符小寫,比如 tostring。類名的首字符還是使用大寫。此外也應(yīng)該避免使用以下劃線結(jié)尾的標(biāo)志符以避免沖突。符號(hào)標(biāo)志符包含一個(gè)或多個(gè)符號(hào),如+,:,? 等,比如:
+ ++ ::: < ?> :->
scala 內(nèi)部實(shí)現(xiàn)時(shí)會(huì)使用轉(zhuǎn)義的標(biāo)志符,比如:-> 使用 $colon$minus$greater 來(lái)表示這個(gè)符號(hào)。因此如果你需要在 java 代碼中訪問(wèn):->方法,你需要使用 scala 的內(nèi)部名稱 $colon$minus$greater。
混合標(biāo)志符由字符數(shù)字標(biāo)志符后面跟著一個(gè)或多個(gè)符號(hào)組成,比如 unary_+ 為 scala 對(duì)+方法的內(nèi)部實(shí)現(xiàn)時(shí)的名稱。字面量標(biāo)志符為使用"定義的字符串,比如 `x` `yield`。
你可以在"之間使用任何有效的 scala 標(biāo)志符,scala 將它們解釋為一個(gè) scala 標(biāo)志符,一個(gè)典型的使用為 thread 的 yield 方法, 在 scala 中你不能使用 thread.yield()是因?yàn)?yield 為 scala 中的關(guān)鍵字, 你必須使用 thread.`yield`()來(lái)使用這個(gè)方法。
5. scala 關(guān)鍵字
下表列出了 scala 保留關(guān)鍵字,我們不能使用以下關(guān)鍵字作為變量:
abstract | case | catch | class |
def | do | else | extends |
false | final | finally | for |
forsome | if | implicit | import |
lazy | match | new | null |
object | override | package | private |
protected | return | sealed | super |
this | throw | trait | try |
true | type | val | var |
while | with | yield | ? |
- | : | = | => |
<- | <: | <% | >: |
# | @ |
6. scala 注釋
scala 類似 java 支持單行和多行注釋。多行注釋可以嵌套,但必須正確嵌套,一個(gè)注釋開(kāi)始符號(hào)對(duì)應(yīng)一個(gè)結(jié)束符號(hào)。注釋在 scala 編譯中會(huì)被忽略,范例如下:
object helloworld { /* 這是一個(gè) scala 程序 * 這是一行注釋 * 這里演示了多行注釋 */ def main(args: array[string]) { // 輸出 hello world // 這是一個(gè)單行注釋 println("hello, world!") } }
7. 空行和空格
一行中只有空格或者帶有注釋,scala 會(huì)認(rèn)為其是空行,會(huì)忽略它。標(biāo)記可以被空格或者注釋來(lái)分割。
8. 換行符
scala是面向行的語(yǔ)言,語(yǔ)句可以用分號(hào)(;)結(jié)束或換行符。scala 程序里,語(yǔ)句末尾的分號(hào)通常是可選的。如果你愿意可以輸入一個(gè),但若一行里僅 有一個(gè)語(yǔ)句也可不寫。另一方面,如果一行里寫多個(gè)語(yǔ)句那么分號(hào)是需要的。例如
val s = "碩編程"; println(s)
9. scala 包
1) 定義包
scala 使用 package 關(guān)鍵字定義包,在scala將代碼定義到某個(gè)包中有兩種方式:
第一種方法和 java 一樣,在文件的頭定義包名,這種方法就后續(xù)所有代碼都放在該包中。 比如:
package com.yapf class helloworld
第二種方法有些類似 c#,如:
package com.yapf { class helloworld }
第二種方法,可以在一個(gè)文件中定義多個(gè)包。
2) 引用
scala 使用 import 關(guān)鍵字引用包。
import java.awt.color // 引入color import java.awt._ // 引入包內(nèi)所有成員 def handler(evt: event.actionevent) { // java.awt.event.actionevent ... // 因?yàn)橐肓薺ava.awt,所以可以省去前面的部分 }
import語(yǔ)句可以出現(xiàn)在任何地方,而不是只能在文件頂部。import的效果從開(kāi)始延伸到語(yǔ)句塊的結(jié)束。這可以大幅減少名稱沖突的可能性。
如果想要引入包中的幾個(gè)成員,可以使用selector(選取器):
import java.awt.{color, font} // 重命名成員 import java.util.{hashmap => javahashmap} // 隱藏成員 import java.util.{hashmap => _, _} // 引入了util包的所有成員,但是hashmap被隱藏了
注意:默認(rèn)情況下,scala 總會(huì)引入 java.lang._ 、 scala._ 和 predef._,這里也能解釋,為什么以scala開(kāi)頭的包,在使用時(shí)都是省去scala.的。
- JDBC 教程
- JDBC 驅(qū)動(dòng)類型
- JDBC 連接數(shù)據(jù)庫(kù)范例
- JDBC 連接數(shù)據(jù)庫(kù)步驟
- JDBC Statement, PreparedStatement 和 CallableStatement
- JDBC ResultSet 結(jié)果集
- JDBC Resultset 結(jié)果集范例
- JDBC 事務(wù)保存點(diǎn)范例
- Scala 教程
- Scala 簡(jiǎn)介
- Scala 類和對(duì)象
- Scala 文件 I/O
- Spring 教程
- Spring 模塊
- Spring 依賴注入
- Spring 自動(dòng)裝配
- Spring MVC教程
- Spring MVC表單標(biāo)簽庫(kù)
- Spring security