Scala初学笔记-1

1. 什么是 Scala?
Scala, 多范式 编程语言,以JVM为运行环境的一种集成面向对象编程和函数式编程的各种特性的编程语言。
在 分布式计算,数据挖掘,Web开发 等领域应用广泛
Scala is an acronym for "Scalable Language"

2. scala环境安装
http://www.scala-lang.org/download/
解压并配置环境变量即可

命令行下的 scala:
scala相关命令:
fsc 快速编译代码的辅助命令fsc(fast scala compliler) ,使用这个命令,只在第一次使用fsc时启动JVM,之后fsc在后台运行,这样就避免每次使用scalac时都要载入相关库文件,从而提高编译速度。
scala         同 java
scalac 同 javac
scaladoc 同javadoc
scalap 反编译

HelloWorld.scala
Object HelloScala {
def main(args:Array[String]) {
println("hello world");
}
}
scalac 编译,scala 执行
*小技巧:在 计算机的路径框 中直接cmd跳入当前路径的cmd。

Scala还能作脚本
hello.txt
println("Hello"+args(0))
输入命令: scala hello.txt World

scala的REPL: Read-eval-print-loop交互式解析器(类似于mysql的cmd客户端)
在REPL环境下,可以定义和运行变量、函数、对象。
Scala IDE:
Eclipse + Scala插件
IntelliJ IDEA

3. Scala中的约定俗成与编程规范
object:指scala中的特殊的单例对象,注意不要把object翻译成对象,以免冲突
对象:指new关键字所创建的实例,和java中的对象指代同一事物
类  :和java语言指代一样
方法:和java语言指代一样,也可以叫操作
函数:指的是某种特殊的实例,与方法不能混为一谈
特质:类似java接口,但比接口强大。
字段:也叫属性。

· 标识符
符号"$"在 Scala 中也看作为字母。然而以"$"开头的标识符为保留的 Scala 编译器产生的标志符使用,应用程序应该避免使用"$"开始的标识符,以免造成冲突; 而 Java则无此冲突。
· 代码语句分割  
scala语句分割是英文分号(;)或换行,一条语句单独占一行时可省略分号,多条语句在一行时语句与语句之间的分号不可省略。
· 程序入口
def main(args: Array[String]):Unit = {
}
· App特质 (特质:类似Java接口,但比接口强大)
App特质,预先定义好了main方法,因此继承了App特质的object代码不需要主方法也可运行。
object hello extends App {
  println("hh");
}
· 关键字
关键字 可以用 单引号/双引号 引着使用
如:
val `class` = 2+5;Thread.`yield`()

和java不同的关键字 遇见再说
· 注释
和Java相同

4. Scala的类的层次结构
· 最顶层Any类,所有类的根类
Any 中定义了五个方法
final def ==(that: Any): Boolean
final def !=(that: Any): Boolean
def equals(that: Any): Boolean
def hashCode: Int
def toString: String
ps.
Any类中共包括了五个方法,其中==与!=被声明为final类型的,因此它们不能被子类重写,事实上==的真正实现是通过equals方法来实现的,而!=是通过!equals来实现的,因此如果想改变==与!=方法的行为的话,可以直接对equals进行重写。

· Any两个子类:AnyVal 和 AnyRef
AnyVal的子类对应Java的基本数据类型,多了个Unit对应 java的void关键字
AnyRef对应 java.lang.Object。
为什么不直接Java.lang.Object作为scala非值引用类型的父类呢?这是因为Scala还可以运行在其它平台上如.Net,所以它使用了AnyRef这个类,在JVM上它对应的是java.lang.Object,而对于其它平台有不同的实现。

· NULL 类型是所有AnyRef类型的子类型,即处于AnyRef类的底层,对应java中的null引用。
· Nothing是scala类中所有类的子类,它处于scala类的最底层。这里必须注意Null类型处于AnyRef类的底层,他不能作为值类型的子类。

5. Scala的 包
· 导入包
第一种和Java一样
第二种类似于C#,可以实现在一个文件中定义多个包
package com.runoob {
  class HelloWorld 
}

· 引入包
import java.awt._  // 引入包内所有成员,
import java.awt.{Color, Font} 
import java.util.{HashMap => JavaHashMap}// 重命名成员

// 引入了util包的所有成员,但是HashMap被隐藏了
import java.util.{HashMap => _, _}
**************************
注意: 1、scala中的通配符是下划线(_),不是java中的星号(*)。
2、默认情况下,Scala 总会引入 java.lang._ 、 scala._ 和 Predef._ 

6. 声明与定义
val 不变量声明 val i: Int = 2; val a, b, c: Int = 5
var 可变量声明 var str: String = “Hello scala”; var a, b, c = “Hello tom”

可以不显式定义变量的类型,scala自动类型推断

· 方法声明与定义
def methodName (arg: T): B = {} //有参有返回值
def methodName (arg: T): Unit = {} //有参无返回值
def methodName (): Unit = {} //无参无返回值
def methodName = {} //无参无返回值还可以写成这样
区别在于 调用的时候 methodName 只能写成 methodName,而 methodName()都行。
展开阅读全文

没有更多推荐了,返回首页