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

举报
Lansonli 发表于 2021/09/29 00:58:46 2021/09/29
【摘要】 目录 单例对象 定义object - 掌握 伴生对象 - 掌握 apply方法 - 掌握 main方法 单例对象 Scala中没有static关键字,但是它支持静态 如果要定义静态的东西,统统定义到object中 语法: object xxx{   // 内容 } 反向理解,clas...

目录

单例对象

定义object - 掌握

伴生对象 - 掌握

apply方法 - 掌握

main方法


单例对象

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

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

语法:

object xxx{
  // 内容
}

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

 

定义object - 掌握

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

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


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

 

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

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

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

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

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

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

 

伴生对象 - 掌握

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


  
  1. public class CustomerService {
  2.     private static Logger logger = Logger.getLogger("customerService");
  3.     public void save(String customer) {
  4.         logger.info("添加一个用户");
  5.         // 保存客户
  6.     }
  7.     public static void main(String[] args) {
  8.         new CustomerService().save("客户");
  9.     }
  10. }

 

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

 

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

 

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

 


  
  1. class CustomerService {
  2.   private val serviceName = "CustomerService"
  3.   def save(customer:String):Unit = {
  4.     // 在类中可以获取伴生对象的私有成员变量
  5.     CustomerService.logger.info("添加一个用户")
  6.     // 新增客户
  7.   }
  8. }
  9. // 定义一个伴生对象
  10. object CustomerService {
  11.   // 定义一个日志器
  12.   private val logger = Logger.getLogger("CustomerService")
  13.   def main(args: Array[String]): Unit = {
  14.     val customerService = new CustomerService()
  15.     customerService.save("张三")
  16.     // 在伴生对象中也可以访问伴生类的私有方法
  17.     println(customerService.serviceName)
  18.   }
  19. }

 

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

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

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

 

apply方法 - 掌握

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

 


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

 

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

 

查看scala源代码:

 

 

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

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

 

示例1:


  
  1. class Person(var name:String, var age:Int) {
  2.   override def toString = s"Person($name, $age)"
  3. }
  4. object Person {
  5.   // 实现apply方法
  6.   // 返回的是伴生类的对象
  7.   def apply(name:String, age:Int): Person = new Person(name, age)
  8.   // apply方法支持重载
  9.   def apply(name:String):Person = new Person(name, 20)
  10.   def apply(age:Int):Person = new Person("某某某", age)
  11.   def apply():Person = new Person("某某某"20)
  12. }
  13. object Main2 {
  14.   def main(args: Array[String]): Unit = {
  15.     val p1 = Person("张三"20)
  16.     val p2 = Person("李四")
  17.     val p3 = Person(100)
  18.     val p4 = Person()
  19.     println(p1)
  20.     println(p2)
  21.     println(p3)
  22.     println(p4)
  23.   }
  24. }

 

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

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

 

main方法

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

 

示例1:


  
  1. object Main5 {
  2.   def main(args:Array[String]) = {
  3.     println("hello, scala")
  4.   }
  5. }

 

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

示例2:


  
  1. object Main5 extends App {
  2.   println("hello, scala")
  3. }

 

文章来源: lansonli.blog.csdn.net,作者:Lansonli,版权归原作者所有,如需转载,请联系作者。

原文链接:lansonli.blog.csdn.net/article/details/116610602

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。