目录

单例对象

定义object - 掌握

伴生对象 - 掌握

apply方法 - 掌握

main方法


单例对象

Scala中没有static关键字,但是它支持静态

如果要定义静态的东西,统统定义到object中

语法:

object xxx{
  // 内容
}

反向理解,class中的东西, 全部是 非静态的

定义object - 掌握

定义单例对象和定义类很像,就是把class换成object

示例:定义一个工具类,用来格式化日期时间

object DateUtils {// 在object中定义的成员变量,相当于Java中定义一个静态变量// 定义一个SimpleDateFormat日期时间格式化对象val simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm")// 构造代码println("构造代码")// 相当于Java中定义一个静态方法def format(date:Date) = simpleDateFormat.format(date)// main是一个静态方法,所以必须要写在object中def main(args: Array[String]): Unit = {println { DateUtils.format(new Date()) };}
}

使用object 单例对象名定义一个单例对象,可以用object作为工具类或者存放常量

在单例对象中定义的变量,类似于Java中的static成员变量

在单例对象中定义的方法,类似于Java中的static方法

object单例对象的构造代码可以直接写在花括号中

调用单例对象的方法,直接使用单例对象名.方法名,访问单例对象的成员变量也是使用单例对象名.变量名

单例对象只能有一个无参的主构造器,不能添加其他参数

伴生对象 - 掌握

在Java中,经常会有一些类,同时有实例成员又有静态成员。如下:

public class CustomerService {private static Logger logger = Logger.getLogger("customerService");public void save(String customer) {logger.info("添加一个用户");// 保存客户}public static void main(String[] args) {new CustomerService().save("客户");}
}

在scala中,可以使用伴生对象来实现。

一个class和object具有同样的名字。这个object称为伴生对象,这个class称为伴生类

实例1:使用scala重写上面的案例。

class CustomerService {private val serviceName = "CustomerService"def save(customer:String):Unit = {// 在类中可以获取伴生对象的私有成员变量CustomerService.logger.info("添加一个用户")// 新增客户}
}// 定义一个伴生对象
object CustomerService {// 定义一个日志器private val logger = Logger.getLogger("CustomerService")def main(args: Array[String]): Unit = {val customerService = new CustomerService()customerService.save("张三")// 在伴生对象中也可以访问伴生类的私有方法println(customerService.serviceName)}
}

伴生类和伴生对象的名字必须是一样的

伴生类和伴生对象需要在一个scala源文件中

伴生类和伴生对象可以互相访问private的属性

apply方法 - 掌握

我们之前使用过这种方式来创建一个Array对象。

// 创建一个Array对象
val a = Array(1,2,3,4)

这种写法非常简便,不需要再写一个new,然后敲一个空格,再写类名。如何直接使用类名来创建对象呢?

查看scala源代码:

答案就是:实现伴生对象的apply方法

伴生对象的apply方法用来快速地创建一个伴生类的对象。

示例1:

class Person(var name:String, var age:Int) {override def toString = s"Person($name, $age)"
}object Person {// 实现apply方法// 返回的是伴生类的对象def apply(name:String, age:Int): Person = new Person(name, age)// apply方法支持重载def apply(name:String):Person = new Person(name, 20)def apply(age:Int):Person = new Person("某某某", age)def apply():Person = new Person("某某某", 20)
}object Main2 {def main(args: Array[String]): Unit = {val p1 = Person("张三", 20)val p2 = Person("李四")val p3 = Person(100)val p4 = Person()println(p1)println(p2)println(p3)println(p4)}
}

当遇到类名(参数1, 参数2...)会自动调用apply方法,在apply方法中来创建对象

定义apply时,如果参数列表是空,也不能省略括号(),否则引用的是伴生对象

main方法

scala和Java一样,如果要运行一个程序,必须有一个main方法。而在Java中main方法是静态的,而在scala中没有静态方法。在scala中,这个main方法必须放在一个object中。

示例1:

object Main5 {def main(args:Array[String]) = {println("hello, scala")}
}

也可以继承自App Trait(特质),然后将需要编写在main方法中的代码,写在object的构造方法体内。

示例2:

object Main5 extends App {println("hello, scala")
}

2021年大数据常用语言Scala(二十九):scala面向对象 单例对象相关推荐

  1. 2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类

    目录 scala面向对象 MAVEN依赖 类 - 掌握 创建类和对象 - 掌握 getter/setter - 了解 类的构造器 - 掌握 scala面向对象 MAVEN依赖 <?xml ver ...

  2. 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)

    目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class 特 ...

  3. 2021年大数据常用语言Scala(二):Scala开发环境安装

    目录 开发环境安装 安装JDK 安装scala SDK 步骤 具体操作 安装IDEA scala插件 步骤 开发环境安装 学习如何编写scala代码之前,需要先安装scala编译器以及开发工具 sca ...

  4. 2021年大数据常用语言Scala(三十二):scala高级用法 样例类

    目录 样例类 定义样例类 样例类方法 样例对象 样例类 样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于Java POJO类),而且它会自动生成apply方法,允许我们快速地创建样例 ...

  5. 2021年大数据常用语言Scala(四):基础语法学习 声明变量

    目录 声明变量 语法格式 在解释器中定义一个变量 val和var变量 使用类型推断来定义变量 惰性赋值 声明变量 我们将来每一天编写scala程序都会定义变量.那scala语言如何定义变量呢? 语法格 ...

  6. 2021年大数据常用语言Scala(一):Scala简介

    目录 一.Scala简介 为什么使用scala Scala对比Java 案例 一.Scala简介 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数编程 多范式:就是包含多种编程思 ...

  7. 2021年大数据常用语言Scala(十八):基础语法学习 Map对象

    目录 Map对象 不可变Map 可变Map Map基本操作 Map对象 Map可以称之为映射.它是由键值对组成的集合.在scala中,Map也分为不可变Map和可变Map. 不可变Map 定义 语法 ...

  8. 2021年大数据常用语言Scala(十七):基础语法学习 Set

    目录 Set 不可变集 可变集 Set Set(集)是代表没有重复元素的集合.Set具备以下性质: 元素不重复 不保证插入顺序 和List正好相反, List: 元素可以重复 保证插入顺序 scala ...

  9. 2021年大数据常用语言Scala(八):基础语法学习 循环

    目录 循环 for表达式 while循环 循环 在scala中,可以使用for和while,但一般推荐使用for表达式,因为for表达式语法更简洁 for表达式 语法 for(i <- 表达式/ ...

最新文章

  1. opencv可以在linux上运行,linux上 安装并 运行opencv
  2. 解读刘强东关于人才的两个标准和5个层次
  3. tensorfllow MNIST机器学习入门
  4. java数组扩容arraylist,ArrayList--扩容机制
  5. Java基础 -- 复用类(组合和继承)
  6. android-侧滑菜单
  7. 李航书上隐马尔科夫模型案例的实验结果复现
  8. 世界名企选人的“通用标准”
  9. 就业形势如此的严峻,你为何不努力?
  10. Java 7:尝试资源
  11. 解决shutil.copyfile常见错误:PermissionError: [Errno 13] Permission denied
  12. [转]caffe-ssd中 net.forward()返回值
  13. netfilter 和 iptables
  14. python脚本转换为EXE文件
  15. Python学习笔记(15) 网络爬虫使用proxy实现自动换IP防封锁
  16. 陈世涛:鼠标滚轮引起的画面上下跳动问题处理 跳行怎么办?
  17. android根文件系统目录结构
  18. 大数据、Java、Python、区块链、人工智能前景简单对比
  19. 资格考试_第四章_证券投资基金的监督
  20. 圆上三点求圆心和半径

热门文章

  1. 2022-2028年中国自主可控行业深度调研及投资前景预测报告(全卷)
  2. 数据结构(05)— 线性单链表实战
  3. 浅显易懂 Makefile 入门 (07)— 其它函数(foreach 、if、call、origin )
  4. vs2012下编码引起的一个神坑
  5. 【Spring】spring基于注解的声明式事务控制
  6. 梯度下降理解和梯度下降计算检查斯坦福
  7. super(Student,self).__init__()初始化的是什么东西?
  8. GitHub无法显示图片问题解决
  9. 单精度和半精度混合训练
  10. 开放神经网络交换(ONNX)工具