16_Scala面向对象编程_函数

文章目录

  • 1.声明Scala函数
  • 2.访问伴生对象
  • 3.空对象直接用的方法
  • 4.构造对象
    • --通过object获取单例对象
    • --直接new
    • --scala独有apply()方式
    • --scala有参构造
    • --scala构造方法两大类
      • 使用辅构造如下
      • 上述代码主构造为
      • 辅助构造方法甚至可以多个
      • 多个辅助构造形参内容不能重
      • 不使用辅助构造和使用辅助构造区别
      • 主构造函数属性使用this访问,辅助构造函数属性使用属性名访问
    • 主构造私有化构建对象
  • 小结
  • Appendix

1.声明Scala函数

抛出问题:创建两个类,互为伴生对象,当我new时候,然后调用,我调用的是谁?

object Solution {def main(args: Array[String]): Unit = {var user=  new Useruser.test()   //class test}class User{def test(): Unit = {println("class test")}}object User{def test(): Unit = {println("object test")}}
}

在这里插入图片描述

2.访问伴生对象

伴生对象章节已经讲过;伴生对象中放的一般都是静态方法或属性或工具类,访问的话直接 类名.方法即可

User.test()   //静态方式访问,直接类.方法

且可以继续简化

User test	  //也就是伴生对象的访问方式

3.空对象直接用的方法

object类中的方法都可以使用;

在这里插入图片描述

scala提供的一些方法都可以使用

在这里插入图片描述

重点

//    判断是否是父类实例println(user.isInstanceOf[User])//      将普通对象 转化 目标对象val value = user.asInstanceOf[Object]println(value)    //_15Scala方法.Solution$User@19bb089b     //至此不能使用user的方法了

4.构造对象

–通过object获取单例对象

//    1.1直接使用object构建对象println(Solution01)   

//_15Scala方法.Solution01$@19bb089b 打印的就是一个对象地址,直接可以拿来使用

在这里插入图片描述

反编译以后得到的是静态代码块直接实例化对象且仅有一份,私有化Instance方法,创建一个公共的本类型的私有化对象;通过类名访问;

–直接new

//    1.2直接new
val user = new User

–scala独有apply()方式

//    1.3Scala独有方式      object伴生对象,且对象中存在apply方法即可使用      繁琐
val user1 = User.apply() //如果

在这里插入图片描述

目前我的编译器已经无法动态识别apply()
不建议使用

在这里插入图片描述

在这里插入图片描述

最终结果:

在这里插入图片描述

–scala有参构造

概念:

scala默认是无参构造

如果给类传递任何参数,scala会默认抹杀掉任何构造方法仅保留一份构造方法,与类的声明一致;

//    --有参构造val zhangsan = new EMP("sad");
//    val zhangsan1 = new EMP   //构造方式不对class EMP(name:String){}

–scala构造方法两大类

  • 主构造 -> 完成类的初始化

    • 辅助构造有重载概念,主构造没有
  • 辅构造 -> 完成类的辅助功能,属性赋值

    • 辅构造方法必须直接或见解调用主构造方法
    • 使用this声明
    • 辅助构造有重载概念,主构造没有

使用辅构造如下

class FuGenerate(){//定义一下空构造的内容println("空构造方法体")def this(name:String){this()  //必须直接或间接调用主构造方法    FuGenerate()    调用一次执行空构造println("辅助构造完成")}
}

上述代码主构造为

FuGenerate()

scala中函数就是方法

辅助构造方法甚至可以多个

在这里插入图片描述

上述第二个辅助构造方法使间接调用主构造器 ,也就是先调用name:String		然后通过第一个辅助构造方法调用this()	主构造方法

多个辅助构造形参内容不能重

在这里插入图片描述

不使用辅助构造和使用辅助构造区别

在这里插入图片描述

在这里插入图片描述

主构造函数属性使用this访问,辅助构造函数属性使用属性名访问

在这里插入图片描述

主构造函数的形参就是 类的属性;直接拿this关键字访问即可;

主构造私有化构建对象

主构造私有化,形参前假如private

在这里插入图片描述

一旦私有化,子类无法进行访问,原因是无法显示的调用父类构造器

私有化后如何创建对象

–使用辅助构造器

在这里插入图片描述

使用辅助构造器,传入name,再将name赋值给主构造

–使用伴生对象(伴生对象可以访问类中私有内容)

在这里插入图片描述

小结

1.类和伴生对象访问方式	类访问实例化对象user,通过实例化对象访问伴生对象访问直接类名访问2.scala函数在编译的时候都会发生改变与定义有所不同,例如eq 编译阶段都会编程equals,但是方法m编译阶段不会发生改变例如equals3.scala的构建对象的方式--直接new       scala中独有方式  val user = User.apply()--反射构建--clone--反序列化      磁盘中对象写入到内存构建对象--scala使用object构建单例对象4.注意scala中类名和方法名相同但是并不代表其是构造方法;
5.scala是强数据类型,完全面向函数式编程语言   ==>   声明类 == 声明函数6.如果给类传递任何参数,scala会默认抹杀掉任何构造方法仅保留一份构造方法,与类的声明一致;7.使用辅助构造使代码更加灵活,形式上和Java一致
--必须调用主构造,会执行方法体(类中代码语句)所有
--this声明
--可以多个

在这里插入图片描述

类{}包的是函数体,甚至可以直接println,和Java类中五大成分不同。函数体new几次执行几次;

Appendix

对象创建在实例化之后会发生如下情况

在这里插入图片描述

在这里插入图片描述

为了避免此情况,请尽可能将类放的远一点,以至于先定义 变量,后实例化对象赋值;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——链表专题1

文章目录 一、移除链表元素二、反转链表三、合并两个有序链表四、链表的中间节点五、环形链表的约瑟夫问题六、分割链表 一、移除链表元素 原题链接:移除链表元素 一个解法是遍历原链表,将与val相等的结点抛弃,链接后一个结点 另一个解法是…

2010-2022年上市公司彭博ESG披露评分、分项得分数据

2010-2022年上市公司彭博ESG披露评分、分项得分数据 1、时间:2010-2022年 2、来源:Bloomberg ESG 指数 3、指标:股票代码、股票简称、年份、ESG披露评分、环境披露评分、社会信息披露评分、治理披露评分 4、范围:上市公司 5、…

详解xml-java语言

1.XML在线学习手册 XML 教程 2.XML可以做什么 1.给两个程序之间进行数据通信。现在用的最多的是JSON。 2.给服务器做配置文件。 3.存储复杂的数据关系。 4.还可以充当小型的数据库。 3.书写格式 <?xml version"1.0" encoding"UTF-8" ?> <…

Ansible 自动化运维工具 - 了解和模块应用

目录 一. Ansible 的相关知识 1.1 Ansible 工具的简介 1.2 Ansible的四大组件 1.3 运维自动化工具 1.4 Ansible 和其它自动化运维工具对比 1.5 Ansible 的优缺点 二. Ansible 环境安装部署 2.1 管理端安装 ansible 2.2 配置主机清单 三. ansible 命令行模块 3.1 comm…

JavaScript中Math函数与舍入

立方根 console.log(Math.sqrt(25)); //数学方式25平方根 console.log(25 ** (1 / 2)); //25的0.5次方 console.log(8 ** (1 / 3)); //8的1/3次方计算最大最小值 console.log(Math.max(1, 5, 88, 22, 132)); //返回最大值 console.log(Math.max(1, 5, 88, 22, 132)); //…

[Flutter]创建一个私有包并使用

在Flutter中创建一个自己的私有组件&#xff08;通常称为包或库&#xff09;&#xff0c;并通过Dart的包管理工具pub进行使用。 一、创建一个新的Flutter包 1.使用命令行创建 使用Flutter命令行工具来创建一个新的包&#xff1a; $ flutter create --templatepackage my_pri…

为什么很多人不推荐你用JWT?

为什么很多人不推荐你用JWT? 如果你经常看一些网上的带你做项目的教程&#xff0c;你就会发现 有很多的项目都用到了JWT。那么他到底安全吗&#xff1f;为什么那么多人不推荐你去使用。这个文章将会从全方面的带你了解JWT 以及他的优缺点。 什么是JWT? 这个是他的官网JSON…

React + 项目(从基础到实战) -- 第11期

目标 问卷编辑器的开发 设计UI - 拆分布局 水平垂直居中 画布 y方向滚动 自定义问卷组件 后端 返回组件数据 //获取单个问卷信息{url: /api/question/:id,method: get,response: () > {return {errno: 0,data: {id: Random.id(),title: Random.ctitle(),componentList:[//…

测试用例执行的结果pass_fail_block_skip

pass fail block skip 测试用例的执行结果通常包括以下几个方面&#xff1a; 1. **测试结果状态**&#xff1a;通常分为“通过”、“失败”、“阻塞”和“跳过”等状态。 - **通过**&#xff1a;测试用例执行完毕&#xff0c;预期结果与实际结果一致。 - **失败**&am…

【AI】深度学习框架的期望与现实 机器学习编译尚未兑现其早期的一些承诺……

深度学习框架的期望与现实 机器学习编译尚未兑现其早期的一些承诺…… 来自&#xff1a;Axelera AI 资深软件工程师 Matthew Barrett 原帖是linkedin帖子&#xff1a; https://linkedin.com/posts/matthew-barrett-a49929177_i-think-its-fair-to-say-that-ml-compilation-ac…

Flask应用的部署和使用,以照片分割为例。

任务是本地上传一张照片&#xff0c;在服务器端处理后&#xff0c;下载到本地。 服务器端已经封装好了相关的程序通过以下语句调用 from amg_test import main from test import test main() test() 首先要在虚拟环境中安装flask pip install Flask 文件组织架构 your_pro…

Redis-单机安装

试图从官网注册不了我也不知道什么情况。 网盘自取吧&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1KERBQaH9gCT10AGt9z0_jg?pwdyjen 安装比较简单&#xff0c;照着敲就完了每一步都试过了&#xff0c;先单机安装&#xff0c;后面搭建集群。 1.将安装包放到/usr/…