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

news2024/11/18 18:43:41

文章目录

  • 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值,用 _ 代替 null
        var name: String =  _
        // 3. 由于一些场景下Java框架要利用反射调用getXXX和setXXX方法,有时候为了和这些框架兼容,需要显示生成getXXX和setXXX方法
        //    如果需要显示的生成getter、setter方法,用 @BeanProperty 注解即可
        @BeanProperty
        var 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 chapter06

object 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

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

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

相关文章

JavaScript全解析——ES6函数中参数的默认值和解构赋值

本文为千锋资深前端教学老师带来的【JavaScript全解析】系列,文章内含丰富的代码案例及配图,从0到1讲解JavaScript相关知识点,致力于教会每一个人学会JS! 文末有本文重点总结,可以收藏慢慢看~ 更多技术类内容&#xf…

AI向百万薪资 高级原画师开刀?!爆Midjourney入局3D模型生成

来源 SoulofArt | ID Soul_Art 现在AI向高级原画师和3D开刀了? 网传爆料AI已入局3D模型生成... 这进化速度放在整个行业都十分炸裂 4月,Midjourney进一步宣布推出Niji-journey V5 这是MJ针对二次元动漫风格预训练好的模型 可在其中添加提示词直接调…

Android 广播使用详解(Broadcast Receivers)

Android 广播接收器(Broadcast Receivers) 广播接收器用于响应来自其他应用程序或者系统的广播消息。这些消息有时被称为事件或者意图。例如,应用程序可以初始化广播来让其他的应用程序知道一些数据已经被下载到设备,并可以为他们所用。这样广播接收器可…

Kubernetes配置管理 ConfigMap

Kubernetes配置管理 ConfigMap 一、ConfigMap 1.1 什么是configmap kubernetes集群可以使用ConfigMap来实现对容器中应用的配置管理。可以把ConfigMap看作是一个挂载到pod中的存储卷 1.2 创建ConfigMap的4种方式 1.2.1 在命令行指定参数创建 通过直接在命令行中指定config…

新手玩转腾讯云轻量应用服务器搭建网站(保姆级教程)

腾讯云轻量应用服务器镜像选择宝塔Linux面板,然后在宝塔面板上安装LNMP网站所需的Web环境,在宝塔面板上新建站点,上床网站程序安装包到根目录,并安装网站全流程。腾讯云百科来详细说下腾讯云轻量应用服务器搭建网站全流程&#xf…

opencv显示图片

要使用OpenCV在Python中显示图像,您需要遵循以下步骤: 1. 首先,确保已经安装了OpenCV。您可以使用以下命令安装OpenCV: pip install opencv-python 2. 然后,编写一个简单的程序来读取并显示图像。以下是一个示例代码…

数据可视化之雷达图(Radar Chart)

什么是雷达图? 雷达图(Radar Chart)也称为蜘蛛图、网络图或极坐标图,是一种用于可视化多变量数据的图表。该图表由一系列从中心点向外辐射的辐条组成,每个辐条代表一个不同的变量。数据使用线或区域绘制在每个辐条上&#xff0c…

面试的水太深,年轻人你把握不住.....

前言 去阿里面试测试工程师,这里面水太深,什么未来规划,职业发展的东西都是虚拟的,作者还太年轻,没有那个经历,把握不住。项目只有几个,开心快乐就行,不PK,文明PK。 很…

Partial convolution Gated convolution

组会讨论帖 1. 图像修复 图像修复(Image Inpainting),顾名思义,就是将图像中损坏的部分修复起来,是一种图像编辑技术,可以应用在移除物体、修复老照片、图像补全(eg,地震插值)等等。…

【初始scrapy框架上】——全栈开发——如桃花来

目录索引 scrapy框架的介绍:scrapy第三方包的下载:常见的换源网址: scrapy的图示原理:或者:或者: scrapy原理流程:详细介绍:流程描述:scrapy中的三个内置对象&#xff1a…

open cv 4.6.0 导入maven库以及依赖包 安装教程

windows: 1.官网下载windows安装包 2.安装完成后,复制opencv\build\java\x64\opencv_java451.dll 到 C:\Windows 下 centos: 参考https://www.cnblogs.com/huizhipeng/p/12732019.html 1.先安装cmake3 参考https://www.jianshu.com/p/20…

详谈大模型训练和推理优化技术

详谈大模型训练和推理优化技术 作者:王嘉宁,转载请注明出处:https://wjn1996.blog.csdn.net/article/details/130764843 ChatGPT于2022年12月初发布,震惊轰动了全世界,发布后的这段时间里,一系列国内外的…

莫言用 GPT 写颁奖辞,那如果他自己写会是什么效果呢?

在《收获》杂志 65 周年庆典上,莫言在为余华颁奖时表示,余华是自己的好朋友,但给他的颁奖词写了好几天也想不出来,后来找了 ChatGPT 帮忙写。最后,莫言让 ChatGPT 写了一篇莎士比亚风格 1000 多字的颁奖词,…

「硬核分享」Docker+jenkinsPipeline 运行实现 python 自动化

一、实现思路 在 Linux 服务器安装 docker 创建 jenkins 容器 jenkins 中创建 pipeline 项目 根据自动化项目依赖包构建 python 镜像(构建自动化 python 环境) 运行新的 python 容器,执行 jenkins 从仓库中拉下来的自动化项目 执行完成之后删除容器 二、环境准…

Defining Timing Constraints and Exceptions(UG945)

在本实验中,将学习为设计创建约束的两种方法。将使用Vivado2019.2 IDE中包含的Kintex-7 CPU网表示例设计。 步骤1:打开示例项目 1.打开Vivado IDE。 Vivado IDE的“Getting Started page”包含打开或创建项目以及查看文档的链接。 2.在“Getting Started…

泛型编程与模板简单介绍,函数模板及其原理与template,typename,模板参数T,函数模板隐式实例化等

泛型编程 比方说现在要去实现一个通用的交换函数,以我们现在的思路,肯定是通过函数重载去解决。但是这样子的话有几个缺点:重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己…

水溶性花菁染料Sulfo-CY7 NHS este标记活性脂Cyanine7-NHS

Sulfo-CY7 NHS ester是一种荧光标记试剂,化学结构为C38H42KN3O10S2,分子量约为803.98 。此外,它的分子中还含有一个N-羟基琥珀酰亚胺酯基团,这个基团可以与生物分子中的氨基结合,从而实现荧光标记。Sulfo-CY7 NHS este…

Moonbeam联合Multichain和AWS Startups正式推出Bear Necessities Hackathon黑客松

我们很高兴宣布Bear Necessities Hackathon正式启动。本次黑客松包含7个挑战,超过7万美金的奖池等你来领!我们欢迎所有的BUILDers参加,这是开发者们探索Moonbeam并构建跨链用例的机会! 本次黑客松由Moonbeam、Multichain和AWS St…

js原生实现pc端日历组件

业务场景 客户要求日期选择使用pc端的样式,前端在x5平台上,也就是需要用原始html、js、css等实现,笔者使用于 原生javascript封装的PC端日历插件,不依赖任何第三方插件,复制的代码文件较长,可跳到 总结 处…

使用whistle对安卓手机进行调试

注意:手机调试的时候需要与电脑连同一个wifi。 1、安装whistle npm install -g whistle2、运行 whistle w2 start3、打开电脑浏览器 输入 http://10.53.40.72:8899/ ,点击二维码,可以生成 rootCA.crt 证书,把它发到手机上&…