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

Scala之面向对象

目录

Scala包:

基础语法:

Scala包的三大作用:

包名的命名规范:

写包的好处:

包对象:

导包说明:

类和对象:

定义类:

封装:

构造器:

 主从构造器的加载机制:

继承:

基础语法:

抽象属性:

多态:

Java中的多态测试

Scala测试如下:


Scala的面向对象思想和Java是一致的

Scala包:

基础语法:

        package 包名.类名

Scala包的三大作用:

        区分相同名字的类

        当类很多时,可以很好的管理类

        控制访问范围

包名的命名规范:

             一般是小写字母+小圆点

   com.公司名.项目名.业务模块名

写包的好处:

在maven中可以将自己写的包通过maven导入到项目中

在Scala中独有的包的写法  和文件夹不对应  可以独立存在

下图是我在类下边建的包,和正常的包一样使用 

 包是可以嵌套的

内层调用外层 不需要导包  atguigu包在techer下
外层调用内层 对象 需要导包

如下代码:

package chapter04
object Test_01_package {def main(args: Array[String]): Unit = {}
}
//Scala独有的
package techer {import chapter04.techer.atguigu.Innerobject test01t {def main(args: Array[String]): Unit = {println("hello  我是大哥 pack")//外层调用内层 对象 需要导包//Inner.main是下边那个包中的Inner.main(args)}}package atguigu {object Inner {def main(args: Array[String]): Unit = {println("Inner")//内层调用外层 不需要导包  atguigu包在techer下test01t.main(args)}}}
}

包对象:

在Scala中包也是面向对象的,只要在包的内部(只要在内部都可以,内层的嵌套也可以),都可以直接调用包对象的属性和方法

如果包有嵌套,会出现覆盖的情况,则会调用距离最近的包的属性与方法(包距离最近则会后调用,会覆盖先前调用的)

导包说明:

导包是不支持嵌套的(导包后只能用它下边的类和对象,不能再用它下边的包,如果想使用它下边包中的方法,就需要使用   .   但是当我们导包直接导入它下边的包  就可以直接调用,不需要用  .     来使用)

Scala 中的三个默认导入分别是
import java.lang._
import scala._
import scala.Predef._

类和对象:

类:可以看成一个模板
对象:表示具体的事物

我们在使用对象的时候,会以类为模板创建对象

定义类:

在Java中一个文件中只能有一个public    

在Scala中 默认的是public 但是它在一个文件中可以创建多个伴生类和伴生对象

封装:

在Scala中属性只有两种  可变(var)与不可变(val)(分离了读写权限----类似与面向对象中的封装(封装get  set  方法  是为了分离读写权限))

在Scala直接通过属性的类型来分离

在Scala中属性的类型已经封装成    var----private       val----private final         

并且get  set方法也已经封装(封装成了注解,在使用get  set方法的时候需要 先引入注解@BeanProperty----不过该注解的作用域只有一个属性  意思是  一个属性需要设置一个注解)

构造器:

面向对象的语言基本都有构造器(构造方法),如果在类中不写构造方法  默认构造器为空参构造方法

在Scala中也有构造器,与Java不同,

Scala的构造器是在类名上加个()   是主构造器(主构造器无参的时候可以省略()  表示默认是可以无参构造的  类同Java)

有主构造器就一定有从构造器

在主构造器的内部可以定义辅助构造器 定义的格式是固定的,在从构造器的内部第一行代码必须是直接或者间接的调用主构造器

class Person03(name:String){var name1:String=name
def this(){this("唐不唐")println("hello world")}
}

 主从构造器的加载机制:

在Scala中没有类加载机制,所以在代码直接调用辅助构造器的时候它是不知道类中的内容的, 所以上边要求(从构造器的内部第一行代码必须是直接或者间接的调用主构造器),这就是原因所在,获取类信息(加载一遍),调用完后才会返回从构造器继续执行

根据main方法中你的参数决定你调用那个构造器

从构造器是有先后顺序的,后边的只能调用前面的(所调用的构造器必须在本构造器之前)

从构造器的名称统一为this(根基参数的个数来区分)

主构造器是可以传参的 参数可以当作属性来使用(参数类型如果省略,默认val)

继承:

继承关键字:extends

基础语法:

        class 子类名 extends 父类名 { 类体 }

子类继承父类的属性方法

scala 是单继承

继承的本质:其实与Java是完全不一样的

在创建子类的对象时,Scala会先创建父类的对象让后在外层创建子类对象(同Java)

Scala继承的本质就是继承父类的一个构造器(继承那个构造器(参数个数来区别)就会调用那个)

抽象属性:

就是不写等号,写抽象方法需要把类改成抽象类

抽象属性在使用的时候需要继承它   让后需要重写属性和方法(在Java中是不需要重写属性的,因为Scala底层是对属性进行封装,自带方法)

在重写抽象类中的非抽象方法的时候需要在重写的方法前面加上    override   关键字

子类调用父类的方法的时候使用关键字super  

子类对抽象属性进行实现,父类抽象属性可以用 var 修饰;

子类对非抽象属性重写,父类非抽象属性只支持 val 类型,而不支持 var。
因为 var 修饰的为可变变量,子类继承之后就可以直接使用(可以直接进行修改),没有必要重写

多态:

父类的引用指向子类的实例

Java中的多态测试

:在父子共有的属性和方法调用的是父类还是子类:

public class Polymorphic {public static void main(String[] args) {Person person=new Student();System.out.println(person.name);person.sayhi();}public static class Person{String   name="Person";public void sayhi(){System.out.println("person  sayhi");}}
public static class Student extends Person{String name="Student";public void sayhi(){System.out.println("student sayhi");}
}}

属性是调用父类   方法是调用子类   

在进行多态的时候是先将整个内存先把父类写入里面,再把子类嵌套到外边

引用是使用栈 把地址值是先指向父类的   指向谁就调用谁的属性,但是调用方法是一层一层的调用,是不断的被重写的,所以方法是调用子类

而Scala与Java不同 都是调用的子类的

Scala测试如下:

package chapter04object Test07_Polymorphic {def main(args: Array[String]): Unit = {val  per:Person07=new Student07per.sayhi();println(per.name)}
}
class Person07()
{val name:String="dsdsd"
def sayhi():Unit={println("hi person")
}
}
class Student07 extends Person07{override val name: String = "Student"
override def sayhi(): Unit ={println("Student say hi")}
}

 匿名子类:

可以使用匿名子类直接调用抽象类

也可以直接new这个抽象子类

匿名子类是自动使用多态的

多态无法调用子类独有的属性和方法,外部无法使用匿名子类中特有的(它自己的)方法和属性

相关文章:

Scala之面向对象

目录 Scala包: 基础语法: Scala包的三大作用: 包名的命名规范: 写包的好处: 包对象: 导包说明: 类和对象: 定义类: 封装: 构造器: 主从…...

深度学习目标检测项目实战(四)—基于Tensorflow object detection API的骨折目标检测及其界面运行

深度学习目标检测项目实战(四)—基于Tensorflow object detection API的骨折目标检测及其界面运行 使用tensorflow object detection进行训练检测 参考原始代码:https://github.com/tensorflow/models/tree/master/research 我用的是1.x的版本 所以环境必须有gpu版…...

嵌入式工程师如何快速的阅读datasheet的方法

目录 ▎从项目角度来看datasheet ▎各取所需 ▎最后 Datasheet(数据手册)的快速阅读能力,是每个工程师都应该具备的基本素养。 无论是项目开始阶段的选型还是后续的软硬件设计,到后期的项目调试,经常有工程师对着英…...

(三)合约广告

1. 广告位(CPT)合约 系统:广告排期系统 网站把某一个广告位卖给广告商,这段时间归广告商所有,到点了下线 (1)流量选择的维度:时间段、地域等 (2)典型场景…...

【Android -- 软技能】分享一个学习方法

前言 很多人都想通过学习来提升自己,但是,可能因为两个问题,阻碍了自己的高效提升: 学什么? 怎么学? 本文将从自己的学习实践出发,针对这两个问题,给出自己的一套学习流程。 1…...

Python-DQN代码阅读(10)

目录 1.代码 1.1 代码阅读 1.2 代码分解 1.2.1 f open("experiments/" str(env.spec.id) "/performance.txt", "a") 1.2.2 f.write(str(ep) " " str(time_steps) " " str(episode_rewards) " " str(…...

MongoDB入坑

MongoDB入坑一、体系架构1、简介2、MongoDB VS RDBMS3、文件4、体系结构二、权限管理1、开启2、角色三、存储引擎四、备份 & 恢复五、高可用0、主从复制1、副本集2、分片一、体系架构 1、简介 DBMS No.5;NoSQL Document No.1 1)BSON BSON(Binary …...

【论文总结】针对操作系统级虚拟化的抽象资源攻击

介绍 这是一篇来自2021CCS的论文,作者有Nanzi Yang, Wenbo Shen, Jinku Li, Yutian Yang, Kangjie Lu, Jietao Xiao, Tianyu Zhou, Chenggang Qin, Wang Yu, Jianfeng Ma, Kui Ren。 概述 本文的贡献如下: 新的攻击面:作者揭示了一个影响操…...

C# 提取 PDF 文档中的文本

C# .Net 使用 IText7 从PDF文件中提取出所有文本内容 【文 / 张赐荣】 首先在 Nuget 包管理器中,安装"itext7" 和 "itext7.font-asian"。 如果不安装 "itext7.font-asian" PDF 文件中有非Unicode编码的字符,将会抛出运行时异常:iText.IO.Excep…...

mac如何升级node版本、切换node版本

一、mac如何升级node版本 当前官网稳定版本是18.15.0 所以我从v14.17.4升级到v18.15.0 二、mac如何切换node版本 切换到16.20.0版本 三、这里是用node.js的多版本管理器n来升级和切换的,命令如下: 1、sudo npm cache clean -f //清除node.js的cache …...

一位大专学历的女程序员要求月薪25K,学历重要吗?来看看面试过程

“请提供一份完整的简历,以便我审查。从您的简历中,我感觉您写得还不错。方便的话,您可以自我简单介绍一下吗?“ ”好的,我叫李娟,拥有大专学位,目前正在寻找一份Java开发架构师的工作岗位。“…...

ESP32驱动1.28寸GC9A01播放视频(一、视频分辨率的调整和视频格式的转换)

ESP32驱动1.28寸GC9A01播放视频(一、视频分辨率的调整和视频格式的转换)播放前准备转换视频分辨率用FFmpeg将.MP4转换为.mjpeg格式FFmpeg的win10环境搭建FFmpeg的下载环境变量的搭建MP4转换成mjpeg格式总结播放前准备 1.28寸GC9A01屏幕的分辨率是240x24…...

epoll的LT模式(水平触发)和ET模式(边沿触发)

前言 epoll的触发模式是个引发讨论非常多的话题,网络上这方面总结的文章也很多,首先从名字上就不是很统一,LT模式常被称为水平触发、电平触发、条件触发,而ET模式常被称为边缘触发、边沿触发等,这些都是从英文翻译过来…...

Java基础面试20题

Java的八大基本数据类型 答:可以分4种类型:布尔类型(boolean),字符类型(char),浮点类型(double,float),整型(byte,short,int, long)。 String,StringBuffer与StringBuilder的区别? …...

Java面向对象封装

目录 封装的概念 封装具体实现步骤 示例代码如下 封装具体语法 封装的概念 Java封装是一种面向对象的编程方法,它的主要思想是将类的内部细节(包括数据和方法)隐藏起来,对外只提供公共的访问接口,从而保证了程序的安全性和稳定性。 封装具体实现步骤 1、声明类的成…...

队列实现图书信息管理(C语言)

文章目录Queue.hmain.cQueue.c用队列实现一个图书信息管理,这里放一下有哪些文件。(ps:我之前写的是学生信息管理,但是有人说我们的作业是写图书,就该了下内容,没有改文件名)队列是用链表实现的…...

Java开发 - 读写分离初体验

前言 上一篇中,我们介绍了主从复制,相信学过的小伙伴已经能够很好的掌握主从复制的技术,实际上也并没有那么难,虽然没有讲一主多从,多主多从的配置,但是从一主一从的配置中也很容易联想到该怎么配置&#…...

图文详解CAN Log文件 - ASC文件格式

目录 1 CAN Log文件 -- ASC文件格式 1.1 Header 1.2 版本编号 1.3 经典CAN网络中的描述 1.3.1 经典CAN Standard标准帧的描述 1.3.2 经典CAN Extended扩展帧的描述 1.3.3 CAN Remote远程帧的描述 1.3.4 CAN Error错误帧的描述 1.4 CANFD网络中的描述 1.4.1 经典CAN S…...

网络编程套接字(一)

学习任务: 我们先来认识端口号,区分好主机IP和端口号的区别,以及涉及到进程PID和端口号的区别。 然后简单认识一下TCP协议和UDP协议,这两个协议都是传输层的。接着了解什么是网络字节序,它有什么作用。然后是网络编程的…...

Mysql数据库存储过程

1、参数分类 存储过程的参数类型可以是IN、OUT和INOUT。根据这点分类如下: 1、没有参数(无参数无返回) 2、仅仅带 IN 类型(有参数无返回) 3、仅仅带 OUT 类型(无参数有返回) 4、既带 IN 又带 O…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

EtherNet/IP转DeviceNet协议网关详解

一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

企业如何增强终端安全?

在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...