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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值