当前位置: 首页 > news >正文

scala之基础面向对象

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 //未初始化,抽象字段,必须给类型声明:Stringdef 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类 生成一个伴生对象和多种方法
      在这里插入图片描述
      在这里插入图片描述

五、包

在这里插入图片描述

相关文章:

scala之基础面向对象

scala 既是面向对象 也是函数式编程 从Java 发展而来&#xff0c;依赖JVM环境 一、 scala 在linux中运行 scala 模式中直接编写运行 scala文件&#xff0c;load执行 scala编译程序 编译 运行 scala java 二、scala 数据类型 基础数据类型 val 不可变变量 函数式编程 …...

Qt5.12实战之多线程编程概念

1.为什么要使用多线程? a. 基于线程,同时处理多个任务,软件响应更灵敏 b.充分利用CPU的多核心功能增加应用运行效率 c.多线程在同一进程间使用共享通信更加高效 d.多个线程之间进行切换比多个进程之间进行切换,线程开销更少. 2.操作系统与进程关系 a. MS-DOS系统 属于单进程…...

格式化数据恢复怎么做?超实用的3种方法在这!

案例&#xff1a;格式化数据怎么恢复 【我的电脑前段时间中病毒了&#xff0c;无奈之下我只能将其格式化&#xff0c;但是很多重要的文件和图片之类的也一起被删除了&#xff0c;有什么方法可以恢复这些格式化的数据吗&#xff1f;非常着急&#xff01;】 格式化数据恢复&…...

【Java|golang】1105. 填充书架---动态规划

给定一个数组 books &#xff0c;其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架上&#xff08;它们的厚度之和小于等于书架的宽度 shelfWidt…...

linux基础命令

linux基础命令 一、linux命令 熟悉账务linux命令对运维的好处是巨大的&#xff0c;只有熟悉了命令咱们在运维的操作上才能如鱼得水。 系统信息 arch #显示机器的处理器架构(1) uname -m #显示机器的处理器架构(2) uname -r #显示正在使用的内核版本 dmidecode -q …...

【三十天精通Vue 3】 第十八天 Vue 3的国际化详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、Vue 3 国际化概述1.1 国际化的概念1.2 国际化的作用1.3 V…...

02 - 学会提问

学会提问 一、引言 1.1 GPT简介 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的大型预训练语言模型。 凭借其强大的文本生成、理解和处理能力&#xff0c;GPT已在诸如自然语言处理、机器翻译、文本摘要等多个领域取得了显著的…...

Java经典的Main方法面试题

mian方法是做什么用的&#xff1f; main方法是Java程序的入口方法&#xff0c;JVM在运行的时候会首先查找main方法不用main方法如何运行一个类&#xff1f; 不行&#xff0c;没有main方法我们不能运行Java类 在Java7之前&#xff0c;你可以通过使用静态初始化运行Java类。但是&…...

世界大学电子电气工程TOP10,国内大学哪家强?

EE究竟是什么专业 ? 在中国&#xff0c;工程系中跟电相关的专业&#xff0c;一般都切分得非常细。有电子工程、电气工程、通信工程、信息工程、自动化、测控仪器等。但在国外&#xff0c;一般把这些领域都归类到 Electrical Engineering 中&#xff0c;也就是我们常说的EE。 …...

5.3 牛顿-科茨公式

学习目标&#xff1a; 理解微积分基础知识&#xff0c;例如导数和微分的概念。学习牛顿-科茨公式的推导过程。这个公式实际上是使用泰勒公式对被积函数进行展开&#xff0c;并使用微积分的基本原理进行简化得到的。学习如何使用牛顿-科茨公式进行数值积分。这通常涉及到将被积…...

全注解下的SpringIoc 续2-bean的生命周期

spring中bean的生命周期 上一个小节梳理了一下Spring Boot的依赖注入的基本知识&#xff0c;今天来梳理一下spring中bean的生命周期。 下面&#xff0c;让我们一起看看bean在IOC容器中是怎么被创建和销毁的。 bean的生命周期大致分为四个部分&#xff1a; #mermaid-svg-GFXNEU…...

【VQ-VAE代码实战】Neural Discrete Representation Learning

【VQ-VAE代码实战】Neural Discrete Representation Learning 0、前言1、简介2、Basic IdeaLoss3、代码Load DataVector Quantizer LayerEncoder & Decoder ArchitectureTrainPlot LossView ReconstructionsView EmbeddingReference0、前言 论文地址:基于神经网络的,离散…...

gpt3.5和gpt4区别-gpt3.5和gpt4

gpt系列 GPT系列是OpenAI公司开发的一组基于人工智能深度学习技术的自然语言处理模型。GPT代表Generative Pre-trained Transformer&#xff0c;即预训练生成模型。目前&#xff0c;GPT模型已经推出了三代&#xff08;GPT-1&#xff0c;GPT-2&#xff0c;GPT-3&#xff09;&am…...

java获取当前系统时间

在Java中&#xff0c;可以使用以下几种方法获取当前系统时间&#xff1a; 方法1&#xff1a;使用java.util.Date类 java import java.util.Date; public class Main { public static void main(String[] args) { Date date new Date(); System.out.println("当前时间&…...

pbootcms自动配图出图插件

pbootcms文章无图自动出图配图插件的优点 1、提高文章的可读性和吸引力&#xff1a;插入图片可以丰富文章的内容和形式&#xff0c;增强读者的阅读体验和吸引力&#xff0c;提高文章的点击率和转化率。 2、节省时间和精力&#xff1a;手动添加图片需要花费大量时间和精力去寻找…...

手动测试台架搭建,让你的车载测试更轻松

目录&#xff1a;导读 引言 1、概述 2、主要内容 3、汽车测试台架分类 4、汽车测试台架分类 5、汽车测试台架分类台架测试输人台架硬件搭建CANoe台架搭建 6、台架测试输入&#xff1f; 7、需求规范是功能测试用例设计来源测试结果的判断﹔包括∶客户需求(功能规范)需求分…...

分组双轴图:揭示数据中的关联性和趋势变化

简介 分组双轴图是一种数据可视化图表&#xff0c;指有多个&#xff08;≥2&#xff09;Y轴的数据图表&#xff0c;多为分组柱状图折线图的结合&#xff0c;图表显示更为直观&#xff0c;可以很好地展示不同指标之间的关系&#xff0c;帮助用户更好地理解数据&#xff0c;做出…...

MATLAB函数封装1:生成QT可以调用的.dll动态链接库

在进行相关算法的开发和设计过程中&#xff0c;MATLAB具有特别的优势&#xff0c;尤其是对于矩阵运算的处理&#xff0c;具有很多现成的方法和函数可以进行调用&#xff0c;同时MATLAB支持把函数封装成不同的语言方便完成算法的集成。 这里记录利用MATLAB封装成C动态链接库&…...

【算法题】2400. 恰好移动 k 步到达某一位置的方法数目

题目&#xff1a; 给你两个 正 整数 startPos 和 endPos 。最初&#xff0c;你站在 无限 数轴上位置 startPos 处。在一步移动中&#xff0c;你可以向左或者向右移动一个位置。 给你一个正整数 k &#xff0c;返回从 startPos 出发、恰好 移动 k 步并到达 endPos 的 不同 方法…...

探索【Stable-Diffusion WEBUI】的插件:骨骼姿态(OpenPose)

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;骨骼姿态&#xff08;OpenPose&#xff09;系列插件&#xff08;二&#xff09;插件&#xff1a;PoseX&#xff08;三&#xff09;插件&#xff1a;Depth Lib&#xff08;四&#xff09;插件&#xff1a;3D …...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...