Scala之面向对象

news2024/10/6 6:42:00

目录

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.Inner
  object 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 chapter04

object Test07_Polymorphic {
  def main(args: Array[String]): Unit = {
       val  per:Person07=new Student07
       per.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这个抽象子类

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

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

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

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

相关文章

将项目部署到服务器上,并且使用JMeter测试项目性能

1、前提条件 首先呢,你要有一个有一个项目,并且打包成jar包。然后你要有一台服务器,你可以登录阿里云(国内社区)然后买按量付费的服务用一下,其实服务器就像虚拟机一样,linux命令执行。但是Cen…

操作系统的结构与功能流程

一、用户态和内核态 用户态可以理解为用户模式,内核态理解为内核模式 二、功能流程举例 假设你是一名顾客在一家餐厅用餐,餐厅有一个厨师负责烹饪食物,而你作为顾客只能在餐厅的就餐区域内进行点餐、享用餐点。这里就可以将就餐区域看作用户…

【基于视觉的分割】语义分割初探索:一些经典和先进的算法

写在前面: 有很长时间没有更新学习了,因为在忙着做试验写毕业论文。但是,学习不能停止,从今天开始,换成语义分割方向进行深入学习,有兴趣的小伙伴可以和我一起讨论,也欢迎才进入这个方向学习的…

【Grafana】連接mssql並圖表顯示

【Grafana】連接mssql並圖表顯示 1. 函數2. Demo2.1 Query2.2 Query 3. Awakening1.1 Big Data -- Postgres 1. 函數 Macro exampleReplaced by$__time(dateColumn)An expression to rename the column to time. For example, dateColumn as time$__timeEpoch(dateColumn)An e…

改变思想,拥抱毒瘤,让公司走的更远

牛B的人物,早已经厌倦了中英文混杂,他们更进一步,使用中英文缩写,对普通人进行降维打击。更厉害的,造就新的名词,并科普出去。 有几项技术,我从心底里鄙视和厌恶,但每次在技术方案中…

Cursor IDE一个GPT4人工智能自动程序编辑器

让我们来了解一下Cursor IDE是什么。Cursor IDE是一个新型的编程工具,可以通过它生成、编辑以及与人工智能进行交互分析代码。官方网站上的三个单词“Build Software. Fast.”(快速构建软件)以及“Write, edit, and chat about your code wit…

Spark 实现重新分区 partitionBy、coalesce、repartition(附代码演示)

文章目录 1、partitionBy 源码中的定义(部分) 调用方式 2、coalesce 源码中的定义 调用方式 3、repartition 源码中的定义 调用方式 repartition和coalesce的区别 代码演示 (跳转代码) 实现重新分区,本质上…

如何轻松进行接口测试?试试这款神器Apifox,亲测好用!

Apifox学习教程地址:https://www.bilibili.com/video/BV1mb411o7Go/? 目录:导读 ​引言 一、接口调试 二、Mock功能 三、自动化测试 引言 如果你曾经为手工编写和维护测试用例而感到疲惫,那么你需要试试这款神器——Apifox! …

【云原生】Kubernetes(k8s)之Pod概念和使用

k8s之Pod概念和使用 一、Pod简介1.1、Pod的阶段(状态)1.2、容器状态 二、Pod的定义2.1、restartPolicy2.2、imagePullPolicy2.3、command2.4、args2.5、resources 三、Pod的使用3.1、创建并访问Pod3.2、多个应用容器3.3、Init容器3.3.1、Init容器与普通容…

劝人写码,千刀万剐——“前端已死”难道要成真了?

移动互联网的兴起,传统行业的数字化转型,大前端技术的普及,随之而来的就是Vue为代表的前端框架和工具的兴起,前端开发的门槛降低。但发展,稳定,衰落是亘古不变的事物发展规律。 一些有趣的迹象 最近逛社区…

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题203.707.206翻转链表) 2023.4.21

目录 前言算法题(LeetCode刷题203移除链表元素)—(保姆级别讲解)算法题(LeetCode刷题707.设计链表)—(保姆级别讲解)代码参考: 算法题(LeetCode刷题206.反转链…

DC:5靶机通关详解

信息收集 漏洞发现 扫个目录 发现存在footer.php 查看,发现好像没什么用 参考他人wp得知thankyou.php会包含footer.php 可以通过传参来包含别的文件 但是我们不知道参数,这里用fuzz来跑参数 这里用wfuzz的时候报错了 解决方法如下 卸载 sudo apt --purge remove python3-pycu…

最强省钱攻略——IC设计公司老板必读

2023年,国内半导体产业发展面临着很大的不确定性,这应该是共识。 IC芯片设计公司,重度研发创新导向。 站在企业角度,怎么在不确定性下,组织人、财、物,面向未来,应对市场竞争? 算…

vCener 配置 vSan 网络

文章目录 1. 准备2. 创建vsan网络2.1 创建 vSphere Distributed Switch (vds)2.2 添加管理主机2.3 添加 networking 3. 删除3.1 删除 vmkernel adapter3.2 删除 hosts3.3 删除 DSwitch 1. 准备 三台物理机搭建 exsi一台部署 vcenter 管理三台 exsi每台物…

扬帆优配|普通股和优先股的区别?普通股和优先股哪个好?

各位投资者或许了解过股票是分为普通股和优先股的,但对其并不十分了解。那么普通股和优先股有什么区别?普通股和优先股哪个好?扬帆优配也为我们准备了相关内容,以供参考。 普通股和优先股的区别? 普通股和优先股的主要…

2023-04-14 算法面试中常见的查找表问题

2023-04-14 算法面试中常见的查找表问题 1 Set的使用 LeetCode349号问题:两个数组的交集 给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2] 示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出:…

直播预告 | 时序数据处理的云端利器:TDengine Cloud 详解与演示

当下,我们正处在一个万物互联的时代,大数据、云原生、AI、5G 等数字技术极大地方便了人们的生活,但智能物联网产生的海量数据却成为众多企业在数据处理上的巨大痛点。从本质来看,这些数据大多是产生自各种设备和传感器的时序数据&…

康耐视Designer,通过VC5与西门子S7-1200 PLCProfinet通讯详细

测试使用软件版本 Designer Version: 2.7 GSD: GSDML-V2.3-Cognex-VC5-20140828STEP 7 Professional V14Network Configurator Version: 3.56测试使用硬件 Cognex Vision Controller VC5CIC-5000Siemens PLC: S7-1200 CPU 1214C DC/DC/RLY1.PLC端设置 1.新建一个项目,添加对应…

没看错!一行python代码就可以帮您获取图片中的文字信息

最近工作中有需求需要用python对图片中的文字进行识别,调研了一下,选择了tesseract, 目前在github上有50.5k个star!python可以调用,安装也十分方便,pip install pytesseract 即可。如果没有Pillow 包&…

ERTEC200P-2 PROFINET设备完全开发手册(7-2)

7.2 添加自定义参数 编辑GSDML文件,对于64 bytes DI 进行如下修改,由于一般的IO模块不需要支持PROFIEnergy,去掉PROFIEnergy支持;修改模块ID(ModuleIdentNumber "0x00000080");子模块ID不变&am…