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

news/2024/5/9 20:07:11/文章来源:https://blog.csdn.net/qq_45956730/article/details/130316536

上一篇请移步【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 = 17println((name + " ") * 3)  // 将一个字符串复制多次进行拼接printf("%s : dead in %d\n", name, age) // printf:前缀f格式化模板字符串,通过$获取变量值,%后跟格式化字符串print(s"$name : dead in ${age}") // 字符串插值:前缀s模板字符串,通过$获取变量值val power = 98.9072println(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 testclass 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 = 24alice.printInfo()}
}

控制台中输出结果: 

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

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

  • 对象中的apply方法:object中不可以传参,当创建一个object时,如果传入参数,那么会自动寻找object中的相应参数个数的apply方法;
package com.yt.testclass Person(xname: String, xage: Int) {val name = xnamevar age = xagevar 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 = 200println(p1.name, p1.age)p1.sayName()println(p2.name, p2.age, p2.gender)ClassAndObj("lisi", 500)}}

控制台中输出结果: 

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

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

相关文章

2023年数据治理工程师证书有哪些值得考?DAMA-CDGA/CDGP

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

【音视频】国际双向对讲方案

语音对讲的的整体流程为: 先拉流播放设备的视频;使用WebRTC推送语音流到ZLM服务;使用SIP协议下发Broadcast指令给设备;接收到设备的OK指令后,请求ZLM的startSendRtp接口,TCP协议请求startSendRtpPassive接口…

C/C++每日一练(20230423)

目录 1. 多组输入求和 ※ 2. 螺旋矩阵 II 🌟🌟 3. 路径交叉 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 多组…

直播软件app开发:如何开发一个可以免费打扑克的直播应用?

作为一个技术开发人员,我深知直播软件app开发的重要性。在这个数字化时代,越来越多的人选择使用直播软件来分享自己的生活和与朋友互动。而随着技术的发展,直播软件也不断更新和改进,为用户提供更好的体验和功能。 对于开发者来说…

供需两端催化口腔医疗服务市场增长 未来将呈现线上化、智能化、品质化三大趋势

一、口腔医疗服务行业概述 口腔由唇、颊、舌、腭、涎腺、牙和颌骨等部分组成。口腔疾病种类繁多,伴随人全生命周期,常见疾病有龋病、牙周疾病、牙髓病、根尖周病、牙齿缺损、错颌畸形等,多数口腔疾病的发病率高,诊疗需求大。除此…

java 实现对称加密的方法

对称加密是一种加密算法,它和非对称加密的区别在于:加密和解密使用不同的密钥,对称加密使用同一个密钥对数据进行加密和解密。 今天我们来学习下对称加密的实现方法,不需要使用到私钥,只需要用到公钥。 首先我们来看下…

leetcode328. 奇偶链表

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。 请注意,偶数组和奇数组内部的相…

022:Mapbox GL 加载geojson数据,形成热力图,自定义样式

第022个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载geojson数据,形成热力图. paint设置的参数:heatmap-color,heatmap-intensity,heatmap-opacity,heatmap-radius,heatmap-weight,visibility,具体请参考下面的api链接。 直接复制下面的 vue+mapbox源代…

Java编译器插件Manifold(流形)

流形 文天祥正气歌中有云:“天地有正气,杂然赋流形”。 流形是一种抽象而又具体的事务,要研究一个事务就要格物,不格物就不能知道事物的具体描绘形式。流形大多数情况下是一种数学计算方式,可以将一个复杂的模型抽象…

V2.4版本商超标签专用路由器

PICK_Router_V2.4 产品参数 产品型号 PICK_Router_V2.4 尺寸(mm) 21*14*4.3mm 工作温度 -10-70℃ 产品重量 465g 供电方式 DC12V or POE 工作频率 2.4G 通信速率 50-250kbps 通信方式 10/100Mbps有线网络&2.4G 通信半径 30m 支持标签数量 >10000…

设计模式 -- 命令模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

【Redis】Redis十大数据类型—列表List

介绍 List列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向List列表添加元素。 列表的最大长度是2^32-1,也就是每个列表支持超过40亿个元素。 实现 底层数据结构是由双向链表或压缩列表实现。 如果列表的元素个数小于 512 个…

YOLOv7如何提高目标检测的速度和精度,基于模型结构提高目标检测速度

目录 一、目标检测二、目标检测的速度和精度的权衡1、速度和精度的概念和定义2、如何评估目标检测算法的速度和精度3、速度和精度之间的权衡 三、基于模型结构提高目标检测速度1、Backbone网络的选择2、特征金字塔网络的设计3、通道注意力机制4、混合精度训练 一、目标检测 目…

3个实用的文字转语音方法,让你时刻保持信息更新!

现在,我们生活节奏加快,信息量也越来越大,有时候想了解新闻却又不想眼睛再去盯着手机屏幕了,这时候文字转语音工具就可以帮助我们实现听新闻的需求。如果你还不了解文字如何转换成语音,别担心,今天我将向大…

不同的场景上线时钟同步系统需要注意些什么

时钟同步系统一般都是用在学校或者医院的环境当中,一般时钟同步系统由硬件和软件相组成。对于局域网部署,通常使用NTP协议。对于广域网部署,通常需要考虑网络延迟和安全性等因素。此外,时钟同步系统在不同的使用场景当中的需求也不…

15天学习MySQL计划-多表联查(基础篇)第四天

15天学习MySQL计划(多表联查)第四天 1.多表查询 1.1概述 ​ 指从多张表中查询数据 ​ 在项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互…

记录-JavaScript常规加密技术

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 当今Web开发中,数据安全是一个至关重要的问题,为了确保数据的安全性,我们需要使用加密技术。JavaScript作为一种客户端编程语言,可以很好地为数据进行加…

sggJava基础第四天

1 分支结构 分支结构 根据条件,选择性地执行某段代码。 有if…else和switch-case两种分支语句。 概述 顺序结构的程序虽然能解决计算、输出等问题 但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构 if…else形式 单分支结构 代码实现 …

JWT 实现登录认证 + Token 自动续期方案

前言 过去这段时间主要负责了项目中的用户管理模块,用户管理模块会涉及到加密及认证流程。今天就来讲讲认证功能的技术选型及实现。技术上没啥难度当然也没啥挑战,但是对一个原先没写过认证功能的菜鸡来说也是一种锻炼吧。 技术选型 要实现认证功能&a…

JavaScript(JS)-1.JS基础知识

1.JavaScript概念 (1)JavaScript是一门跨平台,面向对象的脚本语言,来控制网页行为的,它能使网页可交互 (2)W3C标准:网页主要由三部分组成 ①结构:HTML负责网页的基本结构(页面元素和内容)。 …