01_Scala基础_变量类型_运算符

举报
alexsully 发表于 2021/04/29 14:14:56 2021/04/29
【摘要】 输出格式 注释 变量类型 运算符

源文件以 ".scala" 为扩展名 ; 程序的执行入口是main()函数, 严格区分大小写
方法由一条条语句构成,语句后不需要分号;  一行有多条语句,除了最后一条语句不需要分号,其它语句需要分号

\t      :一个制表位,实现对齐的功能
\n     :换行符
\\      :一个\
\"      :一个"
\r      :一个回车  println("hello\rk"); 


Scala语言输出的三种方式

1 字符串通过+号连接(类似java)
2 printf用法 (类似C语言)字符串通过 % 传值。
3 字符串通过$引用(类似PHP)

Scala中的注释类型

单行注释    //注释文字
多行注释 /*  注释文字 */
文档注释   被工具 scaladoc 所解析,生成一套以网页文件形式体现的该程序的说明文档

变量 var | val 变量名 [: 变量类型] = 变量值

类型可以省略(类型推导)
类型确定后,就不能修改 (强数据类型)
var 修饰的变量可改变; 修饰的对象引用可以改变,  val 可改  编译后等同于加上final

/**
 * @deprecated xxx
 * @example testing coding
 */

object PrintVarTest {
  def main(args: Array[String]): Unit = {
    var name: String = "hello"
    var age: Int = 35

    // printf用法
    //字符串通过 % 传值
    //字符串通过$引用

    //1 printf + % 格式化输出
    printf("名字: %s , 年龄: %d \n", name,age)
    println("名字:" +name)

    // 2 println () $变量   输出
    println(s"名字: $name , 年龄: $age")


    // 变量 var | val 变量名 [: 变量类型] = 变量值

    //1 类型可以省略(类型推导)
    //2 类型确定后,就不能修改 (强数据类型)
    //3 var 修饰的变量可改变 val 修饰的变量不可改  编译后等同于加上final
    //4 var 修饰的对象引用可以改变
    //5 变量声明时,需要初始值

    // 编译器,动态的 (逃逸分析): 当数据生命周期很长,经常引用,会放在堆里(heap) ,如果偶尔用一下会放在栈里面(stack) 对象也可能在stack里面
    var age_var: Int = 10
    var age_var_updated = 10 //1 类型可以省略(类型推导)
    var score:Float = 70.9f // 在scala中,小数默认为Double ,整数默认为Int
    // age_var = "alex"  2 类型确定后,就不能修改 (强数据类型)

    
    val lx2 = new jiefu  //因为val 没有线程安全问题,因此效率高
    var lx = new jiefu  //4 var 修饰的对象引用可以改变
    // 3 var 修饰的变量可改变  val 修饰的变量不可改  编译后等同于加上final
    lx.age = 30
//    lx.name = "bob"  报错 val  final 不可变
  }
}


class jiefu{
  var age: Int = 29
  val name: String = "Robin"
//  var high : Double = 0  // 5 必须有初始值 不然就是抽象的
}

数据类型介绍

1 Scala中根类型是 Any ,所有类的父类
2 AnyVal(值类型) 和 AnyRef(引用类型) 不管是AnyVal还是AnyRef 都是对象,都是any的子类
3 Null 类型是特殊类型,只有一个值null, 是bottom class, 是所有Anyref类型的子类
4 Nothing  也是bottom class, 所有类的子类, 将Nothing类型的值 返回给任意变量或函数,多用于异常

数据类型列表

数据类型 描述
Byte [1]

8位有符号补码整数。数值区间为 -128 127

Short [2]

16位有符号补码整数。数值区间为 -32768 32767

Int [4]

32位有符号补码整数。数值区间为 -2147483648 2147483647

Long [8]

64位有符号补码整数。数值区间为 -9223372036854775808 9223372036854775807

Float [4]

32 , IEEE 754标准的单精度浮点数; 两种表示法:1 十进制: 10.11f,    2 科学计数法: 5.2e-2 => 5.2*10的负的二次方

Double [8]

64 IEEE 754标准的双精度浮点数; 更精确 小数点后大致7位

Char [2]

16位无符号Unicode字符, 区间值为 U+0000 U+FFFF

String

字符序列

Boolean

truefalse

Unit

表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()

Null

null

Nothing

Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。

Any

Any是所有其他类的超类

AnyRef

AnyRef类是Scala里所有引用类(reference class)的基类


数据类型介绍

1 Scala中根类型是 Any ,所有类的父类
2 AnyVal(值类型) 和 AnyRef(引用类型) 不管是AnyVal还是AnyRef 都是对象,都是any的子类
3 Null 类型是特殊类型,只有一个值null, 是bottom class, 是所有Anyref类型的子类
4 Nothing  也是bottom class, 所有类的子类, 将Nothing类型的值 返回给任意变量或函数,多用于异常

Booolean类型数据只允许取值true和false
null 可以赋值给任意引用类型(AnyRef),
null 不能赋值给值类型(AnyVal: 比如 Int, Float, Char, Boolean, Long, Double, Byte, Short)

object DataTypeTest {
  def main(args: Array[String]): Unit = {
    sayHi()
    sayHi _ ; println("xxx")  // sayHi _ 不执行
    sayHi  // 无形参 可以省略

    // char
    //当我们输出一个char类型时,他会输出该数字对应的字符(码值表 unicode)//unicode 码值表包括ascii
    var c1 : Char = 'a'
    var c2 : Char = 97
    printf(s"c1: $c1,  c2: $c2\n")   //c1: a,  c2: a

    //char 可以当做数字进行运行

    var char2: Char = 'a'
    var num = 10 + char2
    println("num=" + num + " =>" +  num.getClass) // num=107 =>int

    //1. 当把一个计算的结果赋值一个变量,则编译器会进行类型转换及判断(即会看范围+类型)
    //2. 当把一个字面量赋值一个变量,则编译器会进行范围的判定
//        var cc2: Char = 'a' + 1 //报错 require char found int
//        var cc3: Char = 97 + 1 // 报错 require char found int
        var cc4: Char = 98

  // Null & Nothing
  //Null类只有一个实例对象,null,类似于Java中的null引用。null可以赋值给任意引用类型(AnyRef),
  //不能赋值给值类型(AnyVal: 比如 Int, Float, Char, Boolean, Long, Double, Byte, Short)
    var d1 : Dog = null
//    var d2 : Double = null // 报错 an expression of type Null is ineligible for implicit conversion
    

  }
  def sayHi(): Unit = {
    println("hello")
  }
  //比如开发中,我们有一个方法,就会异常中断,这时就可以返回Nothing
  //即当我们Nothing做返回值,就是明确说明该方法没有没有正常返回值
  def sayException: Nothing = {
    throw  new Exception("Nothing 类型 抛出异常")
  }
}

class Dog {
}


1 自动类型提升 程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换(隐式转换)。
2 强转: 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转函数,但可能造成精度降低或溢出
java  :  int num = (int)2.5
scala :  var num : Int =  2.7.toInt  //对象

1 当进行数据的 从 大——>小,就需要使用到强制转换
2 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
3 Char类型可以保存 Int的常量值,但不能保存Int的变量值,需要强转
4 Byte和Short类型在进行运算时,当做Int类型处理

object DataTransAtest {
  def main(args: Array[String]): Unit = {

    var c1 : Char = 'a'
    var c2 : Int  = c1

    println("c1: " +  c1.getClass) // c1: char
    println("c2: " +  c2) // c2: 97   低精度向高精度转换  char -> int

    var i1 :Byte = 20
//    var c3: Char = i1  //type mismatch Byte 不能与 char 互转

    //1 自动类型提升:有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
    var n1 = 10
    var n2 = 1.1f
    var n3 = n1 + n2
    println(n3.getClass)  //float

    // 2 强转:自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转函数,但可能造成精度降低或溢出
    val d1 = 1.2
    val s1 = d1 + "" // + 拼接 返回字符串

    //String类型转基本数据类型 精度损失

    val s2 = "12"
    val num1 = s2.toByte; val num2 = s2.toShort
    val num12 = num1 + num2 // 返回int  类型
    val num3 = s2.toDouble ;  val num4 = s2.toLong
    var num5 = num3 + num4  //返回double类型

    //在scala中,不是讲小数点后的数据进行截取,而是会抛出异常
    val s4 = "12.5"
    println(s4.toInt) // error
    println(s4.toDouble) //  ok

  }
}


运算符  特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符 (arithmetic)是对数值类型的变量进行运算
比较运算符(关系运算符) 结果都是Boolean型,也就是要么是true,要么是false
逻辑运算符 用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个Boolean值 
赋值运算符  就是将某个运算后的值,赋给指定的变量
位运算符

算术运算符 运算 范例/结果 备注
正号 +3  => 3
- 负号 -5 => -5
 + -  加 减

num1 += 1替代 ++ ;num1 -= 1替代 num1-- 

*  /  乘除

10/3 => 3

整数之间做除法时,只保留整数部分而舍弃小数部分
% 取模(取余) 7 % 5 => 2  a % b = a - a/b * b println(-10 % -3 ) // -1 // -10 % -3 = (-10)- (3) * -3 = -10 + 9 = -1
+ 字符串拼接





关系(比较)运算符 相等于 1==2   false
== 相等于

!=  < >   不等于 

<=    >= 小等/大等





逻辑运算符


&&

逻辑与 var a = true 

(a && b))   false

|| 逻辑或 var b = false (a || b )  true
逻辑非
!(a && b) true




赋值运算符


= 赋值

+= 相加后再赋值

-= 相减后再赋值

C -= A 等于 C = C - A

*=   /=   %= 相乘/除/余 再赋值

C /= A 等于 C = C / A; C %= A 等于 C = C % A 


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。