Scala--03--变量和数据类型

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 变量和数据类型
    • 1.注释
    • 2 变量和常量(重点)
    • 3 标识符的命名规范
    • 4 字符串输出
    • 5.IO 输入 输出
      • 键盘输入
      • 读写文件 IO
    • 6.数据类型(重点)
      • 回顾:Java数据类型
      • Scala数据类型
    • 7 整数类型(Byte、Short、Int、Long)
    • 8 浮点类型(Float、Double)
    • 9 字符类型(Char)
    • 10 布尔类型:Boolean
    • 11 Unit 类型、Null 类型和 Nothing 类型(重点)
      • Unit 类型
      • Null 类
      • Nothing 类型
  • 类型转换
    • 1 数值类型自动转换
    • 2 强制类型转换
    • 3 数值类型和 String 类型间转换


变量和数据类型

1.注释

Scala 注释使用和 Java 完全一样。

  • 注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来,再用代码去体现。

在这里插入图片描述

package com.atguigu.chapter02
object TestNotes {
 def main(args: Array[String]): Unit = {
 //(1)单行注释://
 println("dalang")
 
 //(2)多行注释:/* */
 /*
 println("dalang")
 println("jinlian")
 */
 
 //(3)文档注释:/**
 //*
 //*/
 /**
 * println("qingge")
 println("qingge")
 println("qingge")
 */
 }
}

2) 代码规范
(1)使用一次 tab 操作,实现缩进,默认整体向右边移动,用 shift+tab 整体向左移
(2)或者使用 ctrl + alt + L 来进行格式化
(3)运算符两边习惯性各加一个空格。比如:2 + 4 * 5。
(4)一行最长不超过 80 个字符,超过的请使用换行展示,尽量保持格式优雅

2 变量和常量(重点)

常量:在程序执行的过程中,其值不会被改变的变量

在这里插入图片描述
2)案例实操

  1. 声明变量时,类型可以省略,编译器自动推导,即类型推导
  2. 类型确定后,就不能修改,说明 Scala 是强数据类型语言。
  3. 变量声明时,必须要有初始值
  4. 在声明/定义一个变量时,可以使用 var 或者 val 来修饰,var 修饰的变量可改变,val 修饰的变量不可改。
  5. var 修饰的对象引用可以改变,val 修饰的对象则不可改变,但对象的状态(值)
    却是可以改变的。(比如:自定义对象、数组、集合等等)

在这里插入图片描述

package chapter02

import chapter01.Student

object Test02_Variable {
  def main(args: Array[String]): Unit = {
    // 声明一个变量的通用语法
    var a: Int = 10

    //(1)声明变量时,类型可以省略,编译器自动推导,即类型推导
    var a1 = 10
    val b1 = 23

    //(2)类型确定后,就不能修改,说明Scala是强数据类型语言。
    var a2 = 15    // a2类型为Int
//    a2 = "hello"

    //(3)变量声明时,必须要有初始值
//    var a3: Int

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

    var alice = new Student("alice", 20)
    alice = new Student("Alice", 20)
    alice = null
    val bob = new Student("bob", 23)
    bob.age = 24
    bob.printInfo()
//    bob = new Student("bob", 24)
  }
}

3 标识符的命名规范

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

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

在这里插入图片描述

object Test03_Identifier {
  def main(args: Array[String]): Unit = {
    //(1)以字母或者下划线开头,后接字母、数字、下划线
    val hello: String = ""
    var Hello123 = ""
    val _abc = 123

//    val h-b = ""
//    val 123abc = 234

    //(2)以操作符开头,且只包含操作符(+ - * / # !等)
    val -+/% = "hello"
    println(-+/%)

    //(3)用反引号`....`包括的任意字符串,即使是Scala关键字(39个)也可以
    val `if` = "if"
    println(`if`)
  }
}

4 字符串输出

1)基本语法
(1)字符串,通过+号连接
(2)printf 用法:字符串,通过%传值。
(3)字符串模板(插值字符串):通过$获取变量值

package chapter02

object Test04_String {
  def main(args: Array[String]): Unit = {
    //(1)字符串,通过+号连接
    val name: String = "alice"
    val age: Int = 18
    println(age + "岁的" + name + "在尚硅谷学习")

    // *用于将一个字符串复制多次并拼接
    println(name * 3)

    //(2)printf用法:字符串,通过%传值。
    printf("%d岁的%s在尚硅谷学习", age, name)
    println()

    //(3)字符串模板(插值字符串):通过$获取变量值
    println(s"${age}岁的${name}在尚硅谷学习")

    val num: Double = 2.3456
    println(f"The num is ${num}%2.2f")    // 格式化模板字符串
    println(raw"The num is ${num}%2.2f")

    // 三引号表示字符串,保持多行字符串的原格式输出
    val sql = s"""
       |select *
       |from
       |  student
       |where
       |  name = ${name}
       |and
       |  age > ${age}
       |""".stripMargin
    println(sql)
  }
}

在这里插入图片描述

5.IO 输入 输出

键盘输入

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

1)基本语法

  • StdIn.readLine()
  • StdIn.readShort()
  • StdIn.readDouble()
package chapter02

import scala.io.StdIn

object Test05_StdIn {
  def main(args: Array[String]): Unit = {
    // 输入信息
    println("请输入您的大名:")
    val name: String = StdIn.readLine()
    println("请输入您的芳龄:")
    val age: Int = StdIn.readInt()

    // 控制台打印输出
    println(s"欢迎${age}岁的${name}来到尚硅谷学习")
  }
}

在这里插入图片描述

读写文件 IO

  1. 从文件中读取数据
    在这里插入图片描述
object Test06_FileIO {
  def main(args: Array[String]): Unit = {
    // 1. 从文件中读取数据
    Source.fromFile("src/main/resources/test.txt").foreach(print)

    // 2. 将数据写入文件
    val writer = new PrintWriter(new File("src/main/resources/output.txt"))
    writer.write("hello scala from java writer")
    writer.close()
  }
}

在这里插入图片描述

  1. 将数据写入文件 (引入java的io流
import java.io.{File, PrintWriter}
import scala.io.Source

object Test06_FileIO {
  def main(args: Array[String]): Unit = {
    // 1. 从文件中读取数据
    Source.fromFile("src/main/resources/test.txt").foreach(print)

    // 2. 将数据写入文件
    val writer = new PrintWriter(new File("src/main/resources/output.txt"))
    writer.write("hello scala from java writer")
    writer.close()
  }
}

在这里插入图片描述

6.数据类型(重点)

回顾:Java数据类型

在这里插入图片描述

Scala数据类型

在这里插入图片描述

7 整数类型(Byte、Short、Int、Long)

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

1)整型分类
在这里插入图片描述
2)案例实操

  1. Scala 各整数类型有固定的表示范围和字段长度,不受具体操作的影响,以保证Scala 程序的可移植性
  2. Scala 的整型,默认为 Int 型,声明 Long 型,须后加‘l’或‘L’
  3. Scala 程序中变量常声明为 Int 型,除非不足以表示大数,才使用 Long

import chapter01.Student

object Test07_DataType {
  def main(args: Array[String]): Unit = {
    // 1. 整数类型
    val a1: Byte = 127
    val a2: Byte = -128

//    val a2: Byte = 128    // error

    val a3 = 12    // 整数默认类型为Int
    val a4: Long = 1324135436436L    // 长整型数值定义

    val b1: Byte = 10
    val b2: Byte = 10 + 20
    println(b2)

//    val b3: Byte = b1 + 20
    val b3: Byte = (b1 + 20).toByte
    println(b3)

  }
}

8 浮点类型(Float、Double)

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

在这里插入图片描述

object Test01 {
  def main(args: Array[String]): Unit = {
    // 建议,在开发中需要高精度小数时,请选择 Double
    var n7 = 2.2345678912f
    var n8 = 2.2345678912
    println("n7=" + n7)
    println("n8=" + n8)
    
  }
}

在这里插入图片描述

9 字符类型(Char)

在这里插入图片描述

1)基本说明
字符类型可以表示单个字符,字符类型是 Char。

2)案例实操
(1)字符常量是用单引号 ’ ’ 括起来的单个字符。
(2)\t :一个制表位,实现对齐的功能
(3)\n :换行符
(4)\ :表示 \
(5)" :表示"

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

    //(1)字符常量是用单引号 ' ' 括起来的单个字符。
    var c1: Char = 'a'
    println("c1=" + c1)
    //注意:这里涉及自动类型提升,其实编译器可以自定判断是否超出范围,
    //不过 idea 提示报错
    var c2:Char = 'a' + 1
    println(c2)

    //(2)\t :一个制表位,实现对齐的功能
    println("姓名\t 年龄")
    //(3)\n :换行符
    println("西门庆\n 潘金莲")
    //(4)\\ :表示\
    println("c:\\岛国\\avi")
    //(5)\" :表示"
    println("同学们都说:\"大海哥最帅\"")

  }
}

在这里插入图片描述

10 布尔类型:Boolean

1)基本说明
(1)布尔类型也叫 Boolean 类型,Booolean 类型数据只允许取值 true 和 false
(2)boolean 类型占 1 个字节。

object Test01 {
  def main(args: Array[String]): Unit = {
    var isResult: Boolean = false
    var isResult2: Boolean = true
    println(isResult)
    println(isResult2)

  }
}

在这里插入图片描述

11 Unit 类型、Null 类型和 Nothing 类型(重点)

1)基本说明
在这里插入图片描述

Unit 类型

  • Unit 类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit 类似于 Java 里的 void。Unit 只有一个实例——( ),这个实例也没有实质意义
object Test01 {
  def main(args: Array[String]): Unit = {
    def sayOk: Unit = { // unit 表示没有返回值,即 void
      println("sayOk 被调用执行")
    }

    println(sayOk)
  }
}

在这里插入图片描述

Null 类

  • Null 类只有一个实例对象,Null 类似于 Java 中的 null 引用。
  • Null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal)
object Test01 {
  def main(args: Array[String]): Unit = {
    //null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型 (AnyVal)
    var cat = new Cat();
    cat = null // 正确
    println("cat:" + cat)
  }
}

class Cat {
}

在这里插入图片描述

Null 不能赋值给值类型(AnyVal)

在这里插入图片描述

Nothing 类型

  • Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方 法不会正常返回
  • 而且由于 Nothing 是其他任意类型的子类,他还能跟要求返回值的方法兼容
    在这里插入图片描述

Nothing 应用场景

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

    def m1(n: Int): Int = {
      if (n == 0)
        throw new NullPointerException
      else
        return n
    }
    
    println(m1(5))
    println(m1(-2))
    println(m1(0))
  }
}

在这里插入图片描述

类型转换

1 数值类型自动转换

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

在这里插入图片描述

  1. 自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。
  2. 把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换。
  3. (byte,short)和 char 之间不会相互自动转换。
  4. byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型。
object Test01 {
  def main(args: Array[String]): Unit = {

    // 1. 自动类型转换
    //    (1)自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。
    val a1: Byte = 10
    val b1: Long = 2353
    val result1: Long = a1 + b1
    val result11: Int = (a1 + b1.toInt) // 强转

    //    (2)把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换。
    val a2: Byte = 10
    val b2: Int = a2
    //    val c2: Byte = b2    // error

    //    (3)(byte,short)和char之间不会相互自动转换。
    val a3: Byte = 10
    val b3: Char = 'b'
    //    val c3: Byte = b3    // error
    val c3: Int = b3
    println(c3)

    //    (4)byte,short,char他们三者可以计算,在计算时首先转换为int类型。
    val a4: Byte = 12
    val b4: Short = 25
    val c4: Char = 'c'
    val result4: Int = a4 + b4
    val result44: Int = a4 + b4 + c4
    println(result44)
  }
}

2 强制类型转换

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

在这里插入图片描述
2)案例实操

  1. 将数据由高精度转换为低精度,就需要使用到强制转换
  2. 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
    在这里插入图片描述
    在这里插入图片描述

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

1)基本说明

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

2)案例实操

  • 基本类型转 String 类型(语法:将基本类型的值+“” 即可
  • String 类型转基本数值类型(语法:s1.toInt、s1.toFloat、s1.toDouble、s1.toByte、s1.toLong、s1.toShort)
    在这里插入图片描述
    在这里插入图片描述

注意事项

在将 String 类型转成基本数值类型时,要确保 String 类型能够转成有效的数据

  • 比如我们可以把"123",转成一个整数,但是不能把"hello"转成一个整数。

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/468957.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Alma Linux - Primavera P6 EPPM 安装及分享

引言 继上一期发布的Rocky Linux版环境发布之后,近日我又制作了基于Alma Enterprise Linux 的P6虚拟机环境,同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机,请先与Oracle Primaver…

选择电能表时电流规格是否越大越好

选择电能表时,电流规格是否越大越好是一个值得深入探讨的问题。实际上,这个问题的答案并不是绝对的,而是需要根据具体的使用场景和需求来进行权衡。下面,我将从多个方面对这一问题进行详细的分析和探讨。 一、电流规格与电能表的基…

达索的有限元分析软件Abaqus 2024版本下载与安装配置

目录 前言一、安装前准备二、Abaqus 安装总结 前言 Abaqus软件是一款广泛使用的有限元分析软件,可用于模拟各种工程应用程序,包括结构、流体力学、热传递、电磁和声学等。该软件提供了广泛的建模功能和多种求解器,可以帮助工程师预测材料和结…

面试笔记——Redis(缓存击穿、缓存雪崩)

缓存击穿 缓存击穿(Cache Breakdown): 当某个缓存键的缓存失效时(如,过期时间),同时有大量的请求到达,并且这些请求都需要获取相同的数据,这些请求会同时绕过缓存系统&a…

数据集笔记:METR-la 原始数据转input/ground truth

0 问题介绍 在交通预测/时间序列预测的论文中(如论文笔记:Dual Dynamic Spatial-Temporal Graph ConvolutionNetwork for Traffic Prediction_dual dynamic spatial-temporal graph convolution ne-CSDN博客) 模型输入的是过去12个时间片的…

掌握关键技巧!音频转换精灵如何使用?

在数字媒体时代,音频格式的转换已成为日常工作中不可或缺的一部分。为了满足这一需求,市场上涌现出众多音频转换工具。其中,音频转换精灵以其强大的功能和简便的操作赢得了广泛好评。本文将为你详细介绍如何使用该软件,让你轻松完…

Compose UI 之 Segmented buttons 分段按钮

Segmented buttons SegmentedButton 是一种分段式按钮组件,它允许用户在一组相关的选项中选择一个或几个。 上图中:① 单选的分段式按钮。② 多选的分段式按钮。 分段式按钮的几个特点: 分段式按钮是带有状态的按钮,又有单选和多选之分。 从设计上将,不论是单选或是多选…

C# StableDiffusion StableDiffusionSharp 脱离python臃肿的环境

目录 说明 效果 项目 代码 下载 C# StableDiffusion StableDiffusionSharp 脱离python臃肿的环境 说明 Stable Diffusion in pure C/C github地址:https://github.com/leejet/stable-diffusion.cpp C# Wrapper for StableDiffusion.cpp github地址&#x…

SWIFT(环球同业银行金融电讯协会)详细介绍

可以说,最严厉的金融制裁之一,莫过于切断俄罗斯与SWIFT的连接。SWIFT究竟又是什么,在金融领域占据如此重要的地位?本文将从理论、实操以及技术层面展开详尽分析。 本文纲要 前言 一、SWIFT是什么 二、SWIFT的成立背景和组织架…

【13】vue2和vue3对比

vite: https://github.com/vitejs/vite 面试题:谈谈你对 vite 的理解,最好对比 webpack 说明 webpack 原理图 vite 原理图 面试题答案: webpack 会先打包,然后启动开发服务器,请求服务器时直接给予打包结果。 而 vite 是直接启动开发服务器,请求哪个模块再对该模块进行实…

自喻女“梵高”,VRAR元宇宙领域业余画手举办线上3D虚拟数字化处女展!

众所周知,梵高画作通常采用粗大的笔触和厚重的油彩,结合丰富且饱和的色彩,给人印象鲜明大胆且笔触有力,比如著名画作《向日葵》、《星月夜》和《加歇医生》中可以看出,相比传统构图规则,他更倾向于用自己的…

蓝桥杯 2023 省B 接龙数列

思路分析: 创建一个大小为10的向量 hash,用于记录以每个数字结尾的字符串数量。输入字符串数量 n。循环读取每个字符串,并更新 hash 中以当前字符串结尾的字符串数量。同时更新最大字符串数量 count。输出不可达的字符串数量,即 …

HubSpot出海CRM助力企业实现全球营销布局!

随着全球化的浪潮不断推进,越来越多的企业开始将视线投向更为广阔的国际市场,寻求新的增长点。然而,国际化拓展并非易事,企业需要构建一套有效的全球营销战略,以应对不同国家和地区的文化差异、市场需求和竞争环境。在…

漫谈5种注册中心

01 注册中心基本概念 1.1 什么是注册中心? 注册中心主要有三种角色: 服务提供者(RPC Server):在启动时,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态。 服务消费者&…

2024热门外贸独立站wordpress模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题,适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 日用百货wordpress外贸主题 蓝色大气的wordpress外贸主题,适合做日用百货的外贸公司搭建跨境电商网站使用。 …

R语言程序设计(零基础速通R语言语法和常见函数的使用)

目录 1.Rstudio中的一些快捷键 2.R对象的属性 3.R语言中常用的运算符​编辑 4.R的数据结构 向量 如何建立向量? 如何从向量里面提取元素? 矩阵 如何建立矩阵? 如何从矩阵里面提取元素? 数据框 如何建立数据框&#xf…

Flink源码解析(1)job启动,从JM到TM过程详解

网络传输模型 首先在看之前,回顾一下akka模型: Flink通讯模型—Akka与Actor模型-CSDN博客 注:ActorRef就是actor的引用,封装好了actor 下面是jm和tm在通讯上的概念图: RpcGateway 不理解网关的作用,可以先移步看这里:网关_百度百科 (baidu.com) 用于定义RPC协议,是…

Linux内存管理笔记----TLB

1. TLB介绍 TLB是Translation Lookaside Buffer的简称,可翻译为“地址转换后援缓冲器”,也可简称为“快表”。 简单地说,TLB就是页表的Cache,属于MMU的一部分,其中存储了当前最可能被访问到的页表项,其内…

移远通信,开启透明天线中的“创新密码”

近日,全球领先的物联网整体解决方案供应商移远通信正式对外宣布,其以远远领先行业的速度推出前沿技术成果——5G透明天线。该天线主体选用透明薄膜材质,具有性能优、重量轻、尺寸灵活、透明度高、环境融合度好等优势,特别适用于智…

Spring单元测试+Mockito

一,背景 单元测试基本上是开发逃不过的一个工作内容,虽然往往因为过于无聊,或者过于麻烦,而停止于项目的迭代之中,不了了之了。其实不是开发们懒,而是上头要求的测试覆盖率高,但是又没有好用的…