【Scala入门】scala基础语法:类和对象,变量和常量

2023-10-26

上一篇请移步【Scala入门】Scala下载及安装(Windows)以及Idea创建第一个scala项目_水w的博客-CSDN博客

目录

一、Scala

二、Scala基础语法

2.1 注释与标识符规范

2.2 变量与常量

【案例:变量声明和赋值】

2.3 object

【案例:伴生对象,val通过对象来改变属性】

【案例:重写构造函数,对象中的apply方法】


一、Scala

  • Scala基于JVM, 和Java完全兼容, 同样具有跨平台,可以执行好,方便的垃圾回收等特性;
  • Scala是一种纯粹的面向对象语言;
  • Scala是一门函数式编程语言;
  • Scala对集合类型数据处理有非常好的支持

Spark的底层用Scla编写, 深入学习Spark必定要掌握Scala。

二、Scala基础语法

注意

  • scala中每行后面都会有分号自动推断机制,不用显式写出“;”
  • 建议在scala中,类名首字母大写 ,方法首字母小写,类和方法命名建议符合驼峰命名法

2.1 注释与标识符规范

(1)注释:

//  	1.单行注释

/* */ 	2. 多行注释

/** 	3. 文档注释
*
**/

(2)标识符命名规范:

  • 字母下划线开头,后跟字母数字下划线,和C/C++/Java一样。
  • 操作符开头,且只包含(+-*/#!等),也是有效的标识符。这样用会用什么奇怪的好处吗?答案是灵活到天顶星的运算符重载。
  • 用反引号包括的任意字符串,即使是同39个Scala关键字同名也可以。
var _abc:String = "hello"
val -+/%# = 10
val `if` = 10
println(_abc)
println(-+/%#)
println(`if`)

关键字:

  • package import class obejct trait extends with type for
  • private protected abstract sealed final implicit lazy override
  • try catch finlly throw
  • if else match case do while for return yield
  • def var val
  • this super
  • new
  • true false null
  • 其中Java没有的关键字:object trait with implicit match yield def val var

字符串:

  • 类型:String
  • +号连接
  • *字符串乘法,复制一个字符串多次
  • printf格式化输出
  • 字符串插值:s"xxx${varname}"前缀s模板字符串,前缀f格式化模板字符串,通过$获取变量值,%后跟格式化字符串。
  • 原始字符串:raw"rawstringcontents${var}",不会考虑后跟的格式化字符串。
  • 多行字符串:""" """
  • 输出:print printf println ...
    val name: String = "Pyrrha" + " " + "Nikos"  // +号拼接字符串
    val age = 17
    println((name + " ") * 3)  // 将一个字符串复制多次进行拼接
    printf("%s : dead in %d\n", name, age) // printf:前缀f格式化模板字符串,通过$获取变量值,%后跟格式化字符串
    print(s"$name : dead in ${age}") // 字符串插值:前缀s模板字符串,通过$获取变量值
    val power = 98.9072
    println(f" : power ${power}%.2f.") // 取小数后2位

2.2 变量与常量

Scala有两种类型的变量:

  • 关键字 var 声明的变量,值是可变的
  • 关键字 val 声明的变量,也叫常量,值是不可变的

 

注意

  • 变量的类型如果能够通过变量值推断出来,那么可以省略类型声明;
  • 变量必须进行显示初始化;
  • 一般默认为val类型变量;

案例:变量声明和赋值

object HelloWorld {
  def main(args: Array[String]): Unit = {
    // 定义方法 main ==  def 方法名(参数名: 参数类型):返回值 ={}
    println("hello world")

    //1. 类型推导; 声明变量时, 类型可以忽略, 编译器会自动推导;
    var a1 = 10;
    var a2: Int = 10;
    var b3 = "areusb?";
    val c5 = false;

    //2. 强类型语言; 变量/常量的数据类型确定后, 就不能再修改
    var e3: Int = 250;
    e3 = "feswgf"; // 编译器不会对此句报错, 执行时才会报错 type mismatch

    //3. 声明变量时必须有初始值,否则报错;
    var e4: Int;

    //4. var可变, va不可变
    var f4 = 6;
    f4 = 9;
    val f5 = 100;
    f5 = 200; // 编译器当场报错;
  }
}

控制台中输出结果:

2.3 object

scala 中的object是单例对象,相当于java中的工具类,可以看成是定义静态的方法的类。

如果在同一个文件中,object对象和class类的名称相同,则这个对象就是这个类的伴生对象,这个类就是这个对象的伴生类。可以互相访问私有变量。

案例:伴生对象,val通过对象来改变属性

  • object不可以传参数;
  • scala中的class类默认可以传参数,默认的传参数就是默认的构造函数。重写构造函数的时候,必须要调用默认的构造函数;
  • class类中的属性默认有setter和getter方法;
package test

class Student(name: String, var age: Int) {
  def printInfo(): Unit = {
    println(name + " " + age + " " + Student.school)
  }
}

// 引入 object 伴生对象/单例对象,所有的私有属性都可以互相访问
object Student {
  val school: String = "atguigu"

  def main(args: Array[String]): Unit = {
    val alice = new Student(name = "alice", age = 19)
    alice.age = 24
    alice.printInfo()
  }
}

控制台中输出结果: 

案例:重写构造函数,对象中的apply方法】

  • scala中的class类默认可以传参数,默认的传参数就是默认的构造函数。重写构造函数的时候,必须要调用默认的构造函数;
  • 使用object时,不用new;使用class时要new ,并且new的时候,class中除了方法不执行(不包括构造),其他都执行

  • 对象中的apply方法:object中不可以传参,当创建一个object时,如果传入参数,那么会自动寻找object中的相应参数个数的apply方法;
package com.yt.test

class Person(xname: String, xage: Int) {
  val name = xname
  var age = xage
  var gender = 'M'
  println("----------- Person Class -----------") // new时,class中除了方法不执行(不包括构造),其他都执行

  def this(yname: String, yage: Int, ygender: Char) {
    this(yname, yage)  // 类中重写构造时,构造中第一行要调用默认的构造函数
    this.gender = ygender
  }

  def sayName() = {
    println("sayName:", ClassAndObj.name) // 调用object静态属性
  }
  println("************ Person Class ************")
}

object ClassAndObj {
  println("----------- ClassAndObj object -----------")
  val name = "wangwu" // object静态属性,相当于java的工具类

  def apply(s: String, age: Int) = {
    println("name is " + s + ",age" + age)
  }

  def main(args: Array[String]): Unit = {
    val p1 = new Person("zhangsan", 19)
    val p2 = new Person("zhangsan", 19, 'F')
    p1.age = 200
    println(p1.name, p1.age)
    p1.sayName()
    println(p2.name, p2.age, p2.gender)

    ClassAndObj("lisi", 500)
  }

}

控制台中输出结果: 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Scala入门】scala基础语法:类和对象,变量和常量 的相关文章

随机推荐

  • Qt 6.4.2在Windows上安装过程及简单验证

    Qt是一个跨平台的C 开发库 用来开发图形用户界面 Graphical User Interface GUI 它支持Windows Linux macOS Android iOS QNX等平台 一个框架 一套代码库 任意平台部署 Qt有开源
  • Centos 8上安装Docker配置国内镜像源

    一 使用背景 在阿里云上安装docker后 如果采用国外的源地址 pull的时候 速度慢到让人崩溃 二 国内常用加速地址 Docker中国官方加速地址 https registry docker cn com 网易163镜像加速 http
  • 使用 Waffle 进行测试的基本流程及使用方法-文章来自问我社区

    前言 Waffle 是一款适配 ehter js 的智能合约测试库 本样例演示了使用 Waffle 进行测试的基本流程及使用方法 Waffle 详细使用方法可以参考 Waffle 官网 对于不熟悉 Waffle 测试框架的开发者 可以根据本
  • 腾讯Cos对象储存api用法教程中英图文讲解

    Chinar blog www chinar xin 腾讯云 Cos api sdk详解 本文提供全流程 中文翻译 Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无限可能 Chinar 心分享 心创新 助力快速理解 C
  • Egg简介

    Egg 前言 Egg js 为企业级框架和应用而生 基于Koa开发封装 性能优异 内置多进程管理 具有高扩展性 且提供了基于Egg定制上层框架的能力 帮助开发团队降低了开发维护成本 约定先于配置 相较于express更加灵活可配 Koa K
  • gateway网关的使用

    今天与大家分享gateway网关的使用 1 gateway简介 1 1 是什么 SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关 目标是替代 Zuul 在Spring Cloud 2 0以上版本中 没
  • 动手实验:使用 jstat 摸清线上系统的JVM运行状况

    添加VX ruyuan0220 回复 CSDN 领取更多精品学习资料 目录 功能强大的jstat jstat gc PID 其他的jstat命令 到底该如何使用jstat工具 新生代对象增长的速率 Young GC的触发频率和每次耗时 每次
  • 关于\n,\\\n,\\\\\n在java中的split()正则中的理解

    关于 n n n在java中的split 正则中的理解 在做一个题的时候 要把一串字符串dir n tsubdir1 n tsubdir2 n t tfile ext按 n分割 粘贴到idea idea识别自动转义成 也是一个坑 dir n
  • C/C++中调用SQLITE3

    C C 中调用SQLITE3 2011 08 04 17 31 09 分类 LINUX C C 中调用SQLITE3的基本步骤 Sqlite 是一个面向嵌入式系统的数据库 编译完成只有200K 同时支持2T的数据记录 对于嵌入式设备是一个很
  • 操作系统与Linux篇之卷首语

    2023年7月23日 周日晚上 通过纯粹地看操作系统相关书籍来学习操作系统实在是太枯燥和抽象了 我看不到实现的细节 我看不到实际的操作系统代码 这让我学得很难受 所以我决定结合开源的Linux来学习操作系统 我发现这样做不仅学起来更加有趣
  • Expecting property name enclosed in double quotes解决篇

    作者 关注了 Github Github 掘金 进去看看 爱好 Americano More Ice QQ学习交流群 new 811792998 问题 json decoder JSONDecodeError Expecting prope
  • spring boot: 输出json

    spring boot 输出json 注意 关闭java的Terminate后 在重新启动 否则报错 app java启动配置 package com muyang boot1 import org springframework boot
  • curl 命令的学习笔记

    curl 命令的学习笔记 curl 官网 https curl haxx se curl 全称 CommmandLine URL 或 CommandLine Uniform Resource Locator 是用于从服务器传输传输数据或向服
  • 【ARM】Linux内核驱动之定时器

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https gitee com stylle linux code 点赞 收藏 再看 养成习惯 订阅的粉丝可通过PC端文末加我微信 可对文章的内容进
  • set -e -x 等等的作用

    set指令能设置所使用shell的执行方式 可依照不同的需求来做设置 a 标示已修改的变量 以供输出至环境变量 b 使被中止的后台程序立刻回报执行状态 C 转向所产生的文件无法覆盖已存在的文件 d Shell预设会用杂凑表记忆使用过的指令
  • VUE 输入框实现光标插入,设置光标位置并删除光标内容

    最近做项目遇到这样一个需求 可以往输入框指定光标出插入内容 并且当删除插入的内容时会先将插入的内容进行光标选中给用户进行提示 当再次删除时才删除内容 而这个需求的核心就在 setSelectionRange 设置光标位置 这个dom api
  • Docker之Nacos的持久化和集群部署

    注1 小插曲 由于虚拟机分配的内存为1G 开到第四个容器时 由于内存不够导致容器启动失败 重新设置4G内存后启动成功 ok 正式进入主题 一 Docker mysql 5 7的持久化存储及远程连接 1 拉取相关镜像 目前网络模式为 brid
  • Flutter中 解决自定义阿里妈妈图标一直显示不出来的问题

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 Flutter中 自定义图标一直显示出来的问题 这里引用的是阿里妈妈图标 问题解决 位置一定要对应好
  • 解决小程序报错getLocation:fail the api need to be declared in the requiredPrivateInfos field in app.json

    报错 1 uniapp项目 在manifest json中打开源码视图 小程序特有相关 mp weixin appid 你的开发者id setting urlCheck true es6 true postcss true minified
  • 【Scala入门】scala基础语法:类和对象,变量和常量

    上一篇请移步 Scala入门 Scala下载及安装 Windows 以及Idea创建第一个scala项目 水w的博客 CSDN博客 目录 一 Scala 二 Scala基础语法 2 1 注释与标识符规范 2 2 变量与常量 案例 变量声明和