Scala-抽象类、匿名子类、伴生对象、单例模式

news2024/9/24 13:18:30

抽象类

匿名子类 

伴生对象(单例对象)

单例设计模式


抽象类

  1. 定义抽象类:abstract class Person{} //通过 abstract 关键字标记抽象类
  2. 定义抽象属性:val|var name:String //一个属性没有初始化,就是抽象属性
  3. 定义抽象方法:def hello():String //只声明而没有实现的方法,就是抽象方法
object gou {
  def main(args: Array[String]): Unit = {
    //测试
    val student = new stu0
    println(student.name)
    println(student.age)
    student.run()
    student.sleep()
  }
}

//定义为抽象类父类
abstract class Student0{
  //定义非抽象属性
  val name : String = "yiyi"
  //定义抽象属性
  var age : Int

  //定义非抽象方法
  def run(): Unit ={
    println("跑起来")
  }
  //定义抽象方法
  def sleep(): Unit //抽象方法没有具体的方法体
}

//定义具体的实现子类
class stu0 extends Student0{
  //实现父类抽象属性和方法
  var age: Int = 18
  def sleep(): Unit = {
    println("睡觉吧")
  }

  //重写非抽象父类属性
  override val name: String = "stu"
  override def run(): Unit = {
    super.run()
    println("跑不动了")
  }
}

继承和重写的补充

  1. 如果父类为抽象类,那么子类需要将抽象的属性和方法实现,否则子类也需声明 为抽象类
  2. 重写非抽象方法需要用 override 修饰,重写抽象方法则可以不加 override。
  3. 子类中调用父类的方法使用 super 关键
  4. 子类对抽象属性进行实现,父类抽象属性可以用 var 修饰;
  5. 子类对非抽象属性重写,父类非抽象属性只支持 val 类型,而不支持 var。
  6. 因为 var 修饰的为可变变量,子类继承之后就可以直接使用,没有必要重写 

匿名子类 

     和 Java 一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类。 

object gou {
  def main(args: Array[String]): Unit = {
    //测试
    val stu : Student0 = new Student0 {//匿名子类
      override var num: Int = 1
      override def sleep(): Unit = {
        println("eat")
      }
    }
    //打印匿名子类属性
    println(stu.num)
    //调用匿名子类方法
    stu.sleep()
  }
}

//定义为抽象类父类
abstract class Student0{
  //定义抽象属性
  var num : Int
  //定义抽象方法
  def sleep(): Unit //抽象方法没有具体的方法体
}

伴生对象(单例对象)

       Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概 念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象 来模拟类对象,该对象为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴 生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明。

object Person{
val country:String="China"
}
  1. 单例对象采用 object 关键字声明
  2. 单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
  3. 单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。
object gou {
  def main(args: Array[String]): Unit = {
    //测试
    val stu : Student_ = new Student_("xixi",18)
    println(s"${stu.name}")
    stu.printt()
    
    //测试工厂方法
    val student = Student_.newStu("aa",20)
  }
}

//定义类
class Student_(val name: String ,val age : Int){
  def printt(): Unit ={
    println(name)
    println(age)
    //可以直接访问伴生对象属性
    println(Student_.school)
  }
}

//定义Student_类的伴生对象
object Student_{
  val school : String = "烧烤学院"
  def printt(): Unit ={
    println(school)
  }
  //定义一个类对象实例的创建方法(工厂方法)
  def newStu(name : String,age:Int): Student_ = new Student_(name,age)
}

 单例设计模式

饿汉模式

object Singlenton {
  def main(args: Array[String]): Unit = {
    //测试
    val stu = Student_.getIn()
    stu.printt()
    val stu2 = Student_.getIn()
    stu2.printt()
    //打印两个对象地址 地址相同 全局只有一份
    println(stu)
    println(stu2)
  }
}
//定义类对象
class Student_(val name: String ,val age : Int){
  def printt(): Unit ={
    println(name)
    println(age)
  }
}

//定义Student_类的伴生对象
object Student_{
  //单例设计
  private val student : Student_ = new Student_("a",18)
  def getIn(): Student_ = student
}

懒汉模式

object Singlenton {
  def main(args: Array[String]): Unit = {
    //测试
    val stu = Student_.getIn()
    stu.printt()
    val stu2 = Student_.getIn()
    stu2.printt()
    //打印两个对象地址 地址相同 全局只有一份
    println(stu)
    println(stu2)
  }
}
//定义类对象
class Student_(val name: String ,val age : Int){
  def printt(): Unit ={
    println(name)
    println(age)
  }
}

//定义Student_类的伴生对象
object Student_{//懒汉模式
  private var student : Student_ = _
  def getIn(): Student_ = {
    if(student == null){
      //如果没有对象实例那么则创建一个
      student = new Student_("aa",20)
    }
    return student
  }
}

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

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

相关文章

应用场景六:同时支持CP343和CP341功能(Modbus连接仪表,以太网连接WINCC)

应用描述: 桥接器同时支持西门子PLC的CP343以太网通讯模块和CP341串口通讯模块的功能。可以同时通过ModbusRTU连接仪表、变频器等串口设备,同时可以通过网口连接组态监控软件WINCC。PLC内部不需要编程,也不需要进行硬件组态配置,…

FME+YOLOV7写DNF自动刷图脚本

目录 前言 一、难点分析 二、实现流程 1.DNF窗口位置获取 2.获取训练数据 3.数据标注 4.数据格式转换 5.数据训练 5.刷图逻辑编写 前言 这是一篇不务正业的研究,首先说明,这不是外挂!这不是外挂!这不是外挂!这只是用a…

【网络原理10】构造HTTP请求、HTTPS加密

目录 一、构造HTTP请求 ①使用form表单构造HTTP请求: form表单是如何提交的 form提交的缺点 ②基于ajax构造http请求 如何使用Jquery框架 二、HTTPS 运营商劫持 HTTP的加密版本:HTTPS ①对称加密:客户端和服务端使用同一把密钥&…

【AcWing】差分及其应用

&#x1f386;音乐分享 光辉岁月 (粤语版)_BEYOND 所谓差分&#xff0c;就是前缀和的逆运算 &#xff08;不懂前缀和的同学可以去C站看一下&#x1f602;&#xff09; 797. 差分 - AcWing题库 代码 #include<iostream> using namespace std; const int N 1e5 10…

怎样选择运动耳机、5款最佳运动蓝牙耳机推荐

你是否在跑步时大幅度抖动让耳机松落&#xff0c;不得不一遍又一遍的塞紧耳机&#xff1f;你是否在游泳时因为耳机进水而懊恼自己大意&#xff1f;没错&#xff0c;在运动过程中这些情况我都有遇到过&#xff01;运动耳机因其使用都是在跑步、游泳、骑行、徒步等场景&#xff0…

Apache Hadoop生态部署-Maxwell(实时数据同步)采集节点安装

目录 Apache Hadoop生态-目录汇总-持续更新 1&#xff1a;安装包准备 2&#xff1a;MySQL 环境准备 2.1&#xff1a;开启MySQL Binlog 2.2&#xff1a;验证mysql配置是否正确 2.3&#xff1a;初始化Maxwell元数据库,分配账号 3&#xff1a;安装 4&#xff1a;测试 Apach…

【开发规范】go项目开发中的[流程,git,代码,目录,微服务仓库管理,静态检查]

文章目录前言一、有哪些规范我们应该遵循二、项目开发流程三、git的代码分支管理1. 分支管理2. commit规范三、go的代码规范四、go项目目录规范五、微服务该采用multi-repo还是mono-repo&#xff1f;1. 引言2. Repos 是什么?3. 什么是 Mono-repo?4. Mono-repo 的劣势5. 什么是…

1、算法导论---时间复杂度、确定性和非确定性图灵机、算法的确定性与非确定性、P问题、NP问题、规约/约化、NPC问题、NP-hard问题

算法导论1、 时间复杂度2、图灵机3、算法的确定性与非确定性4、P问题5、NP问题6、规约/约化7、NPC问题8、NP-Hard问题9、四大问题关系1、 时间复杂度 要想了解算法的问题&#xff0c;首先要知道问题的分类&#xff0c;而要想知道问题的分类&#xff0c;就要先了解时间复杂度。…

_vue-2

v-model实现原理 我们在 vue 项目中主要使用 v-model 指令在表单 input、textarea、select 等元素上创建双向数据绑定&#xff0c;我们知道 v-model 本质上不过是语法糖&#xff08;可以看成是value input方法的语法糖&#xff09;&#xff0c;v-model 在内部为不同的输入元素…

什么是原型、原型链?原型和原型链的作用

1、ES6之前&#xff0c;继承都用构造函数来实现&#xff1b;对象的继承,先申明一个对象&#xff0c;里面添加实例成员<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><script…

Ubuntu(虚拟机)的Anaconda 及使用

安装Anaconda 使用firefox打开Ananconda网址Anaconda | The Worlds Most Popular Data Science Platform 下载后有.sh文件&#xff1a; Anaconda3-2022.10-Linux-x86_64.sh 进入所在目录打开终端并输入 $ bash Anaconda3-2022.10-Linux-x86_64.sh 然后开始安装。 对于给…

SAP MM学习笔记1-SAP中扩张的概念,如何将一个物料从工厂A扩张到工厂B

MM中在创建物料的时候&#xff0c;最低也得创建如下5个view。 基本数据1 基本数据2 购买管理 会计1 会计2 1&#xff0c;扩张是什么 有时候&#xff0c;你想增加其他的View&#xff0c;比如保管场所 等&#xff0c;你不能用MM02来做编辑&#xff0c;要用MM01来做扩张。这就是扩…

OSPF的多区域特性 (电子科技大学TCP/IP实验三)

一&#xff0e;实验目的 1、掌握OSPF 协议中区域的类型、特征和作用 2、掌握OSPF 路由器的类型、特征和作用 3、掌握OSPF LSA 分组的类型、特征和作用 4、理解OSPF 区域类型、路由器类型和OSPF LSA 分组类型间的相互关系 二&#xff0e;预备知识 1、静态路由选择和动态路…

分享美容美发会员管理系统功能的特点_美容美发会员管理系统怎么做

人们越来越关心美发&#xff0c;美发行业发展迅速&#xff0c;小程序可以连接在线场景&#xff0c;许多美发院也开发了会员卡管理系统。那么一个实用的美发会员管理系统怎么制作呢&#xff1f;它有什么功能&#xff1f;我们一起来看看~&#xff08;干货满满&#xff0c;耐心看完…

Lenovo Legion Y530-15ICH电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。硬件型号驱动情况主板Lenovo Legion Y530-15ICH处理器Intel Core™ i7-8750H (Coffee-Lake)已驱动内存16GB RAM DDR4 2667MHz已驱动硬盘2TB HP EX950 PCI-E Gen3 x4 NVMe SSD已驱动显卡Intel UHD Graphics 630Nvidia GTX 10…

电子科技大学TCP/IP实验一——IP分组和ARP协议

目录 一&#xff0e;实验目的 二&#xff0e;预备知识 三&#xff0e;实验原理 四&#xff0e;实验内容 五&#xff0e;实验步骤 六、实验数据及结果分析 七、实验结论 八、总结及心得体会 九、对本实验过程及方法、手段的改进建议 一&#xff0e;实验目的 1、掌握 IP…

Lambda表达式的本质

一直想写一篇文章&#xff0c;来总结lambda表达式&#xff0c;但是之前感觉总结的不是特别到位&#xff0c;现在看了几篇文章和视频后&#xff0c;感觉对lambda表达式有了比较深刻的认识&#xff0c;现在进行记录总结如下&#xff1a; lambda表达式又叫做匿名函数&#xff0c;…

数据恢复软件EasyRecovery Photo16新版本功能特点介绍

EasyRecovery Photo16是一款支持Mac/Wind平台进行恢复图片的专业工具&#xff0c;尤其是各种流行单反相机RAW格式文件&#xff0c;以及超大型视频文件等&#xff0c;摄影爱好者使用。EasyRecovery是一款非常专业的硬盘数据恢复工具&#xff0c;可以帮你恢复丢失的数据&#xff…

【论文极速读】VQ-VAE:一种稀疏表征学习方法

【论文极速读】VQ-VAE&#xff1a;一种稀疏表征学习方法 FesianXu 20221208 at Baidu Search Team 前言 最近有需求对特征进行稀疏编码&#xff0c;看到一篇论文VQ-VAE&#xff0c;简单进行笔记下。如有谬误请联系指出&#xff0c;本文遵循 CC 4.0 BY-SA 版权协议&#xff0c;…

华为OD机试题,用 Java 解【矩阵扩散】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…