1.基础概念
- 基本概念
- 类 : 同一类型对象的抽象,例如人,星球,车等等
- 对象 : 类的具体实例,包含属性和方法,例如某个人,某个星球,某量车等
- 属性 : 用来描述对象的某些特征,例如人的年龄,姓名等
- 方法 : 用来描述对象的某些功能,例如人会吃饭,学习等等
- 文件以.scala结尾
- 主程序入口 : def main(args: Array[String]): Unit{ }
- 标识符
- 兼容java标识符命名规范
- 类名大驼峰,变量名小驼峰
- 新增了关键字 yield,所以使用yield方法的时候要加上反引号 例如: Thread.yield
- 关键字
- 注释
- 兼容java注释,并支持注释的嵌套结构
- 换行符
- 可以使用分号结尾或者回车结尾,注意:多条命令之间一定用分号分隔
- 引入包
- 引入单个类:import java.util.Date;
- 引入包下所有类:import java.util._;
- 引入包下若干类(选择器):import java.util.{Date,HashSet,HashMap}
- 引入类后重命名:import java.util.{Date => OldDate}
- 隐藏包下的部分成员:import java.util.{Date=>,}
- 默认包引入为:java.lang.、scala.、Predef._,默认引入的包的情况下其内类的使用均不需要加上包名。
2.数据类型
注意:所有的数据都是对象,没有基本数据类型
- Any : 所有类的父类
- AnyRef : 所有引用类的基类
- AnyVal : 所有值类型的基类
- Nothing : 所有类的子类
- Null : 空引用
- Unit : 空值,与java中的void一样
- 九大值类型(AnyVal)
- 整数型
- Byte
- Short
- Int
- Long
- 浮点型
- Float
- Double
- 字符型
- Char
- 布尔型
- Boolean
- 空
- Unit
- 整数型
- 数据类型关系图
3.常量与变量
常量
定义 : 在程序运行过程中不会发生变化的量叫做常量
使用方法 : 使用val声明常量
变量
定义 : 在程序运行过程中会发生变化的量叫做变量
使用方法 : 使用var来声明变量
显式声明
var name:String = "mizui"
//公式 var或者val 变量名:变量类型 = 值
隐式声明
var name = "mizui"
//公式 var或者val 变量名 = 值
//scala支持类型推断,所以可以这样写,是不是很方便
4.访问修饰符
- 类型:
- private
- protected
- public
- 与java的区别:
- 这里少了默认的访问修饰符
- scala的对象默认的修饰符是public
- private
- 仅在类的内部可见
- 注意: 在嵌套的情况下,外层类甚至无法访问内层类的私有成员
- protected
- 比java的更严格,仅子类可以访问,同包下的不可访问
- public
- 与java一样
- 作用域保护机制
- private[x],即为"这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是 private。
- protected[x],即为"这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是 protected。
5.运算符
包括5中运算符
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
运算符优先级
6.控制语句
- if … else …
- 与java相同
- 循环
- while
- 与java相同
- do … while
- 与java相同
- while
- for
//简单的遍历
for(i <- 0 to 10) println(i)
//输出结果为0-10
//until关键字
for(i <- 0 until 10) println(i)
//输出结果为0-9
//by关键字
for(i <- 0 to 10 by 2) println(i)
//输出结果0,2,4,6,8,10
//带条件输出
for(i <- 0 to 10 if(i%2==0)) println(i)
//输出结果:0,2,4,68,10
//遍历链表
var list = List(1,2,3)
for(x <- list) println(x)
//输出结果:1,2,3
//yeild关键字
var list2 = for(x <- list if(x%2==0)) yeild x
//会将结果赋值给list2
7.函数
scala 的 函数是一个对象,可以作为参数或者返回值传递
使用val 和 def 定义
函数的定义
定义格式
def functionName ([参数列表]) : [return type] = {
function body
return [expr]
}
- 相关说明
- 如果不写等于号和方法主体,则方法会被隐式声明为"抽象方法",包含它的类型于是也是一个抽象类型。
- return type 可以是任意合法的 Scala 数据类型,如果函数没有返回值,可以返回为 Unit,这个类似于 Java 的 void
- 调用
- 与java一样
- 函数的高级编程写法(具体请见:scala值函数的高级编程写法)
- 传名调用
- 指定参数名调用
- 参数默认值
- 可变长参数
- 递归函数
- 高阶函数
- 内嵌函数
- 匿名函数
- 偏应用函数
- 函数柯里化
8.闭包
概念
闭包是个函数
该函数在执行的过程中调用了外部的变量
示例
object TestCloseFunction {
var factor = 1000
def salaryMoney(i: Int): Int = {
return i * factor
}
def main(args: Array[String]) {
println("月薪 salaryMoney(8) value = " + salaryMoney(8))
println("月薪 salaryMoney(10) value = " + salaryMoney(10))
TestCloseFunction.factor = 10000;
println("年薪 salaryMoney(8) value = " + salaryMoney(8))
println("年薪 salaryMoney(10) value = " + salaryMoney(10))
}
}
9.字符串
概念
完全与java.lang.String对等
可变字符串
var str = "hello"
不可变字符串(StringBuilder)
var str = new StringBuilder
常用函数
获取字符串长度
length()
字符串连接
+或者concat
字符串格式化,与c的类似
printf()
10.数组
概念
一种用来存储相同类型元素的顺序存储结构
使用
静态数组
def main(args: Array[String]): Unit = {
var programLanguageArray = Array("java", "python", "c++", "c", "php")
for (program <- programLanguageArray) {
println(program);
}
}
动态数组
def main(args: Array[String]): Unit = {
var programLanguageArray = new Array[String](5)
// var programLanguageArray:Array[String] = new Array[String](5)
programLanguageArray(0) = "java";
programLanguageArray(1) = "python";
programLanguageArray(2) = "c++";
programLanguageArray(3) = "c";
programLanguageArray(4) = "php";
for (program <- programLanguageArray) {
println(program);
}
}
多维数组
//需要手动引入这个包
import Array.ofDim;
//创建一个4x4的矩阵
var myMatrix = ofDim[Int](4, 4)