一、开发注意事项
1) 以 “.scala" 为扩展名。
2) 程序的执行入口是 main()函数。
3) 严格区分大小写。
4) 每个语句后不需要分号(Scala 语言会在每行后自动加分号)。
5) 如果在同一行有多条语句,除了最后一条语句不需要分号,其它语句需要分号。
常用的有 \t \n \\ \" \r
1) 字符串通过+号连接(类似 java)。
2) printf 用法 (类似 C 语言)字符串通过 % 传值。
3) 字符串通过$引用(类似 PHP)
println("hello" + age + name)
printf("name=%s sal=%f\n", name, age)
println(s"第三种方式 name=$name sal = ${age + 1}")
四、厉害的可以看下源码
五、注释(略)
六、变量
变量可以看作内存中一个数据存储空间的表示,通过变量访问到值。
声明变量后一定要初始化-->使用
scala 中,小数默认为 Double ,整数默认为 Int
var | val 变量名 [: 变量类型] = 变量值,类型可以省略(编译器自动推导,即类型推导),类型确定后,就不能修改,说明 Scala 是强数据类型语言,var 修饰的变量可改变,val 修饰的 变量不可改
判断变量类型
var a = 10
println(a.isInstanceOf[Int])
结果为true
var和val的区别及其选择
在实际编程中,我们需要创建一个对象,并改变或者读取对象的属性,不希望改变对象本身,推荐使用val,同时val是线程安全的。
如果对象需要改变,则使用var。
val dog = new Dog
dog.age = 2
dog.name = "旺财"
class Dog {
var age :Int = 0
var name:String = ""
}
val修饰的变量等同是加了final
在对象的角度看来,var修饰的对象引用是可以改变,val修饰的对象引用不可改变,但是对象属性值是可以改变(如上案例)
七、+号在使用的过程作用
两边韦数字则作运算符相加
两边字符串则相连接
八、数据类型
都是对象,没有原生类型
分为值类型anyval,引用类型anyref,两者皆为对象,在scala中根类为any,并且认为一切皆为对象
注:scala 中,如果一个方法,没有形参,则可以省略()
区别于java: 在scala中Int是一个类,既意味着类的实例可以使用很多方法
var num:Int = 10
println(num.toDouble + "\t" +num.toString)
var isPass = true
println(isPass.toString)
方法写在object中,main外
九、类型体系
1) 在 scala 中有一个根类型 Any ,他是所有类的父类.
2) scala 中一切皆为对象,分为两大类 AnyVal(值类型), AnyRef(引用类型), 他们都是 Any 子类.
3) Null 类型是 scala 的特别类型,它只有一个值 null, 他是 bottom calss ,是 所有 AnyRef 类型的子
类.
4) Nothing 类型也是 bottom class ,他是所有类的子类,在开发中通常可以将 Nothing 类型的值返回
给任意变量或者函数, 这里抛出异常使用很多.
def main(args: Array[String]): Unit = {
println(sayHello)
}
//比如开发中,我们有一个方法,就会异常中断,这时就可以返回 Nothing
//即当我们 Nothing 做返回值,就是明确说明该方法没有正常返回值
def sayHello: Nothing = {
throw new Exception("抛出异常")
}
5) 在 scala 中仍然遵守,低精度的值,向高精度的值自动转换(implicit conversion) 隐式转换
十、数据类型
整型
常用Int,查看一个类型的大小
println("long 的最大值" + Long.MaxValue + "~" + Long.MinValue)
浮点
默认double,因为精确度高,大概小数点后7位;
字符
单引号括起来,可使用转义符
boolean
适合流程控制
1) Null 类只有一个实例对象,null,类似于 Java 中的 null 引用。null 可以赋值给任意引用类型
(AnyRef),但是不能赋值给值类型(AnyVal: 比如 Int, Float, Char, Boolean, Long, Double, Byte, Short)
2) Unit 类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit 类似于 Java 里的 void。
Unit 只有一个实例,(),这个实例也没有实质的意义
3) Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返
回,而且由于 Nothing 是其他任意类型的子类,他还能跟要求返回值的方法兼容。
object UnitNullNothingDemo {
def main(args: Array[String]): Unit = {
val res = sayHello()
println("res=" + res)//返回值()
val dog: Dog = null
// val char1: Char = null //错误
println("ok~~~")
}
//Unit 等价于 java 的 void,只有一个实例值()
def sayHello(): Unit = {
}
}
class Dog {
}
十一、值类型转换
自动类型转换细节说明
1) 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后
再进行计算。 5.6 + 10 = 》double
2) 当我们把精度(容量)大 的数据类型赋值给精度(容量)小 的数据类型时,就会报错,反之就会进
行自动类型转换。
3) (byte, short) 和 char 之间不会相互自动转换。
4) byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型。
5) 自动提升原则: 表达式结果的类型自动提升为 操作数中最大的类型
强制类型转换
数据的 从 大——>小,但可能造成精度降低或溢出,格外要注意,var num : Int = 2.7.toInt
十二、值类型和 String 类型的转换
实际开发中,要将基本数据类型转成 String 类型。 或者将 String 类型转成基本数据类型
基本数据类型转成 String 类型:
语法: 将基本类型的值+"" 即可
String 类型转基本数据类型 :
语法:通过基本类型的 String 的 toXxx 方法即可
注:"1.5"不能使用toInt,会报错,应该使用toDouble
十三、命名规范(类似java 略)