Scala基础语法
Scala与Java的最大区别是:Scala语句末尾的分号是可选的
我们可以认为Scala程序是对象的集合,通过调用彼此的方法来实现消息传递,理解类,对象,方法,实例变量的概念
- 对象:对象有属性和行为,对象是一个类的实例
- 类:类是对象的抽象,而对象是类的具体实例
- 方法:方法描述的基本的行为,一个类可以包含多个方法
- 字段:每个对象都有它唯一的实例变量集合,即字段,对象的属性通过给字段赋值来创建
交互式编程
脚本形式
创建一个HelloWorld.scala的文件来执行代码
object HelloWorld{
def main(args:Array[String]){
println("Hello,World!")
}
}
执行scala的编译命令
可以看到文件夹中生成了HelloWorld.class文件
基本语法
Scala基本语法需要注意以下几点
和java差不多的
- 区分大小写:Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义
- 类名:对于所有的类名的第一个字母要大写。
如果需要使用几个单词来构成一个类的名称,每个单词的第一个字母要大写。 - 方法名称:所有的方法名称的第一个字母用小写。
如果若干单词被用于构成方法的名称,则每个单词的第一个字母应大写 - 程序文件名:程序文件的名称应该与对象名称完全匹配(新版本不需要了,但建议保留这种习惯)。
保存文件时,应该保存它使用的对象名称(记住Scala是区分大小写),并追加".scala"为文件扩展名。 (如果文件名和对象名称不匹配,程序将无法编译)。
标识符
Scala可以使用两种形式的标志符,字符数字和符号
字符数字使用字母或是下划线开头,后面可以接字母或是数字,符号‘ ’ 在 S c a l a 中 也 看 作 为 字 母 , 然 而 以 ’ ’在Scala中也看作为字母,然而以’ ’在Scala中也看作为字母,然而以’‘开头的标识符为保留的Scala编译器产生的标志符使用,应用程序应该避免使用“$”开始的标识符,以免造成冲突
Scala 的命名规则采用和 Java 类似的 camel 命名规则,首字符小写,比如 toString。类名的首字符还是使用大写。此外也应该避免使用以下划线结尾的标志符以避免冲突。符号标志符包含一个或多个符号,如+,:,? 等,比如:
- ++ ::: < ?> :->
Scala 内部实现时会使用转义的标志符,比如:-> 使用 c o l o n colon colonminus$greater 来表示这个符号。因此如果你需要在 Java 代码中访问:->方法,你需要使用 Scala 的内部名称 c o l o n colon colonminus$greater。
混合标志符由字符数字标志符后面跟着一个或多个符号组成,比如 unary_+ 为 Scala 对+方法的内部实现时的名称。字面量标志符为使用"定义的字符串,比如 x
yield
。
你可以在"之间使用任何有效的 Scala 标志符,Scala 将它们解释为一个 Scala 标志符,一个典型的使用为 Thread 的 yield 方法, 在 Scala 中你不能使用 Thread.yield()是因为 yield 为 Scala 中的关键字, 你必须使用 Thread.yield
()来使用这个方法。
Scala关键字
不是使用以下符号作为变量
Scala注释
Scala类似Java支持单行和多行注释,多行注释可以嵌套,但必须嵌套,一个注释开始符号对应一个结束符号,注释在Scala编译中会被忽略
实例
跟java一模一样
object HelloWorld {
/* 这是一个 Scala 程序
* 这是一行注释
* 这里演示了多行注释
*/
def main(args: Array[String]) {
// 输出 Hello World
// 这是一个单行注释
println("Hello, world!")
}
}
空行和空格
一行中只有空格或带有注释,scala会认为是空行忽略它
换行符
Scala是面向行的语言,语句可以用分号(;)结束或换行符。Scala 程序里,语句末尾的分号通常是可选的。如果你愿意可以输入一个,但若一行里仅 有一个语句也可不写。另一方面,如果一行里写多个语句那么分号是需要的。
val s = "菜鸟教程",println(s)
Scala数据类型
有着和Java相同的数据类型
上表中列出的数据类型都是对象,scala没有java中的原生类型,在scala是可以对数字等基础类型调用方法的
Scala字面基础量
Scala非常简单且直观,接下来我们会详细介绍Scala字面量
-
整型字面量
整型字面量用于 Int 类型,如果表示 Long,可以在数字后面添加 L 或者小写 l 作为后缀。
0
035
21
0xFFFFFFFF
0777L -
浮点型字面量
如果浮点数后面有f或者F后缀时,表示这是一个Float类型,否则就是一个Double类型的
0.0
1e30f
3.14159f
1.0e100
.1 -
布尔型字面量
布尔型字面量有true和false -
符号字面量
符号字面量被写成: '<标识符> ,这里 <标识符> 可以是任何字母或数字的标识(注意:不能以数字开头)。这种字面量被映射成预定义类scala.Symbol的实例。
如: 符号字面量 'x 是表达式 scala.Symbol(“x”) 的简写,符号字面量定义如下 -
字符字面量
在 Scala 字符变量使用单引号 ’ 来定义,如下
‘a’
‘\u0041’
‘\n’
‘\t’ -
字符串字面量
在Scala字符串字面量使用双引号“来定义
“Hello,\nWorld!”
“菜鸟教程官网:www.runoob.com” -
多行字符串的表示方法
多行字符串用三个双引号来表示分割符,格式为“”“ ”“”“
实例如下
val foo = “”“菜鸟教程
www.runoob.com
www.w3cschool.cc
www.runnoob.com
以上三个地址都能访问”"" -
Null值
空值是scala Null 类型
Scala.Null和scala.nothing是用统一的方式处理scala面向对象类型系统的某些”边界情况“的特殊类型
Null类是null引用对象的类型,他是每个引用类(继承自AnyRet的类)的子类,Null不兼容值类型 -
Scala转义字符
0到255间的Unicode字符可以用一个八进制转义序列来表示,即反斜线”\“后跟最多三个八进制,在字符或字符串中,反斜线和后面的字符序列不能构成一个合法的转义序列将会导致编译错误
object Test {
def main(args: Array[String]) {
println("Hello\tWorld\n\n" );
}
}
Scala变量
在Scala中使用关键词var声明变量,使用关键词val声明常量
声明变量,常量实例
var myVar : String = "Foo"
var myVar : String = "Too"
val myVal : String = "Foo"
变量类型声明
变量的类型在变量名之后等号之前声明,定义变量的类型的语法格式如下
var VariableName : DataType [= Initial Value]
或
val VariableName : DataType [= Initial Value]
变量类型引用
在Scala中声明变量和常量不一定要指明数据类型,在没有指明数据类型的情况下,其数据类型是通过变量或常量的初始值推断出来的。所以,如果在没有指明数据类型的情况下声明变量或常量必须要给出其初始值,否则会报错
var myVar = 10;
val myVal = "Hello, Scala!";
scala多个变量声明
Scala支持多个变量的声明
val xmax, ymax = 100 // xmax, ymax都声明为100
如果方法返回值是元组,我们可以使用val来声明一个元组
scala> val pa = (40,"Foo")
pa: (Int, String) = (40,Foo)
Scala访问修饰符
Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。
如果没有指定访问修饰符,默认情况下,Scala 对象的访问级别都是 public。
Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员
Scala方法与函数
Scala有方法与函数,二者在语义的区别很小,Scala方式是类的一部分,而函数是一个对象可以赋值给一个变量,换句话说在类中定义的函数即是方法
Scala中方法跟Java的类似,方法是组成类的一部分
Scala中的函数则是一个完整的对象,Scala中的函数其实就是继承了Trait的类的对象
Scala中使用val语句可以定义函数,def语句定义方法
class Test{
def m(x: Int) = x + 3
val f = (x: Int) => x + 3
}
方法声明
Scala方法声明格式如下
def functionName ([参数列表]) : [return type]
如果不写等于号和方法主体,那么方法会被隐式声明为抽象,包含它的类型也是一个抽象类型
方法定义
方法定义由一个def关键字开始,紧接着是可选的参数列表,一个冒号:和方法的返回类型,一个等于号=,最后是方法的主体,Scala方法定义格式如下
def functionName ([参数列表]) : [return type] = {
function body
return [expr]
}
以上代码中return type可以是任意合法的scala数据类型,参数列表中的参数可以用逗号分隔
以下方法的功能是将两个传入的参数相加并求和
object add{
def addInt( a:Int, b:Int ) : Int = {
<