scala之基础面向对象

news2024/12/22 20:51:02

scala 既是面向对象 也是函数式编程
从Java 发展而来,依赖JVM环境

一、 scala 在linux中运行

  1. scala 模式中直接编写运行
    在这里插入图片描述
  2. scala文件,load执行
    在这里插入图片描述
  3. scala编译程序
    编译
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/751aa2bdefd14cc78c5519890cf3e7d
    在这里插入图片描述
    运行
  • scala
    在这里插入图片描述
  • java
    在这里插入图片描述

二、scala 数据类型

  1. 基础数据类型
    在这里插入图片描述

val 不可变变量 函数式编程
var 可变变量 面对对象编程

两种方式 :
声明方式
2. 数据结构

  • 数组 Array
    在这里插入图片描述
    在这里插入图片描述

  • 多元数组
    在这里插入图片描述

  • 元组 Tuple
    可以存放不同类型()
    在这里插入图片描述

  • 容器 Colection
    scala.collection.mutable 可变 的容器 的包
    scala.collection.immutable 不可变 的容器 的包
    在这里插入图片描述
    seq 0,1,2 索引
    map 键索引
    set 无序

  • list(值类型相同,些初始化赋值不可变)/queue <- linearSeq
    List
    var st = List(“Big”,“small”,“person”)
    val otherList = “Apple”::st 一个新列表,前面加个字符串 apple
    val intList = 1::2::3::Nil(从右向左执行) <->val intList = List(3,2,1)

  • vector/arrayBuffer <- indexedSeq
    Vector
    在这里插入图片描述

  • Range
    val r = new Range(1,5,1) ->1,2,3,4,5
    1 to 5 ->1,2,3,4,5
    1.to(5) -> 1,2,3,4,5
    1 to 5 by 2 ->1,3,5
    1 unitl 5 ->1,2,3,4(不包含5)
    0.1f to 2.5f by 0.4f ->0.1,0.5,0.9,1.3,1.7.2.1

  • Set 集合
    情况一:
    var myset =Set(“hadoop”,“spark”) – 一个不可变集合,但是myset 是一个可变变量
    mySet += “scala” 是形成新的不可变集合后,将 mySet指向 变过去,见下图
    在这里插入图片描述
    情况二:
    在这里插入图片描述
    这里 myMutableSet 是不可变变量,,但它指向的Set集合是可变的

  • Map 映射
    键值对容器:键唯一,值不唯一
    val myMap = Map(“XMU”->“xiamen University”,“THU”->“Tsinghua University”)
    val xmu = if(myMao.contains(“XMU”)) myMap(“”) else 0 先判断存不存在键再取数,否则报错

三、面向对象编程

  • 方法定义:
    def 方法名(参数列表):返回结果类型={方法体}
    注:

    • 不返回结果时 结果类型Unit,也可以省略:Unit
    • 参数列表中不能用val,var来修饰
    • 没参数时,()可以省略【此时调用时也不能带()】,还可以用def 方法名 {参数列表} :返回结果类型={方法体}
    • 一个方法只有一个参数,可以省略圆点 采用 中缀操作符调用方法
    • 结果类型也可以省略,可以判断,,只要最后一行是要返回的值就可以
      在这里插入图片描述
  • 类定义及实例化
    在这里插入图片描述在这里插入图片描述
    public private protect
    private:
    value_= 写(value_= 相当于 java setter)
    value 读(value 相当于 Java getter)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/29d24a851f084501acdd5e476e878acd.png

  • 类构造器:
    class myClass(val/var name:String)
    会成为myClass的一个参数,并自动给他创建读写方法 name_= 和 name
    辅助构造器 this()
    在这里插入图片描述
    运行:
    在这里插入图片描述

  • 单例对象
    object,不需要实例化便可使用

    • 伴生对象:同一个代码文件中的同名的类与对象 互为半生关系,可调用对方的内部成员
      在这里插入图片描述
      举例:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    因为new Person() 所以Person指的class,俩个类实例通用一个伴生对象,,所以结果打印 一个是1 一个是2

    • 孤立对象:
      仅有object,不存在伴生类

      举例:
      对象 内部成员,,可理解其是静态的
      在这里插入图片描述
      在这里插入图片描述

  • 继承
    在这里插入图片描述

    类型存储位置实例化
    AnyVal值类型寄存器不能实例化 不能new Int
    AnyRef引用类型可实例化 new Array
    Nothing只能用来错误处理、异常处理没有实例
    Null与Java Null 对应
    Option返回应用类型时无返回值不建议Null,建议OptionSome()对象封装返回,其中有一个None对象,处理返回为空
    case class Book(val name:String,val price:Double)//case class 默认给生成apply这些方法
    val books= Map("hadoop"->Book("Hadoop",35.1),"spark"->Book("Spark"),55.0)
    

    在这里插入图片描述
    在这里插入图片描述

    • 抽象类
      内有有未实现的方法 abstract修饰
    abstract class Car(val name:String){
    	val carBrand:String //未初始化,抽象字段,必须给类型声明:String
    	def info() // 抽象方法
    	def greeting(){
    		println("Welcome to my car"}
    	}
    }
    
    • 扩展类
      注意:如果是重写 父类的 已实现的方法或者赋值字段 必须加 override关键字,否则可写可不写;只能重载val的字段,var的本身不可变不能重载
    class BMWCar extends Car{
    	override val carBrand = "BMW"
    	def info(){
    		printf("This is a %s Car",carBrand)
    	}
    	override def greeting(){
    		println("Welcome to my BMW car")
    	}
    }
    

四、scala 特性

  • apply方法 生成对象
    scala 的类定义了apply方法时,类名() <-> 类名.apply()
    原因:融合 面向对象编程 与 函数式编程

    举例说明 函数调用->类调用
    在这里插入图片描述
    举例说明 类调用->函数调用
    在这里插入图片描述
    在这里插入图片描述
    利用这个特性可以生成 一个对象工厂
    在这里插入图片描述
    在这里插入图片描述

  • update
    当 对带有括号并包括一到若干参数的对象,进行赋值时,,调用update

val myStrArr = new Array[String](3)  // 声明一个长度为3的字符串组,初始化null
myStrArr(0) = "BigData" //(0) 带有括号,一个参数;=“” 赋值,其实调用了伴生类的update
myStrArr.update(0,"BigData") // 等效
  • unapply 提取参数
class Car(val brand:String,val price:Int){
	def info(){
		println("Car brand is "+brand+"and price is "+price)
	}
}
object Car{ // 伴生对象
	def apply(brand:String,price:Int)={
		println("Debug:calling apply..")
		new Car(brand,price)
	}
	def unapply(c:Car):Option[(String,Int)]={
		println("Debug:calling unapply ...")
		Some((c.brand,c.price))
	}
}
object TestUnapply{
	def main(args:Array[String]){ // 入口函数
		var Car(carbrand,carprice) = Car("BMW",800000)
		//Car("BMW",800000) 先调用apply生成一个Car类
		//var Car(carbrand,carprice)= 调用unapply  将参数提取出来 
		println(carbrand+":"+carprice)
	}
}
  • 特质 【类似接口(只能由抽象方法),但是可以提供具体的方法实现】
    • trait 定义
      在这里插入图片描述
    • 混入(mixin) class ,写在一个代码文件中
      在这里插入图片描述
    • 混入多个特质 ,with
      在这里插入图片描述

在这里插入图片描述

  • 模式匹配

    • switch-case <-> match
      匹配值,char,int,string …

    在这里插入图片描述
    匹配某一类型
    在这里插入图片描述在这里插入图片描述
    添加守卫 guard,条件表达式
    在这里插入图片描述

    • case class:多用于模式匹配
      scala 自动给case类 生成一个伴生对象和多种方法
      在这里插入图片描述
      在这里插入图片描述

五、包

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel使用频率超高的20个函数,90%你没用过

上班必学必会的Excel函数&#xff0c;不仅是使用频率最大的&#xff0c;还是告别加班的利器。你会的函数越多&#xff0c;解决问题的思路越广&#xff0c;不再束手束脚。态度决定高度&#xff0c;细节决定成败。要想比别人更优秀&#xff0c;只有在每一件小事上比功夫。 组合、…

json-c交叉编译及库移植

编译后的文件 json-c交叉编译及库移植资源-CSDN文库 json-c开源库是一个用c实现的解析json字段的库&#xff0c;嵌入式领域比较实用的库。 由于应用程序需要&#xff0c;需要找移植这个json-c库&#xff0c;所以这里对该库的移植做个简单说明 json-c开源库是一个用c实现的解…

python基于机器学习模型开发实践kaggle旧金山犯罪案件分类预测模型

旧金山犯罪案件分类本质是一个文本的多分类任务&#xff0c;kaggle官网地址在这里&#xff0c;如下所示&#xff1a; 本文主要是以kaggle比赛数据集为基准&#xff0c;开发实践文本多分类任务。 比赛背景 从 1934 年到 1963 年&#xff0c;旧金山因高犯罪率而臭名昭著。时至今…

opengl绘制三角形

1.绘制两个三角形 GLfloat vertices1[] { 0.5f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f } GLfloat vertices2[] { 0.5f, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f&#xff0c; -0.5f, -0.5f, 0.0f } 也可以用索引的方式&#xff1a; GLfloat vertices[] { 0.5f, 0.5f, 0…

并发编程常见问题复盘

并发编程常见问题复盘 大家好&#xff0c;我是易安&#xff01; 并发编程在计算机科学领域占有举足轻重的地位&#xff0c;它使得程序能够在多个处理器核心上同时执行&#xff0c;从而显著提升程序的性能。然而&#xff0c;并发编程也伴随着许多挑战和问题。这些年来&#xff0…

eacharjs饼状图带百分比

var myChart1 echarts.init(document.getElementById(main1)); myChart1.setOption({title:{text:近30天异常停机的类型TOP5,x:center,y:10px,// textStyle:{// fontSize:12// }},tooltip: {trigger: item//提示 鼠标移动上去},// legend: { // 上面的提示// top: 25%…

端口映射工具PortTunnel

PortTunnel应该是目前最好的端口转发器、端口映射工具(它解决了内外网访问的问题) 可以在我的资源中下载&#xff1a;https://download.csdn.net/download/qq_39569480/87717704 使用该工具前应该保证双方机器网络互通 下面我们模拟一下环境 比如现在有三台机器 A&#xff1a…

Mac环境SpringBoot项目Docker部署(独家完整版)

一、Docker 简介 Docker 是一种开源的容器化平台&#xff0c;允许开发人员将应用程序和所有其依赖项打包成轻量级、可移植的容器&#xff0c;以便在任何地方运行。Docker 的优势和劣势分析如下&#xff1a; 优势: 轻量级:Docker 容器仅包含应用程序及其依赖项&#xff0c;因…

家庭智能吸顶灯一Homekit智能

买灯要看什么因素 好灯具的灯光可以说是家居的“魔术师”&#xff0c;除了实用的照明功能外&#xff0c;对细节的把控也非常到位。那么该如何选到一款各方面合适的灯呢&#xff1f; 照度 可以简单理解为清晰度&#xff0c;复杂点套公式来说照度光通量&#xff08;亮度&#x…

【社区图书馆】二、LED子系统——硬件驱动层

个人主页&#xff1a;董哥聊技术 我是董哥&#xff0c;嵌入式领域新星创作者 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; 文章目录 1、gpio_led_probe分析1.1 相关数据结构1.1.1 gpio_led_platform_data1.1.2 gpio_leds_priv 1.2 实…

Nextjs 处理 css3 前缀兼容

Nextjs 处理 css3 前缀兼容 虽然css3现在浏览器支持率已经很高了, 但有时候需要兼容一些低版本浏览器,需要给css3加前缀,可以借助插件来自动加前缀, postcss-loader就是来给css3加浏览器前缀的,安装依赖&#xff1a; npm i postcss-loader autoprefixer -Dpostcss-loader&…

前端使用国密SM4进行加密、解密

目录 需求【方法1】 - 使用 sm4util 依赖【方法2】sm4.js引入1. /public/sm4.js2. body 标签上引入该文件3. 使用 - ECB 模式加密 【方法3】1. 本地写 js 文件2. 使用 - ECB 模式加解密 需求 前端/后端使用 国密SM4 进行加密/解密&#xff0c; 【注意】前后端配合加解密时&…

06期:使用 OPTIMIZER_TRACE 窥探 MySQL 索引选择的秘密

这里记录的是学习分享内容&#xff0c;文章维护在 Github&#xff1a;studeyang/leanrning-share。 优化查询语句的性能是 MySQL 数据库管理中的一个重要方面。在优化查询性能时&#xff0c;选择正确的索引对于减少查询的响应时间和提高系统性能至关重要。但是&#xff0c;如何…

scrapy框架爬取某壁纸网站美女壁纸 + MySQL持久化存储

文章目录 准备工作创建项目&#xff1a;设置&#xff08;settings&#xff09; 主程序入口meinv.py思路源代码 items 配置管道pipelines源代码 效果图总结 准备工作 创建项目&#xff1a; scraoy startproject bizhi cd bizhi scrapy genspider meinv bizhi360.com 设置&#…

ROS学习第二十九节——URDF之joint

此处留疑问&#xff0c;link,joint的origin子标签到底是怎么样的一种位置关系&#xff1f;&#xff1f;&#xff1f; https://download.csdn.net/download/qq_45685327/87717336 urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性&#xff0c;还可以指定关节运动的…

大数据-玩转数据-IDEA创建Maven工程

一、 IDEA集成Maven插件 打开IDEA&#xff0c;进入主界面后点击 file&#xff0c;然后点击 settings,在上面的快捷查找框中输入maven&#xff0c;查找与maven相关的设置&#xff0c;然后点击maven 修改maven的路径&#xff08;使用本地的Maven&#xff09;&#xff0c;以及修…

【流畅的Python学习笔记】2023.4.22

此栏目记录我学习《流畅的Python》一书的学习笔记&#xff0c;这是一个自用笔记&#xff0c;所以写的比较随意 元组 元组其实是对数据的记录&#xff1a;元组中的每个元素都存放了记录中一个字段的数据&#xff0c;外加这个字段的位置。简单试试元组的特性&#xff1a; char…

kong(1):Kong介绍

Kong是一款基于OpenResty&#xff08;Nginx Lua模块&#xff09;编写的高可用、易扩展的&#xff0c;由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的&#xff0c;能提供易于使用的RESTful API来操作和配置API管理系统&#xff0c;…

复旦大学郁喆隽:网络制造出人的“幻象”,深度思考如何可能?

“人是什么?”这是亘古以来人们反复追问的一个古老命题。从元宇宙到ChatGPT&#xff0c;这个人人都在讨论、理解和实践互联网的时代&#xff0c;对“人”的自我定义和认知产生了哪些影响&#xff1f;    在3月12日复旦大学-华盛顿大学EMBA项目主办的“复调艺文沙龙”上&am…

计算长方形、三角形、圆形的面积和周长

系统设计框图&#xff1a; 图形模块的 概要设计&#xff08;设计数据结构和接口&#xff09;&#xff1a; 数据结构&#xff1a; float 表示面积和周长 长方形的数据&#xff08;一般typedef都是定义在对应模块的头文件中&#xff09; typedef struct{ float width; float he…