系列文章目录
文章目录
一、变量和常量
2.1注释
//单行注释
/*
多行注释
*/
/**
* 文档注释 在idea中 敲 /**回车自动生成
*/
2.2常量和变量
- java 中
变量类型 变量名称 = 初始值 int a = 10
final 常量类型 常量名称 = 初始值 final int b = 20
- scala中
var 变量名 [:变量类型] = 初始值 var i:Int = 10
val 常量名 [:常量类型] = 初始值 val j:Int = 10
注意: 能用常量的地方不用变量
- 声明变量时 ,类型可以省略,编译器自动推导
- scala是强类型语言,类型确定后就不能修改
- 变量声明时,必须要有初始值
- 可以用var/val修饰,但val修饰的变量不可更改
- var 修饰的对象引用可以改变,val 修饰的对象则不可改变,但对象的状态(值) 却是可以改变的。(比如:自定义对象、数组、集合等等)
2.3标识符命名规范
-
字母或者下划线开头,后接字母、数字、下划线 。
如果时下划线开头后面必须跟内容
如hello12
Int(关键字可以,但不推荐)
h_4(单独的下划线不可以) -
以操作符开头,且后面只能跟操作符(+ - * /#!等)
如 /+ * #1不可以 -
用 `` 包括任意字符串,可以是Scala关键字
2.4字符串输出
- +号连接
- printf用法,通过%传值
- 字符串模板(插值字符串):通过$获取变量值
- “”"实现多行字符串
def main(args: Array[String]): Unit = {
var name:String = "ytm"
var age:Int =20
var sal:Float= 1000.5f
var salD:Double = 2000
println("姓名 "+name+"薪资 :"+sal)
///这里是printf 不是println
printf("姓名:%s 年龄:%d\n",name,age)
//注意这里必须有s
println(s"姓名: ${name} 薪资:${sal+2}")
println(
s"""
|"姓名 "${name}
|"年龄" ${age}
|""".stripMargin)
}
2.5键盘输入
StdIn.readLine()、StdIn.readShort()、StdIn.readDouble()
案例 从控制台接受用户信息(姓名 年龄 薪资)
import scala.io.StdIn
object TestOperate {
def main(args: Array[String]): Unit = {
var name = StdIn.readLine()
var age = StdIn.readShort()
var sal = StdIn.readDouble()
println(name + " " + age + " " + sal)
}
}
2.6数据类型
- Scala中一切数据均对象,Any是所有对象的父类
- Scala数据类型分两类:AnyVal(数值类型)、AnyRef(引用类型)
- 低精度的值类型向高精度值类型转换(自动转换,隐式转换)
- Scala中StringOps是对Java中String增强
- Unit :对应Java中的void,
用于方法返回值的位置
,表示没有返回值。Unit是一个数据类型
只有一个对象,就是()
,Void不是数据类型,是一个关键字 - Null是一个类型,只有一个对象-null.
它是所有引用类型(AnyRef)的子类
Null可以赋值给任意引用类型(AnyRef),但不能赋值给 数值类型
(AnyVal) Nothing是所有数据类型的子类
,主要用在一个函数没有明确返回值,可以返回任何的变量或者函数
2.7整数类型(Byte Short Int Long )
- scala 各类型有固定范围和字段长度,不受具体操作的影响
- Scala的整型,默认为Int,声明Long类型,需要加
l
或L
- Scala程序中
变量声明为Int型
,除非不足以表示大数,才使用Long(超出Int范围会编译报错)
2.8浮点类型(Float Double)
- Scala的浮点类型默认为Double型,声明为Float须加
f
或者F
val n8 = 2.2345678912f //n7=2.2345679
val n9 = 2.2345678912 //n8=2.2345678912
2.9字符类型(Char)
只能是单个字符,用 单引号括起来
2.10 布尔类型:Boolean
布尔类型也叫Boolean 类型,Booolean 类型数据只允许取值 true 和 false
boolean 类型占 1 个字节。
2.11 Unit 类型、Null 类型和Nothing 类型(重点)
2.12 类型转换
- Unit类似Java中的void ,没有返回值。Unit 只有一个实例——( ),这个实例也没有实质意义
def sayOk : Unit = {// unit 表示没有返回值,即 void
}
println(sayOk)
输出: ()
-Null类只有一个实例对象,Null类似于Java中的null引用。Null可以赋值给任何引用类型(AnyRef),但不能赋值给数值类型(AnyVal)
- Nothing,可以作为没有正常返回值的方法的返回类型
def test(): Nothing = {
throw new Exception()
}
test()
2.12类型转换
Java中的
public static void main(String[] args) {
byte b = 127;
test(b);
}
public static void test(byte b) {
System.out.println("bbbbb");
}
public static void test(short s) {
System.out.println("sssss");
}
public static void test(char c){
System.out.println("ccccc");
}
public static void test(int i){
System.out.println("iiii");
}
输出:bbbbb
2.12.1 数值类型自动转换
Scala 程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数值类型(隐式转换)
数据类型按精度(容量)大小排序为:
Byte->Short->Int ->Long ->Float->Double
Char->Int
把精度大的数值类型赋值给精度小的数值类型时,就会报错
(byte,short)和 char 之间不会相互自动转换。
byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型。
2.12.2 强制类型转换
精度大的数值类型转换为精度小的数值类型。使用时要加上强制转函数,但可能造成精度降低或溢出
强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
//(1)将数据由高精度转换为低精度,就需要使用到强制转换
val num : Int = 2.7.toInt
println(num)// 这个存在精度损失
//(2)强转符号只针对于最近的操作数有效,
//往往会使用小括号提升优先级
var r1:Int = 10*3.5.toInt + 6*1.5.toInt
var r2 = (10*3.5+6*1.5).toInt
println("r1= "+r1+ " r2= "+r2)
2.12.3 数值类型和String 类型间转换
- 基本类型转 String 类型(语法:将基本类型的值+“” 即可)
- String 类型转基本数值类型(语法:s1.toInt、s1.toFloat、s1.toDouble、s1.toByte 、s1.toLong、s1.toShort)
var str1:String = true + ""
var str2:String = 4.5 + ""
var str3 :String = 100 + ""
var s1:String = "12"
var n1 :Byte = s1.toByte
var n2:Short = s1.toShort
var n3:Int = s1.toInt
var n4:Long = s1.toLong
var n5:Int = "12.60".toInt
var n5:Int = "12.6".toInt 会出现NumberFormatException 异常。
扩展面试题
var n:Int = 128
var b:Byte = n.toByte
println(b)//-128
n = 130
b = n.toByte
println(b)//-126
1000 0000 为当前字节范围的最小值,约定为-128
负数补码:符号位不变,其它位取反+1
130:1000 0010 -> 1111 1101 -> 1111 1110 = -126