ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Scala之类与对象(单例、apply方法)

2022-01-20 19:57:59  阅读:157  来源: 互联网

标签:伴生 Stu 对象 Scala stu 单例 apply


目录

一、类

二、属性

三、单例对象(伴生对象)

四、apply方法

五、单例模式的实现

一、类

语法:

[修饰符] class 类名 {

类体

}

(1)Scala语法中默认就是public

(2)一个Scala源文件可以包含多个类

class stu {

}

二、属性

属性是类的一个组成部分

语法:

[修饰符] var|val 属性名称 [:类型] = 属性值

注:Bean属性(@BeanPropetry),可以自动生成规范的setXxx/getXxx方法

 var name: String = "ls" //定义属性

 var age: Int = _ // _表示给属性一个默认值
                 //val修饰的属性不能赋默认值,必须显示指定
//Bean属性(@BeanProperty)
@BeanProperty var sex: String = "男"

三、单例对象(伴生对象)

语法:

object stu{

        val name:String="zz"

}

(1)单例对象采用object关键字声明

(2)单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。

(3)单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。

//伴生对象采用object关键字声明
object stu {
    var name: String = "zz"
}

//伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
class stu {
    var age: Int = 18
}

object Test {
    def main(args: Array[String]): Unit = {
 //伴生对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。
        println(stu.name)
    }
}

四、apply方法

(1)通过伴生对象的apply方法,实现不使用new方法创建对象。

(2)如果想让主构造器变成私有的,可以在()之前加上private。

(3)apply方法可以重载。

(4)Scala中obj(arg)的语句实际是在调用该对象的apply方法,即obj.apply(arg)。用以统一面向对象编程和函数式编程的风格。

(5)当使用new关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构建对象时,调用的其实时伴生对象的apply方法。

object applydemo {
  def main(args: Array[String]): Unit = {
    val stu01 : Stu = Stu.apply()

    val stu02 : Stu = Stu.getStu()
    // apply方法在调用的时候 可以不写方法名称
    val stu03 : Stu = Stu()
    // 如果一个方法不写方法名称  一定是调用apply方法 举例:
    val ints: Array[Int] = Array(1, 2, 3, 4)
    // 类的apply方法需要使用创建好的类的对象去调用
    stu03()


  }

}
class Stu private(){
  // 在类中也可以有apply方法
  // 并且apply方法的功能也是完全可以自定义的
  def apply(): Unit = println("apply方法")
}

object Stu {
    def getStu() : Stu = new Stu

    def apply() : Stu = new Stu()
}

五、单例模式的实现

代码如下,在主方法中创建两个对象判断对象的地址值是否相同来判断是否为单例模式

  def main(args: Array[String]): Unit = {
    val stu03 : stu = stu()
    val stu04 : stu = stu()

    println(stu03.eq(stu04))
  }
class stu private(){

}
// 懒汉式
// 优点: 节约内存  一直等到对象需要使用的时候 才会创建对象  不会在最开始占用对象的内存
// 缺点: 不是线程安全的  如果多个线程在第一次使用对象的时候 同时进入if判断 会造成错误
// -> 可以通过双层判断添加线程锁来解决
//object stu{
//  private var stu01 : stu = null
//
//  def apply(): stu = {
//    if(stu01 != null){
//      stu01 = new stu
//    }
//    stu01
//  }
//}

// 饿汉式
// 优点: 简单好理解
// 缺点: 占用内存 -> 在类加载的时候  即jvm初始化的时候 就已经创建了对象
// ->  大数据资源比较充足 使用饿汉式不会造成影响
object stu{
  private var stu02 : stu = new stu

  def apply(): stu = stu02
}

标签:伴生,Stu,对象,Scala,stu,单例,apply
来源: https://blog.csdn.net/lslslslslss/article/details/122608299

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有