No.1 Scala变量
以下都是手敲,根据一副文档敲出,偶尔有自己的穿插,不属于真正的原创,也没有原创链接,仅供笔者自己方便查阅
1.变量基本语法
var|val 变量名[:变量类型] = 变量值
var age = 10
var isPass =true
println(s"${age}${isPass}")//要有s才可以打印出来
1)声明变量时,类型可以省略(类型推导)
2)类型确定后,就不能更改类型
3)var修饰的变量的值可以改变
val修饰的变量的值不可以改变
设计var和val的理由
①实际编程一般很少去改变对象本身的属性,用val更好
②val没有线程安全问题,效率高
③对象需要改变,则用var
④val修饰的变量编译后,相当于加上了final
⑤var修饰的对象引用可以改变,val修饰的则不可改变,但对象的状态(值)却是可以改变的(比如:自定义对象
,数组,集合等等)【分析val的好处】
⑥变量声明时,需要初始值
默认值赋值
var age : Int = 0
var name : String = “”
+号
①当左右两边数值,就是加法
②当左右有一方为字符串,就是拼接
2.数据类型
①Scala中数据类型都是对象
②数据类型分为AnyVal和AnyRef,它们都是对象
顶级是Any
③正是因为scala复杂的类型系统才让面向对象编程和函数式编程完美的融合
以下方法的举例,语法感到神奇,所以就算是简单,我也标记一下
以下可用
object Hello {
def main(args: Array[String]): Unit = {
sayHi
}
def sayHi() : Unit ={
println("hello")
}
}
以下可用
object Hello {
def main(args: Array[String]): Unit = {
sayHi
}
def sayHi : Unit ={
println("hello")
}
}
以下可用
object Hello {
def main(args: Array[String]): Unit = {
sayHi()
}
def sayHi() : Unit ={
println("hello")
}
}
以下不可用
object Hello {
def main(args: Array[String]): Unit = {
sayHi()//错误
}
def sayHi : Unit ={
println("hello")
}
}
2.1数据类型图
①Any是所有类的父类
②一切皆为对象,AnyVal值类型,AnyRef引用类型,都是Any的子类
③Null类型是Scala的特别类型,它只有一个值null,是buttom class【底层类】,是所有AnyRef类型的子类
④Nothing类型也是bottom class【底层类】,他是所有类的子类,值可以返回任意变量或者函数,抛出异常使用很多
object Hello {
def main(args: Array[String]): Unit = {
sayHello
}
def sayHello : Nothing = {
throw new Exception("异常")
}
}
输出结果:
Exception in thread “main” java.lang.Exception: 异常
at Hello
.
s
a
y
H
e
l
l
o
(
H
e
l
l
o
.
s
c
a
l
a
:
12
)
a
t
H
e
l
l
o
.sayHello(Hello.scala:12) at Hello
.sayHello(Hello.scala:12)atHello.main(Hello.scala:9)
at Hello.main(Hello.scala)
⑤遵守低精度向高精度自动转换(implicit conversion) 隐式转换
2.2 整数类型
Byte 1
Short 2
Int 4
Long 8
①各整数类型有固定的表数范围和字段长度,不受OS(操作系统)的影响,保证可移植性
②整形默认是Int,声明Long后面需要加L或l
③使用Int,不足够大才使用Long
2.3 浮点类型
Float 4
Double 8
使用细节
①固定的范围和长度,也不受Os影响
②默认为Double,声明Float后面加 ‘f’ 和 ‘F’
③两种形式:
十进制:5.12 512.0f .512
科学计数法:5.12e2 = 5.12乘以10的2次方 5.12E-2 = 5.12除以10的2次方
④通常都使用Double,因为精度比Float高
2.4 字符类型
Char 2
16位无符号Unicode(2个字节)
区间值:U+0000 到 U+FFFF
object Hello {
def main(args: Array[String]): Unit = {
var char: Char = 'a'
val num = 1+char
println(num)
}
}
结果输出为98
原因:
1.把计算结果赋值给变量,编译器会自动类型转换和判断
2.编译器会进行范围的判定
使用细节
①char用单引号’‘括起来
②可以用转义字符’’,例子:var a = ‘\n’
③可以给Char赋值整数,输出时按照Unicode字符输出[’\u0061’97]
④Char类型是可以进行运算,相当于一个整数,因为它都有对应的Unicode码
2.5 布尔类型
boolean 1
只有true 和 false
常用在 while do-while for 中
2.6 Unit类型、Null类型和Nothing类型
Unit 和 void等同,只有一个实例值 ,()
Null null和Null只有一个实例值 null
Nothing 处于类侧能级的最低端,是任何类型的子类型
使用细节:
①null可以赋值给任何AnyRef,但是不能给AnyVal
②Unit类型用来标识过程,没有明确的返回值函数
③Nothing 通常用于异常【什么是没有正常返回值的方法的返回类型?】
3. 值类型转换
值类型隐式转换
精度小的类型自动转换为精度大的类型,就是自动类型转换(隐式转换)
细节说明
①当多种类型混合运算时,系统自动将所有数据转换成其中容量最大的数据类型,
然后进行计算。例子:1.1[double] + 1[int] => double
②精度大的向精度小的赋值,就会报错
③byte short 不会和 char 进行自动转换
④byte short char 三者可以进行计算,但是要先转为Int类型
- 高级隐式转换和隐式函数
ing
隐式函数
隐式类
强制类型转换
自动转换的逆过程就是将容量大的转成容量小的数据类型,这会造成精度降低或者溢出
object Hello {
def main(args: Array[String]): Unit = {
var num : Int = 2.5.toInt
println(num)
}
}
结果为 2
使用细节:
①从大-> 小
②仅仅只对最近的操作符有效,用小括号提升优先级
object Hello {
def main(args: Array[String]): Unit = {
var n1 : Int = 10 * 5.5.toInt + 1 * 1.9.toInt
var n2 : Int = (10 * 5.5 + 1 * 1.9).toInt
println(n1)
println(n2)
}
}
值分别为:
n1 51
n2 56
③Char类型可以保存Int的常量值,但不能保存Int的变量值,需要强转
④Byte和Short类型进行运算时,当做Int类型处理
4. 值类型和String类型的转换
基本类型转为String类型: + “”
String类型转为基本类型: toXxx方法
注意案例:
object Hello {
def main(args: Array[String]): Unit = {
var s = "12.5"
//println(s.toInt) //报错 不会将小数点截取,会抛出异常
println(s.toDouble)
}
}
结果:
Exception in thread “main” java.lang.NumberFormatException: For input string: “12.5”
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
s.toInt报错后不会继续运行
5. 标识符命名规范
命名规范基本和Java一致
1.首字符为字母,后续字符任意字母和数字,美元符号,可后界下划线_
2.数字不可以开头
3.首字符为操作符(如+ - * % ),必须后面也跟着操作符,至少一个,要不然会报错
val ++ = "hello,world!"//也可以-+*/ 但是一般不会这么用了,怪怪的
++ 就是一个变量名了~
4.用反引号可以用任意字符串,即使是关键字也可以
5.不可以单独使用_来做标识符,这是个特殊的,以下是报错信息
Error:(10, 13) missing parameter type for expanded function ((x$1) => println(x$1))
println(_)
标识符命名注意事项
1.包名,简短有意义 xxxyyyzzz
2.变量名、函数名、方法名 采用驼峰法 xxxYyyZzz