• Scala(二)变量与数据类型


    2.1 注释

      用于注解说明解释程序的文字就是注释,注释提高了代码的阅读性。注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来,再用代码去体现。

      1)基本语法

        (1)单行注释://

        (2)多行注释:/* */

        (3)文档注释:/**  */

      2)案例实操

    package com.yuange.scala.day01
    
    object Nodes {
      def main(args: Array[String]): Unit = {
        //单行注释
        println("单行")
    
        /*
        * 多行注释
        */
        println("多行")
    
        /**
         * 文档注释
         * */
        println("文档")
      }
    }

      3) 代码规范

        (1)使用一次tab操作,实现缩进,默认整体向右边移动,用shift+tab整体向左移

        (2)或者使用ctrl + alt + L来进行格式化

        (3)运算符两边习惯性各加一个空格。比如:2 + 4 * 5。

        (4)一行最长不超过80个字符,超过的请使用换行展示,尽量保持格式优雅

    2.2 标识符的命名规范

      Scala对各种变量、方法、函数等命名时使用的字符序列称为标识符。即:凡是自己可以起名字的地方都叫标识符。

      1)命名规则

        Scala中的标识符声明,基本和Java是一致的,但是细节上会有所变化,有以下四种规则:

        (1)以字母或者下划线开头,后接字母、数字、下划线

        (2)以操作符开头,且只包含操作符(+ - * / # !等)

        (3)第一种和第二种拼接,第一种在前,二者以下划线分隔

        (4)用反引号`....`包括的任意字符串,即使是关键字(39个)也可以

      2)案例实操

    hello    // ok
    hello12 // ok
    1hello  // error
    h-b      // error
    x h      // error
    h_4      // ok
    _ab      // ok
    Int      // ok , 因为在Scala Int是预定义的字符,不推荐
    Float    // ok
    _        // error ,单独一个下划线不可以作为标识符
    Abc      // ok
    +*-      // ok
    +a       // error
    $a  // ok , 但不要让scala的标识符出现$,因为scala编译器会使用$

      3)Scala关键字(39个)

    1)package,import,class,object,trait,extends,with,type,for
    2)private,protected,abstract,sealed,final,implicit,lazy,override
    3)try,catch,finally,throw
    4)if,else,match,case,do,while,for,return,yield
    5)def,val,var
    6)this,super
    7)new
    8)true,false,null

    2.3 变量

      1)基本语法:var | val 变量名 [: 变量类型] = 变量值

        说明:在Scala中声明一个变量时,可以不指定类型,编译器根据值确定

      2)案例实操

      (1)声明变量时,类型可以省略(编译器自动推导,即类型推导)

      (2)类型确定后,就不能修改,说明Scala是强数据类型语言。

      (3)变量声明时,需要初始值

    package com.yuange.scala.day01
    
    object VariableOne {
      def main(args: Array[String]): Unit = {
        //声明变量,类型可以省略
        var age = 18
        age = 40
    
        //类型确定后就不能修改
    //    age = v1  //错误
    
        //变量声明时需要初始值
    //    var name //错误
      }
    }

      (4)在声明/定义一个变量时,可以使用var或者val来修饰,var修饰的变量可改变,val修饰的变量不可改。

    package com.yuange.scala.day01
    
    object VariableTwo {
      def main(args: Array[String]): Unit = {
        var a1 = 10 //可变
        val a2 = 20 //不可变
    
        a1 = 20 //ok
    //    a2 = 40 //错误
      }
    }

      (5)val修饰的变量在编译后,等同于加上final通过反编译看下底层代码

    package com.yuange.scala.day01
    
    object VariableThree {
      var b1 = 10 //可变
      val b2 = 20 //不可变
    
      def main(args: Array[String]): Unit = {
        b1 = 30 //ok
    //    b2 = 40 //error
      }
    }

        通过反编译软件,得到对应的底层的.class是

    package com.yuange.scala.day01;
    
    public final class VariableThree$
    {
      public static  MODULE$;
      private int b1;
      private final int b2;
      ......
    }

      (6)var修饰的对象引用可以改变,val修饰的则不可改变,但对象的状态(值)却是可以改变的。(比如:自定义对象、数组、集合等等)

    package com.yuange.scala.day01
    
    class Person{
      var name : String = "zhangsan"
    }
    
    object VariableFour {
      def main(args: Array[String]): Unit = {
        //p1属于var修饰,属性可变,本身也可变
        var p1 = new Person()
        p1.name = "lisi"
        p1 = null
    
        //p2属于val修饰,属性可变,但本身不可变
        val p2 = new Person()
        p2.name = "wangwu"
    //    p2 = null //error
      }
    }

    2.4 字符串输出

      1)基本语法

      (1)字符串,通过+号连接

      (2)printf用法:字符串,通过%传值。

      (3)字符串,通过$引用

      2)案例实操

    package com.yuange.scala.day01
    
    object CharacterString {
      def main(args: Array[String]): Unit = {
        var name : String = "李白"
        var age : Int = 18
    
        //通过+号连接
        println(name + age)
    
        //printf通过%传值
        printf("name=%s age=%d\n",name,age)
    
        //通过$引用
        println(s"name=$name age=$age")
      }
    }

    2.5 键盘输入

      在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。

      1)基本语法:StdIn.readLine()、StdIn.readShort()、StdIn.readDouble()

      2)案例实操

        需求:可以从控制台接收用户信息,【姓名,年龄,薪水】。

    package com.yuange.scala.day01
    
    import scala.io.StdIn
    
    object Input {
      def main(args: Array[String]): Unit = {
        println("请输入姓名:")
        var name = StdIn.readLine()
    
        println("请输入年龄:")
        var age = StdIn.readShort()
    
        println("请输入薪水:")
        var salary = StdIn.readDouble()
    
        println("name="+name)
        println("age="+age)
        println("salary="+salary)
      }
    }

    2.6 数据类型关系

      Scala数据类型关系总结

        1)Scala中一切数据都是对象,都是Any的子类。

        2)Scala中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象。

        3)Scala数据类型仍然遵守,低精度的值类型向高精度值类型,自动转换(隐式转换)

        4) Scala特殊的类型之Null,它只有一个实例就是Null,它是所有引用类型(AnyRef)的子类。

        5)Scala特殊类型之Nothing,是所有数据类型的子类,主要在一个函数没有正常返回值使用,因为这样我们可以把抛出的返回值,返回给任何的变量或者函数。

    2.7 整数类型(Byte、Short、Int、Long

      Scala的整数类型就是用于存放整数值的,比如12,30,3456等等。

      1)整型分类

    数据类型

    描述

    Byte [1]

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

    Short [2]

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

    Int [4]

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

    Long [8]

    64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 = 2的(64-1)次方-1

      2)案例实操

      (1)Scala各整数类型有固定的表数范围和字段长度,不受具体操作的影响,以保证Scala程序的可移植性。

    package com.yuange.scala.day01
    
    object IntTypeOne {
      def main(args: Array[String]): Unit = {
        //正确
        var a1 : Byte = 127
        var a2 : Byte = -28
    
        //错误
    //    var a3 : Byte = 128
    //    var a4 : Byte = -129
      }
    }

      (2)Scala的整型,默认为Int型,声明Long型,须后加‘l’或‘L’

    package com.yuange.scala.day01
    
    object IntTypeTwo {
      def main(args: Array[String]): Unit = {
        var a5 = 10
        println(a5)
    
        var a6 = 978643534534234L
        println(a6)
      }
    }

      (3)Scala程序中变量常声明为Int型,除非不足以表示大数,才使用Long

    2.8 浮点类型(Float、Double

      Scala的浮点类型可以表示一个小数,比如123.4f,7.8,0.12等等。

      1)浮点型分类

    数据类型

    描述

    Float [4]

    32 位, IEEE 754标准的单精度浮点数

    Double [8]

    64 位 IEEE 754标准的双精度浮点数

      2)案例实操

      (1)Scala的浮点型常量默认为Double型,声明Float型常量,须后加‘f’或‘F’。

    package com.yuange.scala.day01
    
    object InputTypeThree {
      def main(args: Array[String]): Unit = {
        //在开发中浮点行常量默认为Double型,值之后需加上‘-f’或'-F'
        var a7 = 2.4324235656786
        var a8 = 3.1242342678676
        println("a7="+a7)
        println("a8="+a8)
      }
    }

      (2)运行的结果

    2.9 字符类型(Char)

      1)基本说明

        字符类型可以表示单个字符,字符类型是Char,16位无符号Unicode字符(2个字节),区间值为U+0000到U+FFFF。

      2)案例实操

      (1)字符常量是用单引号 ' ' 括起来的单个字符。

      (2)可以直接给Char赋一个整数,然后输出时,会按照对应的unicode字符输出

    package com.yuange.scala.day01
    
    object CharTypeOne {
      def main(args: Array[String]): Unit = {
        //字符常量是用单引号 ' ' 括起来的单个字符
        var v1 : Char = 'a'
        println("v1=" + v1)
    
        //给Char类型的变量赋一个整数,输出时会按照对应的unicode字符输出
        println("v1码值=" + v1.toInt)
      }
    }

      (3)Char类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码。

    package com.yuange.scala.day01
    
    object CharTypeTwo {
      def main(args: Array[String]): Unit = {
        var b1 : Char = 99 //ok
    //    var b2 : Char = 'a' + 1 //error,Int高-->Char低
        var b3 : Char = ('a' + 1).toChar  //ok,类似于java强转
      }
    }

      (4)\t :一个制表位,实现对齐的功能

      (5)\n :换行符

      (6)\\ :表示\

      (7)\" :表示"

    package com.yuange.scala.day01
    
    object CharTypeThree {
      def main(args: Array[String]): Unit = {
        //  \t
        println("姓名\t年龄")
    
        //  \n
        println("李白\n杜甫")
    
        //  \\
        println("c:\\苍井空\\av")
    
        //  \"
        println("蔡徐坤说:\"我会唱跳rop\"")
      }
    }

    2.10 布尔类型:Boolean

      1)基本说明

        (1)布尔类型也叫Boolean类型,Booolean类型数据只允许取值true和false

        (2)boolean类型占1个字节。

      2)案例实操

    package com.yuange.scala.day01
    
    object BooleanType {
      def main(args: Array[String]): Unit = {
        var b1 : Boolean = false
        var b2 : Boolean = true
      }
    }

    2.11 Unit类型、Null类型和Nothing类型

      1)基本说明

    数据类型

    描述

    Unit

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

    Null

    null , Null 类型只有一个实例值null

    Nothing

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

    当一个函数,我们确定没有正常的返回值,可以用Nothing来指定返回类型,这样有一个好处,就是我们可以把返回的值(异常)赋给其它的函数或者变量(兼容性)

      2)案例实操

        (1)Null类只有一个实例对象,Null类似于Java中的null引用。Null可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal)

    package com.yuange.scala.day01
    
    class Cat{
    }
    
    object NullType {
      def main(args: Array[String]): Unit = {
        //null可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal)
        var a1 : Int = null //错误
        println("a1=" + a1)
    
        var cat = new Cat()
        cat = null //ok
        println("cat=" + cat)
      }
    }

        (2)Unit类型用来标识过程,也就是没有明确返回值的函数。Unit类似于Java里的void。Unit只有一个实例——( ),这个实例也没有实质意义

    package com.yuange.scala.day01
    
    object UnitType {
      def main(args: Array[String]): Unit = {
        def sayOk : Unit = { //Unit没有返回值
          println("冯提莫:我们一起学猫叫,一起喵喵喵")
        }
        sayOk
      }
    }

        (3)Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容。

    package com.yuange.scala.day01
    
    object NothingType {
      def main(args: Array[String]): Unit = {
        def test() : Nothing = {
          throw new Exception()
        }
        test
      }
    }

    2.12 数值类型间转换

    2.12.1 数值类型自动转换

      当Scala程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数值类型,这个就是自动类型转换(隐式转换)。数据类型按精度(容量)大小排序为:

      1)基本说明

        (1)自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。

        (2)当我们把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换。

        (3)(byte,short)和char之间不会相互自动转换。

        (4)byte,short,char他们三者可以计算,在计算时首先转换为int类型。

      2)案例实操

    package com.yuange.scala.day01
    
    object TypeConversion {
      def main(args: Array[String]): Unit = {
        //自动提升原则:有多种类型的数据混合运算时,系统首先将所有数据转换成精度大的数值类型,然后在进行计算
        var h1 = 1 + 2.0
        println(h1) //h1是Double类型
    
        //当把精度大的数值类型赋值给精度小的数值类型时,会报错
        var h2 : Long = 1L
    //    var y2 : Int = h2 //error
    
        //byte,short和char之间不会相互自动转换
        var h3 : Byte = 2
    //    var m : Char = h3 //error
    
        //byte,short,char三者可以计算,在计算时首先转换为int类型
        var h4 : Byte = 1
        var h5 : Char = 1
    //    var k : Short = h4 + h5   //结果类型为int
    //    var l : Short = 10 + 20 //error
        var h6 : Short = 100 //ok
      }
    }

        注意:Scala还提供了非常强大的隐式转换机制(隐式函数,隐式类等),我们放在高级部分专门用一个章节来讲解。

    2.12.2 强制类型转换

      1)基本说明

        自动类型转换的逆过程,将精度大的数值类型转换为精度小的数值类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意。

    java  :  int num = (int)2.5
    scala :  var num : Int = 2.7.toInt

      2)案例实操

      (1)当进行数据的从大——>小,就需要使用到强制转换

      (2)强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级

    package com.yuange.scala.day01
    
    object StrongTypeConversion {
      def main(args: Array[String]): Unit = {
        //当数据从大到小时,就需要强转
        var a1 : Int = 2.5.toInt  //存在精度损失
        println("a1=" + a1)
    
        //强转符只针对最近的操作数有效,可以使用小括号提升优先级
        var a2 : Int = 10 * 2.4.toInt + 4 * 13.5.toInt  //10 * 2 + 4 * 13 = 72
        var a3 : Int = (10 * 2.4 + 4 * 13.5).toInt  //78.0.toInt = 78
        println("a2=" + a2 + ",a3=" + a3)
      }
    }

      (3)Char类型可以保存Int的常量值,但不能保存Int的变量值,需要强转

      (4)Byte和Short类型在进行运算时,当做Int类型处理。

    package com.yuange.scala.day01
    
    object StrongTypeConversionTwo {
      def main(args: Array[String]): Unit = {
        //char类型可以保存Int的常量值,但不能保存Int的变量值,要强转
        var g1 : Char = 97  //ok
    //    var g2 : Char = 'a' + 1   //error
        var g3 : Char = ('a' + 1).toChar  //ok
    
        //Byte和Short类型在进行运算时,当做Int类型处理
        var u1 : Short = 6
    //    u1 = u1 - 2   //error,Int转Short错误
    
        var u2 : Byte = 33
    //    u2 = u2 +32   //error,Int转Byte错误
      }
    }

    2.13 数值类型和String类型间转换

      1)基本说明

        在程序开发中,我们经常需要将基本数值类型转成String类型。或者将String类型转成基本数值类型。

      2)案例实操

        (1)基本类型转String类型(语法:将基本类型的值+"" 即可)

        (2)String类型转基本数值类型(语法:s1.toInt、s1.toFloat、s1.toDouble、s1.toByte、s1.toLong、s1.toShort)

    package com.yuange.scala.day01
    
    object StrongTypeConversionThree {
      def main(args: Array[String]): Unit = {
        //基本数据类型转String类型:将基本数据类型的值+""即可
        var a1 : String = true + ""
        var a2 : String = 33.6 + ""
        var a3 : String = 1000 + ""
    
        //String类型转基本数据类型:调用相关API即可
        var b1 : String = "99"
        var n1 : Byte = b1.toByte
        var n2 : Short = b1.toShort
        var n3 : Int = b1.toInt
        var n4 : Long = b1.toLong
      }
    }

        (3)注意事项:在将String类型转成基本数值类型时,要确保String类型能够转成有效的数据,比如我们可以把"123",转成一个整数,但是不能把"hello"转成一个整数。

  • 相关阅读:
    查看端口有没有被占用
    微信公众号2()
    How to insert a segment of noise to music file
    puppet practice
    Docker Commands
    LempelZiv algorithm realization
    The algorithm of entropy realization
    Java network programmingguessing game
    Deploy Openstack with RDO and Change VNC console to Spice
    puppet overview
  • 原文地址:https://www.cnblogs.com/LzMingYueShanPao/p/14873126.html
Copyright © 2020-2023  润新知