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

【Scala---02】Scala 类与对象 『 类 | 属性 | 访问权限 | 方法 | 继承 | 伴生对象伴生类』

文章目录

  • 1. 定义类
  • 2. 属性
  • 3. 访问权限
  • 4. 方法
    • 4.1 方法 vs 函数
    • 4.2 方法重写
    • 4.3 方法重载
    • 4.4 构造方法
      • (1) 构造器定义
      • (2) 构造器的参数列表
      • (3) 构造器私有化
  • 5. 继承
  • 6. 伴生对象 & 伴生类
    • 6.1 伴生对象的由来
    • 6.2 伴生对象 & 伴生类
  • 7. 后续

1. 定义类

  • Java文件:一个文件中可以有多个类,但是必须存在一个类用public修饰,且用public修饰的类的类名 必须与文件名一样。
  • Scala文件:一个文件中可以包含多个类,且所有的类都不需要用public修饰。(因为所有的类默认加上了public关键字,如果再写上public就重复了,反而就会报错)

    注意:类和属性的修饰符,都是默认加上了public关键字,如果再写上就重复了,反而就会报错。

2. 属性

  • Java封装操作如下:

    1. 将属性进行私有化
    2. 提供一个公共的set方法,用于对属性赋值
    3. 提供一个公共的get方法,用于获取属性的值
  • 在scala中所有的属性,不管是用public还是private修饰,在底层都是private,并通过get方法(obj.field())set方法(obj.field_=(value))访问该属性。因此,那个修饰符只用于定义 访问权限 的,没有起到封装的效果(Java是借助修饰符达到封装的效果)。

  • 属性的定义:

    class Student{// 1. 类的属性一般用 var 修饰,因为一般要修改属性值// 2. 如果赋null值,用 _ 代替 nullvar name: String =  _// 3. 由于一些场景下Java框架要利用反射调用getXXX和setXXX方法,有时候为了和这些框架兼容,需要显示生成getXXX和setXXX方法//    如果需要显示的生成getter、setter方法,用 @BeanProperty 注解即可@BeanPropertyvar age: Int = _
    }object Student{def main(args: Array[String]): Unit = {val st =  new Student()st.age = 50}
    }
    

3. 访问权限

  1. private私有权限,只在类的内部和伴生对象中可用。
  2. protected为受保护权限,同类、子类可以访问,同包无法访问
  3. private[包名]为包访问权限,指定包名下的类可以访问
  4. 默认(什么都不写),就是public,任何类都可以访问

4. 方法

4.1 方法 vs 函数

  • 从广义上理解,函数 是更加广的一个概念,方法 是特殊的 函数。即:函数作为类的属性而存在时,此时函数叫做方法。
    从狭义上理解,方法 之外,才是 函数
  • 从位置上理解:方法 定义在类中,做为类的属性;函数 定义在方法中。 (狭义的函数)
  • 从是否可以重载的角度:方法定义在类中可以实现重载;函数不可以重载。 (狭义的函数)
  • 从运行位置角度:方法是保存在方法区;函数是保存在堆中。 (狭义的函数)

4.2 方法重写

  • def关键字前加上override关键字:
    class Person {def run(): Unit = {println("person run")}}class Student extends Person {// 在 def 关键字前加上 override 关键字override def run():Unit = {println("student run")}
    }
    

4.3 方法重载

  • 不用加关键字,直接写

    class Person {def run(): Unit = {println("person run")}def run(name: String): Unit  = {println(s"${name} run")}
    }
    

4.4 构造方法

(1) 构造器定义

Scala的构造方法分为两类:

  1. 主构造器:必须有
  2. 辅助构造器:必须调用主构造器
    在这里插入图片描述
  1. 主构造器必须有,如果主构造器没有参数,则括号可以省略。如:
    class Person {......
    }
    
  2. 主构造器的方法体在哪里???
    在这里插入图片描述
  3. 辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法
    在这里插入图片描述
  4. 构造器调用其他另外的构造器,要求被调用构造器必须提前声明。也就是说,存在代码的先后顺序。

(2) 构造器的参数列表

  1. 未用var或val修饰,这个参数就是一个局部变量,底层有属性的特性
  2. var修饰参数,作为类的成员属性,可以修改
  3. val修饰参数,作为类的成员属性,不能修改
package chapter06object Test07_ConstructorArgs {def main(args: Array[String]): Unit = {val person0 = new Person("zhangsan",11,"男")println(person0.name)println(person0.age)println(person0.sex)}
}// 主构造器参数 分为3类:
// 没有修饰符 : 作为构造方法中的传入参数使用
// val 修饰 : 会自动生产同名的属性 并且定义为val
// var 修饰 : 会自动生产同名的属性 并且定义为var
class Person (name1:String,val age:Int,var sex:String){val name = name1//  val age = age//  var sex = sex
}

(3) 构造器私有化

实现单例模式时,需要将构造器私有化。那么如何将构造器私有化,直接在主构造器前上加上private关键字:

class Student private (var name: String, var sage: Int){}object Student {private var instance:Student = _def getInstance(name:String, age:Int): Student = {if (instance == null) {instance = new Student("zhang",  18)return instance}instance}
}

5. 继承

Scala和Java一样都是单继承机制:
在这里插入图片描述

6. 伴生对象 & 伴生类

6.1 伴生对象的由来

在Java的类中,用 static 关键字修饰的内部类、方法、属性,可以通过类名访问。比如:

class Student{public static String school;
}
class Main {public static void main(String[] args) {System.out.printf(Student.school);  // 通过类名直接访问。}
}

这里的Student.school是通过类名来访问,并不是通过对象访问,Java号称面向对象,这里就相当与面向对象的理念冲突了。

所以,在Scala中,没有 static 关键字。为了实现与 static 关键字相同的功能,于是引入了伴生对象。

  • 问:删除static关键字容易,如何实现static关键字的功能呢?

  • 思路:static 修饰的就是当前类所共享的,而Student.school,中的Student应该是一个对象,而不是类。自然的想到为每个类创建第一个同名字的对象,然后将 static 修饰的东西都放入该对象中即可。

  • 例子:

    class Student(var name:String, var age:Int) {// 定义与类相关的一些信息def printerInfo():Unit = {println(s"姓名:${name}, 年龄;${age}")}
    }object Student{// 所有Student在同一所学校var school:String = "XXX高中"  // main方法本来应该用static修饰,所以应该写在这里def main(args: Array[String]): Unit = {var stu = new Student("张三", 18)stu.printerInfo()}
    }
    

6.2 伴生对象 & 伴生类

  1. 伴生对象用object关键字修饰,伴生类用class关键字修饰。

  2. 他俩的名字必须相同,

  3. 且必须放在同一个scala文件中。

    class Student{....
    }
    object Student{....
    }
    

因为伴生对象相当于是存放static的地方,所以所有类的对象共享伴生对象中的数据
伴生对象与伴生类可以相互访问对方中的数据

7. 后续

差不多了,告一段落!!!!
https://www.bilibili.com/video/BV1Xh411S7bP?p=77

相关文章:

【Scala---02】Scala 类与对象 『 类 | 属性 | 访问权限 | 方法 | 继承 | 伴生对象伴生类』

文章目录 1. 定义类2. 属性3. 访问权限4. 方法4.1 方法 vs 函数4.2 方法重写4.3 方法重载4.4 构造方法(1) 构造器定义(2) 构造器的参数列表(3) 构造器私有化 5. 继承6. 伴生对象 & 伴生类6.1 伴生对象的由来6.2 伴生对象 & 伴生类 7. 后续 1. 定义类 Java文件&#xf…...

一文掌握python列表的所有使用方法(零基础学python(一))

列表 Python 中的列表是一种可变的数据类型,它可以存储多个值,并且可以随时添加、删除或修改其中的元素。以下是 Python 列表的基本操作和示例代码: 创建列表 可以使用方括号 [] 来创建一个空列表,也可以在方括号中添加元素来创建一个非空列表。例如: empty_list = [] …...

头歌计算机组成原理实验—运算器设计(6)第6关:5位无符号阵列乘法器设计

第6关:5位无符号阵列乘法器设计 实验目的 帮助学生掌握阵列乘法器的实现原理,能够分析阵列乘法器的性能,能在 Logisim 中绘制阵列乘法器电路。 视频讲解 实验内容 在 Logisim 中打开 alu.circ 文件,在5位阵列乘法器中实现斜向…...

Java的运行原理

在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定…...

在已有VPC中创建EKS集群

1. 美东1 默认配置 创建在master-vcp中节点放在两上Public Subnet上,便于SSH登录维护Attach上默认安全组sg-071f18562f41b5804,打通各种常规的网络访问规则cat << EOF > master-eks-cluster.yaml apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata:name…...

Spring boot 注解@Async不生效 无效 不起作用

今天在做公司项目时&#xff0c;有一个发邮件的需求。所以写了一个发送邮件的方法后来发现发邮件很慢&#xff0c;导致接口响应也很慢。于是我便想到要使用异步调用去处理这个方法。于是我把注解Async 加到了自己service类下的一个发邮件的一个方法&#xff0c;后来发现并没有生…...

如何封装一个js文件?

封装js文件时的注意事项 避免全局变量污染&#xff1a;使用闭包或模块模式封装代码,不将变量暴露在全局作用域。 // 闭包方式 (function () {var a 1;function foo() {// ...} })();// 模块模式 var module (function () {var a 1;function foo() {// ...}return {foo: fo…...

计算卸载-论文05-双层优化(无线充电与卸载)

标题&#xff1a;《A Divide-and-Conquer Bilevel Optimization Algorithm for Jointly Pricing Computing Resources and Energy in Wireless Powered MEC》 期刊&#xff1a;IEEE TRANSACTIONS ON CYBERNETICS&#xff0c;2022 一、理论梳理 问题&#xff1a;相比于移动云…...

RSBBS 报表接口 query跳转 RRI

这里只讲RSBBS的goto query&#xff0c;不讲query里面的替换路径。 报表接口就是从一个query跳转到另一个目的地。从下面能看到&#xff0c;可以跳转到一个BW系统下的query&#xff0c;或者能跳转到ERP系统的一个ABAP report也行&#xff0c;或者可以通过archive link去从quer…...

失业五个月,终于有offer了!但这家公司的风评惨不忍睹,要接吗?

往年&#xff0c;程序员们找工作可以说是不怎么费力的&#xff0c;不少求职者还会比对几家offer&#xff0c;看薪酬、看加不加班、看通勤时间等等等等&#xff0c;最后选择自己最满意的那一家过去。 但是今年&#xff0c;情况确实完全不一样&#xff0c;用网友的话形容就是“往…...

智慧井盖监测终端,智能井盖-以科技解决智慧城市“顽疾”,守护城市生命线

平升电子智慧井盖监测终端,智能井盖-以科技解决智慧城市“顽疾”,守护城市生命线-智慧井盖&#xff0c;实现对井下设备和井盖状态的监测及预警&#xff0c;是各类智慧管网管理系统中不可或缺的重要设备&#xff0c;解决了井下监测环境潮湿易水淹、电力供应困难、通讯不畅等难题…...

VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti

这个时候我们需要去关掉几个功能 1、关闭Hyper-V 打开控制面板首页&#xff0c;找到“程序”&#xff0c;然后找到“启用或关闭Windows功能”&#xff0c;找到“Hyper-V”&#xff0c;有勾中的全部都取消掉&#xff0c;如果这一步操作失败&#xff0c;不要紧&#xff0c;继续…...

微信小程序开发实战课后习题解答————第四章(作业版)

一、填空题 1、 组件 是视图层的基本组成单元。 2、 swiper内部只可以放置 swiper-item 组件。 3、 设置text文本内容长按可选的属性是 selectable 。 4、navigator组件通过设置 open-type 属性&#xff0c;来区分不同的跳转功能。 5、通过image的 mode …...

web缓存—Squid代理服务

1.squid的相关知识 1.1 squid的概念 Squid服务器缓存频繁要求网页、媒体文件和其它加速回答时间并减少带宽堵塞的内容。 Squid代理服务器&#xff08;Squid proxy server&#xff09;一般和原始文件一起安装在单独服务器而不是网络服务器上。Squid通过追踪网络中的对象运用起…...

免费可用 ChatGPT 网页版

前言 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI 研发的聊天机器人程序 &#xff0c;于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过理解和学习人类的语言来…...

【JVM】7. 方法区

文章目录 7. 方法区7.1. 栈、堆、方法区的交互关系7.2. 方法区的理解7.2.1. 方法区在哪里&#xff1f;7.2.2. 方法区的基本理解7.2.3. HotSpot中方法区的演进 7.3. 设置方法区大小与OOM7.3.1. 设置方法区内存的大小7.3.2. 如何解决这些OOM 7.4. 方法区的内部结构7.4.1. 方法区&…...

23种设计模式之代理模式(Proxy Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的代理模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不…...

服务扫描与查点-渗透测试模拟环境(3)

本篇将介绍服务扫描与查点渗透模拟环境下整理的各类收集方法、各类工具技术使用的演示,阅读后可用在工作上。 很多网络服务是漏洞频发的高危对象,对网络上的特定服务进行扫描,往往能让我们少走弯路,增加渗透成功的几率。确定开放端口后,通常会对相应端口上所运行服务的信息…...

Educational Codeforces Round 148 (Rated for Div. 2) 题解

总结&#xff1a;5.21下午VP一场&#xff0c;死在了A题&#xff0c;给我wa崩溃了&#xff0c;浪费了差不多一个小时&#xff0c;BC还挺顺畅&#xff0c;虽然C题是在结束后不久交上去的。。。。 A. New Palindrome 思路&#xff1a;其实思路很简单&#xff0c;“The string s …...

Java自定义类:打造属于自己的编程世界

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java核心技术专栏 目录 一、自定义类示例 二、隐式参数与显式参数 三、封装的优点 自定义类是Java中最基本、也是最重要的组成部分之一&#xff0c;使用者可以根据需求创建…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

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

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

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...