【Scala】Scala中的一些基本数据类型的特性 列表、元组、构造器、单例对象、伴生类、伴生对象、抽象类与特质

news2024/12/24 20:46:50

列表

使用List(“”,“”,“”)去声明
sliding 和 groued表示迭代器

    val iter = List("Hadoop", "Spark", "Scala") sliding 2
    // sliding 和 groued 是有区别的
    while (iter.hasNext){
      println(iter.next())
    }

    for (elem <- iter){
      println(elem)
    }

可变数组

  def main(args: Array[String]): Unit = {
    import scala.collection.mutable.ArrayBuffer
    val aMutableArr = ArrayBuffer(10,20,30)
    println(aMutableArr)
    aMutableArr += 40
    println(aMutableArr)
    aMutableArr.insert(2,60)
    println(aMutableArr)
    aMutableArr -= 40
    println(aMutableArr)
    
  }

元组

  def main(args: Array[String]): Unit = {
    val tuple = ("Bigdata",2022,45.0)
    println(tuple)
    println(tuple._1)
    println(tuple._2)

  }

构造器

class Counter{
  private var value = 0 // value用来储存计数器的起始值
  private var name = "" //表示计数器的名称
  private var mode = 1 // mode用来表示计数器的类型(比如,1表示部署计数器,2表示时间计数器
  def this(name: String){ // 第一个辅助计数器
    this()  // 调用主构造器
    this.name = name
  }

  def this(name: String,mode:Int){// 第二个辅助构造器
    this(name) // 调用前一个辅助构造器
    this.mode = mode
  }

  def increment(step: Int):Unit = {value += step}
  def current():Int = {value}
  def info():Unit = {printf("name:%s and mode is %d\n",name,mode)}

}

object Main {
  def main(args: Array[String]): Unit = {
    val myCounter = new Counter  // 主构造器
    val counter1 = new Counter("Runner")
    val counter2 = new Counter("Timer",2)

    myCounter.info()  // 显示计数器信息
    myCounter.increment(1) // 设置步长
    println(myCounter.current)
    counter1.info()
    counter1.increment(2)
    println(counter1.current)
    counter2.info()
    counter2.increment(3)
    println(counter2.current)
  }
}
  • 构造器在参数中
class Counter(val name:String = "",val mode:Int = 1){
  private var value = 0 // value用来储存计数器的起始值
  def increment(step: Int):Unit = {value += step}
  def current():Int = {value}
  def info():Unit = {printf("name:%s and mode is %d\n",name,mode)}

}

object Main {
  def main(args: Array[String]): Unit = {
    val myCounter = new Counter  // 主构造器
    val counter1 = new Counter("Runner")
    val counter2 = new Counter("Timer",2)

    myCounter.info()  // 显示计数器信息
    myCounter.increment(1) // 设置步长
    println(myCounter.current)
    counter1.info()
    counter1.increment(2)
    println(counter1.current)
    counter2.info()
    counter2.increment(3)
    println(counter2.current)
  }
}

单例对象

Scala并没有提供Java那样的静态方法和静态字段,但是可以采用object关键字实现单例对象,具备和Java静态方法相同的功能。

object Person{
  private var lastId = 0 // 身份证号
  def nerPersonId()={
    lastId += 1
    lastId
  }
}

伴生类和伴生对象

class Person{
  private val id = Person.newPersonId() // 调用了伴生对象中的方法
  private var name = ""
  def this(name: String){
    this()
    this.name = name
  }
  def info() {printf("the id of %s is %d.\n",name,id)}
}

object Person{
  private var lastId = 0 // 身份证号
  def newPersonId()={
    lastId += 1
    lastId
  }
}


object Main {
  def main(args: Array[String]): Unit = {
    val person1 = new Person("ziyu")
    val person2 = new Person("Minxing")
    person1.info()
    person2.info()
  }
}

apply方法和update方法

  • 我们经常会用到对象的apply方法和update方法,虽然我们表面上并没有察觉,但是实际上,在Scala中,apply方法和update方法都会遵循相关的约定被调用
  • apply方法:用括号传递给变量(对象)一个或多个参数时,Scala会把它转换成对apply方法的调用
class TestApplyclass{
  def apply(param:String):String = {
    println(param)
    return "hello world"
  }
}

object Main {
  def main(args: Array[String]): Unit = {
    val myObject = new TestApplyclass
    println(myObject("param1"))
  }
}

这种方式生成对象 会自动调用apply方法

class Main{}

class ApplyTest{
  def apply() = println("apply method id class is called!")
  def greetingOfclass():Unit = {
    println("Greeting method in class is called.")
  }
}

object ApplyTest{
  def apply() = {
    println("apply method in object is called")
    new ApplyTest()  // 这行不会自动调用ApplyTest伴生类的apply方法
  }
}

object Main {
  def main(args: Array[String]): Unit = {
    val a = ApplyTest()  // 这里会调用伴生对象中的apply方法
    a.greetingOfclass()
    a()  // 这里会调用半生类中的apply方法
  }
}
  • update方法:当对带有括号并包括一到若干参数的对象进行赋值时,编译器将调用对象的update方法,在调用时,是把括号里的参数和等号右边的对象一起作为update方法的输入参数来执行调用

在这里插入图片描述

抽象类和继承

abstract class Car{
  val carBrand: String
  def info
  def greeting() {println("welcome to my car!")}
}
class BMWCar extends Car{
  override val carBrand: String = "BMW"
  def info(){println(this.carBrand)}
  override def greeting(){println("welcome to BMW car!")}
  
}

特质

特质概述

  • Java中提供了接口,允许一个类实现任意数量的接口
  • 在Scala中没有接口的概念,二十提供了“特质(trait)”,它不仅实现了接口的功能,还具备了很多其他的特性
  • Scala的特质,是代码重用的基本单元,可以同时拥有抽象方法和具体方法
  • Scala中,一个类只能继承自一个超类,却可以实现多个特质,从而重用特质中的方法和字段,实现了多重继承
trait CarId{
  var id:Int
  def currentId():Int   //定义了一个抽象方法
}

class BYDCarId extends CarId{
  override var id = 10000 // BYD汽车编号从10000开始
  def currentId():Int = {id += 1;id}
}
class BMWCarId extends CarId{
  override var id = 20000 // BMW汽车编号从20000开始
  def currentId():Int = {id += 1;id}
}

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

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

相关文章

11 月 NFT 动态:交易量增长,Layer 2 格局剧变

作者&#xff1a;stellafootprint.network 11 月份&#xff0c;随着比特币和以太坊价格的提升&#xff0c;加密货币市场活动频繁&#xff0c;市场呈现进一步复苏的迹象。NFT 领域中&#xff0c;Blur 的交易量飙升&#xff0c;进一步巩固地位&#xff1b;Blast 的亮相&#xff…

数字图像处理(实践篇)二十二 使用opencv进行人脸、眼睛、嘴的检测

目录 1 xml文件 2 涉及的函数 3 实践 使用opencv进行人脸、眼睛、嘴的检测。 1 xml文件 方法① 下载 地址&#xff1a;https://github.com/opencv/opencv/tree/master/data/haarcascades 点击haarcascade_frontalface_default.xml文件 对着Raw右键&#xff0c;选择“链接…

centos7 安装nnDetection环境

nnunet和nnDetection更新导致默认安装可能会出现无法调用GPU的问题&#xff0c;这里稍微细致的记录下安装nnDetection环境过程。 1.创建虚拟环境&#xff1a; Please note that nndetection requires Python 3.8. Please use PyTorch 1.X version for now and not 2.0 这里要…

Linux——Web网站服务(二)

一、httpd服务的访问控制 1、客户机地址限制 通过Require配置项&#xff0c;可以根据主机的主机名或P地址来决定是否允许客户端访问。在 httpd服务器的主配置文件的<Location>&#xff0c;<Directory>、<Files>、<Limit>配置段中均可以使用Require配置…

【SpringBoot教程】SpringBoot 实现前后端分离的跨域访问(CORS)

作者简介&#xff1a;大家好&#xff0c;我是撸代码的羊驼&#xff0c;前阿里巴巴架构师&#xff0c;现某互联网公司CTO 联系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗…

分布式锁实现方案 - Lock4j 使用

一、Lock4j 分布式锁工具 你是不是在使用分布式锁的时候&#xff0c;还在自己用 AOP 封装框架&#xff1f;那么 Lock4j 你可以考虑一下。 Lock4j 是一个分布式锁组件&#xff0c;其提供了多种不同的支持以满足不同性能和环境的需求。 立志打造一个简单但富有内涵的分布式锁组…

云贝教育 | 分享课:12月12日周二晚Oracle分享课享来了

Oracle 19c OCM分享课分享主题: Introduction to Clusterware 讲师&#xff1a;郭一军 直播分享平台&#xff1a;云贝教育视频号 时间&#xff1a;12月12日 周二晚 19: 30

物联网平台:网络调试助手+HTTP+上传数据到onenet

目录 onenet设备初始化 获取设备id和密钥key 尝试上传数据&#xff0c;实例 onenet设备初始化 获取设备id和密钥key 进入官网 中移坤灵 - 中国移动物联网开放平台 (10086.cn)https://open.iot.10086.cn/ 创建登录账号后&#xff0c;点击左上角的开发者中心 点击左上角的全…

ARP协议:地址解析协议

目录 引言 什么是ARP协议&#xff1f; ARP协议的工作原理 1. ARP请求 2. ARP应答 3. ARP缓存 ARP协议的应用 结语 其他链接 引言 在计算机网络中&#xff0c;地址解析协议&#xff08;ARP&#xff0c;Address Resolution Protocol&#xff09;扮演着重要的角色。ARP协议…

I2C 应用编程

1. I2C 框架结构 1.1 I2C 硬件框架 I2C 总线拓扑图 ⚫ 在一个芯片 (SoC) 内部&#xff0c;有一个或多个 I2C 控制器 ⚫ 在一个 I2C 控制器上&#xff0c;可以连接一个或多个 I2C 设备 ⚫ I2C 总线只需要 2 条线&#xff1a;时钟线 SCL 、数据线 SDA ⚫ 在 …

tamcat乱码

学习springmvc时tamcat乱码 ①、启动时tomcat控制台乱码 解决方法是&#xff1a;1、先把idea设置里的默认字节码改成utf-8 ​ 2、把idea显示编码改成utf-8&#xff0c;在末尾加上&#xff08; -Dfile.encodingUTF-8&#xff09; ​ 3、最后重启idea 加上这个 -Dfile.encodingU…

外贸获客怎么做?有哪些技巧?

外贸获客是许多企业拓展海外市场的关键一环&#xff0c;为了成功地吸引潜在客户&#xff0c;我们需要了解一些基本的获客技巧&#xff0c;本文将分享一些实用的方法和技巧&#xff0c;帮助您在外贸领域获得更多的客户。 一、了解目标客户 在开展外贸业务之前&#xff0c;了解…

保研毕业论文查重率多少通过【保姆教程】

大家好&#xff0c;今天来聊聊保研毕业论文查重率多少通过&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 保研毕业论文查重率多少通过 在保研过程中&#xff0c;毕业论文的查重率是衡量学术诚信和论文…

【Maven教程】(十二):版本管理 ——版本号定义约定及相关概念,自动化版本发布与创建分支,GPG签名 ~

Maven 版本管理 1️⃣ 版本管理的概念2️⃣ Maven 的版本号定义约定3️⃣ 主干、标签与分支4️⃣ 自动化版本发布5️⃣ 自动化创建分支6️⃣ GPG签名6.1 GPG 及其基本使用6.2 Maven GPG Plugin &#x1f33e; 总结 一个健康的项目通常有一个长期、合理的版本演变过程。例如JUn…

Vue H5项目,怎么引入uni.webview sdk,调用uni postMessage实现手机蓝牙连接打印功能(uniapp)

前言 目前公司Vue H5项目&#xff0c;用webview打包成APP&#xff0c;现产品提出这样打包出来的app运行较慢&#xff0c;需要用uniapp方式&#xff08;即使用HBuilder编辑器来打包H5&#xff09;来打包&#xff0c;那需要的基座就不是安卓的基座而是uniapp的基座&#xff0c;而…

如何通过内网穿透工具实现任意浏览器远程访问Linux本地zabbix web管理界面

前言 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 本地zabbix web管理界面限制在只能局域…

GD32F30X-RT-Thread学习-线程管理

1. 软硬件平台 GD32F307E-START Board开发板MDK-ARM Keil 2.RT-Thread Nano 3.RT-Thread 内核学习-线程管理 ​ 在多线程操作系统中&#xff0c;可以把一个复杂的应用分解成多个小的、可调度的、序列化的程序单元&#xff0c;当合理地划分任务并正确地执行时&#xff0c;这…

我的acer电脑U盘装系统前BIOS设置及装系统过程中的操作

1、开机长按F2进入BIOS设置 2、使能F12 3、调整boot顺序&#xff0c;使USB启动的优先级最高 4、按F10保存退出 5、插入U盘开机&#xff0c;boot选择界面无需操作&#xff0c;等待几秒&#xff0c;默认进入U盘系统 由于既使能了F12&#xff0c;又将U盘的优先级进调整到了最高&…

三层交换原理

三层交换机出现的背景 早期的网络中一般使用二层交换机来搭建局域网&#xff0c;而不同局域网之间的网络互通由路由器来完成。那时的网络流量&#xff0c;局域网内部的流量占了绝大部分&#xff0c;而网络间的通信访问量比较少&#xff0c;使用少量路由器已经足够应付了。 但…

鸿蒙生态千帆起:从者众,行则远

“轻舟已过万重山”&#xff0c;鸿蒙的成长速度惊人&#xff0c;一定程度上打破了iOS和安卓二分天下的格局。短短四年时间&#xff0c;搭载华为鸿蒙系统的生态设备数已经突破7亿&#xff0c;开发者突破220万。据Counterpoint数据显示&#xff0c;华为HarmonyOS系统在中国的市场…