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

scala---面向对象(类,对象,继承,抽象类,特质)

 一、类(class)和 对象(object)

1、类

类就是对客观的一类事物的抽象。用一个class关键字来描述和Java一样,在这个类中可以拥有这一类事物的属性,行为等等。

2、为什么要有对象

在java中的一个class既可以拥有非静态的成员,也可以拥有静态static的成员。但是在scala中的class结构中,只能拥有非静态。为了给scala中的类也来提供类似于java中的静态成员的功能,于是乎就有了Object对象这个结构。

3、对象

class中定义的main是无法运行,因为class结构中只能拥有非静态,而object所修饰的结构中的所有的成员都是static静态,所以object的作用1、给Scala类提供程序运行的入口,静态的main函数。2、给Scala类也来提供静态成员——Scala类的伴生对象来实现

class ScalaClassTest {//定义属性   注解与private不能共存@BeanProperty var id =11//用val修饰的变量是只读变量,有getter没有setter方法,相当于Java中的finalval hobby="play"//没有指定初始值时用下划线代替,必须补全数据类型var age:Int=_//private 修饰的属性只能在本类或伴生对象中进行调用private val name="xiao"//加this只能在本类中调用private[this] val color ="pink"//定义方法def hello()={println("我是类当中的一个方法"+color)}
}object ScalaClassTest{def main(args: Array[String]): Unit = {//创建对象val s=new ScalaClassTest//调用属性println(s.id)println(s.hobby)println(s.name)s.hello()//真正的sets.id_=(222)println(s.id)//调用get/set方法s.setId(333)println(s.getId)}
}
4、伴生类和伴生对象

同一个scala源文件中可以包含类名相同的一个class和object,这在java中是不被允许的;同时上述的这种单例的构造结果,可以看到对一个class似乎也提供了静态的功能。把这种结构,和class在同一个源文件(.scala)中同名object结构称之为该类的伴生对象,把该类称之为该object的伴生类。
注:1.伴生对象和伴生类的私有属性可以相互调用

class ClassAndObject {var id = 13val hobby = "read"private val color = "blue"def hello()={println("dahuang"+ClassAndObject.con)}
}object ClassAndObject{private val con="看大门"def main(args: Array[String]): Unit = {//创建对象val c = new ClassAndObject//调用伴生类当中的非私有属性println(c.id)println(c.hobby)//调用伴生类中的私有属性println(c.color)//调用方法c.hello()}
}

2.要想使用伴生对象创建本类的对象,必须要让本伴生对象复写一个apply方法,该apply方法的参数列表对应的是本类构造器的参数列表

//在类名后面,与类交织在一起的就是主构造器
//如果没加var就只是构造参数,如果加上var修饰就升级为属性
class ApplyTest(name:String,age:Int) {println(name)println(age)var color="pink"//创建辅助构造器def this(name:String,age:Int,color:String){//辅助构造器的首行必须调用主构造器或其他辅助构造器this(name,age)this.color=colorprintln(color)}
}object ApplyTest{//使用apply方法创建def apply(name: String, age: Int): ApplyTest = {println("调用了主构造器")new ApplyTest(name, age)}def apply(name: String, age: Int, color:String): ApplyTest ={println("调用了辅助构造器")new ApplyTest(name, age, color)}def main(args: Array[String]): Unit = {//调用了主构造器val a = ApplyTest("haha",32,"pin")//调用ApplyTest对象中对应的apply方法//调用了辅助构造器val a1= ApplyTest("na",88)}
}

 二、继承

1、特点

(1)子类可以继承父类的所有非私有(private),非静态的成员(变量和成员方法)。 

(2)可以添加自己独有的成员,也可以对父类的相关方法进行覆盖/重写

(3)被final修饰的父类成员,子类不可以继承

(4)被protected修饰的父类成员,子类可以继承

(5)子类的访问权限必须要大于等于父类

class ExtentsTest {val id = 12protected var age:Int = 0def hello()={println("我是父类当中的方法")}
}class Test extends ExtentsTest{val name = "xiaohuang"age=20def bye()={println("我是子类当中的方法"+age)}
}object enter1{def main(args: Array[String]): Unit = {val test = new Test//调用父类当中的属性和方法println(test.id)test.hello()//调用自己本身的属性和方法println(test.name)test.bye()}
}
2.protected(受保护字段和方法)

特点:

        (1)Java:只能被子类访问,同时必须要在本包下面被访问

      (2)ScalaJava的基础之上,可以做到更灵活、更精准的访问权限控制。scala中提供了一个更加强大的功能来精确的控制一个成员的访问权限。就只有privateprotected,在后面加上中括号[],[]里面写上要在哪一个范围内可以被访问

三、抽象类

scala中的抽象类也是使用abstract关键字来进行定义;同时该抽象类中既可以有抽象方法,也可以有非抽象方法;scala中的抽象方法可以省略abstract关键字。

abstract class AbstractTest {val name:Stringdef sayHello()={println("我是父类当中原装的方法")}
}class test extends AbstractTest{//子类重写父类中的抽象属性override val name: String = "cici"//子类重写父类当中的非抽象方法override def sayHello(): Unit = {println("我是父类当中被重写的方法")}//子类独有的方法,调用父类当中的方法def only()=super.sayHello()}object test{def main(args: Array[String]): Unit = {val t = new test//调用属性和方法println(t.name)t.sayHello()//调用自身的方法t.only()}
}

四、Trait(特质)

        Scala中的这个继承和java的继承有一个缺陷,只能进行单继承,可以进行多层继承,但是多层继承又有要求,类与类之间必须具有继承关系,这显然不一定满足,还是有局限的。所以在java中推出了接口interface这个概念来满足多重继承,只不过这里不叫继承,而称之为多实现,使用关键字implements来连接,多个接口interface之间使用","进行分割。

        Scala对于同样的需求,设计出了另外一个结构——trait,特质。trait的功能要比java中的接口强大的多,不仅仅拥有抽象方法,还可以拥有非抽象方法,同时可以多重扩展trait,扩展特质的时候使用关键extends,多个特质之间使用with进行连接。

相关文章:

scala---面向对象(类,对象,继承,抽象类,特质)

一、类(class)和 对象(object) 1、类 类就是对客观的一类事物的抽象。用一个class关键字来描述和Java一样,在这个类中可以拥有这一类事物的属性,行为等等。 2、为什么要有对象 在java中的一个class既可…...

【机器学习300问】68、随机初始化神经网络权重的好处?

一、固定的初始化神经网络权重可能带来的问题 在训练神经网络的时候,初始化权重如果全部设置为0或某个过大值/过小值。会导致一些问题: 对称权重问题:全为0的初始化权重会导致神经网络在前向传播时接收到的信号输入相同。每个神经网络节点中…...

数据结构与算法——20.B-树

这篇文章我们来讲解一下数据结构中非常重要的B-树。 目录 1.B树的相关介绍 1.1、B树的介绍 1.2、B树的特点 2.B树的节点类 3.小结 1.B树的相关介绍 1.1、B树的介绍 在介绍B树之前,我们回顾一下我们学的树。 首先是二叉树,这个不用多说&#xff…...

Tomcat源码解析——Tomcat的启动流程

一、启动脚本 当我们在服务启动Tomcat时,都是通过执行startup.sh脚本启动。 在Tomcat的启动脚本startup.sh中,最终会去执行catalina.sh脚本,传递的参数是start。 在catalina.sh脚本中,前面是环境判断和初始化参数,最终…...

蓝桥杯真题演练:2023B组c/c++

日期统计 小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 到 9 的范围之内。 数组中的元素从左至右如下所示: 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 …...

微信小程序实现预约生成二维码

业务需求&#xff1a;点击预约按钮即可生成二维码凭码入校参观~ 一.创建页面 如下是博主自己写的wxml&#xff1a; <swiper indicator-dots indicator-color"white" indicator-active-color"blue" autoplay interval"2000" circular > &…...

专业140+总分410+北京理工大学826信号处理导论考研经验北理工电子信息通信工程,真题,参考书,大纲。

今年考研专业课826信号处理导论&#xff08;信号系统和数字信号处理&#xff09;140&#xff0c;总分410&#xff0c;顺利上岸&#xff01;回看去年将近一年的复习&#xff0c;还是记忆犹新&#xff0c;有不少经历想和大家分享&#xff0c;有得有失&#xff0c;希望可以对大家复…...

做一个后台项目的架构

后台架构的11个维度 架构1&#xff1a;团队协助基础工具链的选型和培训架构2&#xff1a;搭建微服务开发基础设施架构3&#xff1a;选择合适的RPC框架架构4&#xff1a;选择和搭建高可用的注册中心架构5&#xff1a;选择和搭建高可用的配置中心架构6&#xff1a;选择和搭建高性…...

嵌入式单片机 TTL电平、232电平、485电平的区别和联系

一、简介 TTL、232和485是常见的串口通信标准&#xff0c;它们在电平和通信方式上有所不同&#xff0c; ①一般情况下TTL电平应用于单片机外设&#xff0c;属于MCU/CPU等片外外设&#xff1b; ②232/485电平应用于产品整体对外的接口&#xff0c;一般是片外TTL串口转232/485…...

2024年大唐杯备考

努力更新中…… 第一章 网络架构和组网部署 1.1 5G的网络整体架构 5G网络中的中传、回传、前传&#xff08;这里属于承载网的概念&#xff09; CU和DU之间是中传 BBU和5GC之间是回传 BBU和AAU之间是前传&#xff08;这个好记&#xff09; 这里竟然还藏了MEC&#xff08;…...

Spring Boot(06):Spring Boot与MySQL搭配,打造极简高效的数据管理系统

1. 前言 Spring Boot 是一个基于Spring框架的快速开发框架&#xff0c;可以使开发者快速搭建一个可靠的Java Web应用程序。而MySQL是最广泛使用的关系型数据库系统之一&#xff0c;也是Spring Boot整合数据库的首选。本文将介绍Spring Boot如何整合MySQL数据库。 2. 摘要 本文…...

Vue3 + Vite 构建组件库发布到 npm

你有构建完组件库后&#xff0c;因为不知道如何发布到 npm 的烦恼吗&#xff1f;本教程手把手教你用 Vite 构建组件库发布到 npm 搭建项目 这里我们使用 Vite 初始化项目&#xff0c;执行命令&#xff1a; pnpm create vite my-vue-app --template vue这里以我的项目 vue3-xm…...

Vite多环境配置与打包:灵活高效的Vue开发工作流

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…...

从零实现诗词GPT大模型:数据集介绍和预处理

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 本章将介绍该系列文章中使用的数据集&#xff0c;并且编写预处理代码&#xff0c;处理成咱们需要的格式。 一、数据集介绍 咱们使用的数据集名称是chinese-poetry&#xff0c;是一个在github上开源的中文诗…...

45.HarmonyOS鸿蒙系统 App(ArkUI)创建列表(List)

列表是一种复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、音乐列…...

推荐算法之协同过滤

算法原理 透过百科&#xff0c;我们了解到协同过滤推荐&#xff08;Collaborative Filtering recommendation&#xff09;是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同&#xff0c;协同过滤算法结合用户行为分析用户…...

Kotlin 面试题

lifecycleScope.launchWhenResumed launchWhenResumed是一个扩展函数,它是LifecycleCoroutineScope的一部分,并且它是在Android的Lifecycle库中引入的。 这个函数的主要目的是在Lifecycle的对应组件(通常是Activity或Fragment)处于“resumed”状态时启动协程。 public fun …...

TCM(Tightly Coupled Memory)紧密耦合存储器简介

在ARM Cortex处理器中&#xff0c;TCM通常指的是紧密耦合存储器&#xff08;Tightly Coupled Memory&#xff09;。TCM是一种位于处理器核心旁边的高速存储器&#xff0c;它的设计目的是为了提供低延迟和高带宽的内存访问性能。 TCM的特点是它与处理器内核紧密耦合&#xff0c;…...

《自动机理论、语言和计算导论》阅读笔记:p172-p224

《自动机理论、语言和计算导论》学习第 8 天&#xff0c;p172-p224总结&#xff0c;总计 53 页。 一、技术总结 1.Context-Free Grammar(CFG) 2.parse tree (1)定义 p183&#xff0c;But perhaps more importantly, the tree, known as a “parse tree”, when used in a …...

typescript playwright 笔记

录制调式 命令 npx playwright codegen url npx playwright codegen https://www.baidu.com/typescript 中 format 和 split 的使用 import * as util from util;const str1 hellow %s; const format util.format; const str2 format(str1, word);// 提取taskId const str3…...

AI编程专栏(三) - Cursor 高级技巧与实战优化

1. Cursor高级功能深度解析 第一次接触Cursor时&#xff0c;你可能觉得它就是个带AI的代码编辑器。但当我真正用它完成一个企业级项目后&#xff0c;才发现那些藏在深处的功能才是真正的生产力神器。比如最近在重构一个老旧的React项目时&#xff0c;通过合理使用MCP协议&#…...

Phi-3-mini-4k-instruct快速体验:Ollama部署教程与入门Prompt分享

Phi-3-mini-4k-instruct快速体验&#xff1a;Ollama部署教程与入门Prompt分享 1. 模型简介 Phi-3-Mini-4K-Instruct是微软推出的轻量级开源语言模型&#xff0c;具有以下核心特点&#xff1a; 轻量高效&#xff1a;仅38亿参数&#xff0c;适合在普通硬件上运行强大推理&…...

RStudio Server部署与运维实战:从零搭建到高效管理

1. 环境准备&#xff1a;搭建RStudio Server的基石 在开始部署RStudio Server之前&#xff0c;我们需要确保服务器环境已经准备就绪。就像盖房子需要打地基一样&#xff0c;这一步决定了后续所有工作的稳定性。我遇到过不少因为环境问题导致的安装失败案例&#xff0c;大多数都…...

OpenClaw浏览器控制:GLM-4.7-Flash实现自动化数据采集

OpenClaw浏览器控制&#xff1a;GLM-4.7-Flash实现自动化数据采集 1. 为什么选择OpenClaw进行网页数据采集 去年我在做一个市场分析项目时&#xff0c;遇到了一个棘手的问题——需要从十几个行业网站定期采集数据&#xff0c;但每个网站的页面结构都不一样。手动复制粘贴效率…...

ComfyUI-VideoHelperSuite终极指南:掌握视频合成与AI工作流的核心技巧

ComfyUI-VideoHelperSuite终极指南&#xff1a;掌握视频合成与AI工作流的核心技巧 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 想要将AI生成的图像序列转化为流…...

ESP8266轻量Web服务器库myWebServerESP深度解析

1. myWebServerESP&#xff1a;面向ESP8266/NODEMCU的轻量级嵌入式Web服务器库深度解析1.1 项目定位与工程价值myWebServerESP是一个专为 ESP8266 系列芯片&#xff08;含 NodeMCU 开发板&#xff09;设计的轻量级、可配置 Web 服务框架&#xff0c;运行于 Arduino IDE 生态下。…...

SHA-3:从海绵结构到抗量子密码学的基石

1. SHA-3的诞生背景与核心价值 2004年&#xff0c;密码学界发现SHA-1存在理论漏洞&#xff0c;这直接推动了NIST启动新一代哈希算法竞赛。经过5年激烈角逐&#xff0c;Keccak团队提出的海绵结构方案最终胜出。与传统哈希算法不同&#xff0c;SHA-3不是对SHA-2的简单升级&#x…...

保姆级教程:在Ubuntu 22.04物理机上,从开启SSH到配置IPv6防火墙的完整流程

Ubuntu 22.04物理机从SSH配置到IPv6防火墙的完整安全指南 当你拿到一台全新的Ubuntu物理机时&#xff0c;如何安全地配置远程访问并启用IPv6连接&#xff1f;本文将带你从零开始&#xff0c;一步步完成从系统初始化到防火墙配置的全过程。无论你是搭建家庭服务器、开发测试环境…...

告别拼写红线:Vim-galore教你打造专属拼写检查系统

告别拼写红线&#xff1a;Vim-galore教你打造专属拼写检查系统 【免费下载链接】vim-galore :mortar_board: All things Vim! 项目地址: https://gitcode.com/gh_mirrors/vi/vim-galore 你是否厌倦了在Vim中写作时不断出现的拼写错误红线&#xff1f;想要一个强大而灵活…...

caj2pdf使用技巧:10个高效转换CAJ文件的实用方法

caj2pdf使用技巧&#xff1a;10个高效转换CAJ文件的实用方法 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换&#xff0c;成功与否&#xff0c;皆是玄学。 项目地址: https://gitcode.com/gh_mirr…...