每天学一点Scala之 伴生类和伴生对象

1、  object 相当于class的单个实例,因此,在object里声明的变量都是静态变量,静态方法

2、  在object里声明的变量,都是全局变量,也就是类的公共属性,或者类似于java中父类的属性

3、  object里的构造器,也就是object 内部不在method中的代码,都属于构造器的内容

4、 同样,object的主构造器只会在第一次调用时执行,多次调用,只会执行一次。

  • object使用场景

1、  单例模式

2、  工具类

  • 伴生对象与 伴生类?

如果有一个class,还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类

  • 要求:

伴生类和伴生对象必须存放在一个.scala文件之中

特性?

//伴生对象、伴生类里的私有属性 跟 普通的私有属性 相比?
//伴生对象,伴生类里的私有属性的 使用范围,扩大了。
//伴生对象 与 伴生类可以互相访问彼此的私有属性,而普通私有属性仅仅只能在自己类里使用的

package com.xej.learning.objectLearning

/**
  * objectLearning 测试
  */
private[objectLearning] class Kafka(val name: String){
  
   //目的:测试多次调用object时,其主构造方法调用几次
   def sayHello(): Unit ={
      objectTest.name
      objectTest.name
      objectTest.name
      println("--------------------")
   }
}
object objectTest {
   val name = "spark"
  
   println("----object----主构造器--------")
  
   def main(args: Array[String]): Unit = {
      new Kafka("spark").sayHello()
   }
}

执行结果如下:

----object----主构造器--------
--------------------

测试用例二:

package com.xej.learning.objectLearning

/**
  * 主要测试伴生对象,伴生类里的私有属性的访问范围
  */
private[objectLearning] class Student(val name: String, val age: Int, address: String="xizhimen"){
  
   private val sex = "male"
   val weight = 80
  
   def sayHello(): Unit ={
      Student.address = address
      //访问伴生对象里的普通属性 以及 私有属性
      println("name:\t" + name + " ----> " + " age:\t" + age +
         "\naddress:\t" + Student.address + " ----> school:\t" + Student.school)
   }
}

object Student{
   //伴生对象里的私有属性 跟 普通的私有属性 相比?
   //伴生对象,伴生类里的私有属性的 使用范围,扩大了。
   //伴生对象 与 伴生类可以互相访问彼此的私有属性,而普通私有属性仅仅只能在自己类里使用的
   private val school = "bjtu" //只能在伴生类里,调用,其他地方不能调用

   var address = "beijing" //除了伴生类里,其他地方也可以调用,跟普通属性一样
   
   //访问伴生类里的属性
   val stu = new Student("lisi",22, "haidian")
   
   println("----访问----伴生类里的---属性-----name:\t" + stu.name)
   println("----访问----伴生类里的---私有属性-----sex:\t" + stu.sex)
   println("----访问----伴生类里的---属性-----weight:\t" + stu.weight)
}

object objectTest2 {
   def main(args: Array[String]): Unit = {
      //调用伴生对象里的public属性
      println("----address:\t" + Student.address)

      //school是伴生对象的私有属性,这里不能访问的
      //println("----school:\t" + Student.school)
      new Student("zhansan", 19).sayHello()
      new Student("xiaoming", 22,"haidian").sayHello()
   }
}

测试结果:

----访问----伴生类里的---属性-----name:	lisi
----访问----伴生类里的---私有属性-----sex:	male
----访问----伴生类里的---属性-----weight:	80
----address:	beijing
name:	zhansan ---->  age:	19
address:	xizhimen ----> school:	bjtu
name:	xiaoming ---->  age:	22
address:	haidian ----> school:	bjtu

Process finished with exit code 0

总之:

看到伴生对象,伴生类,要立马想到私有属性

伴生对象的使用场景,也就是说,伴生对象是干什么用的,这样的话,对于理解marathon源码,spark源码是有帮助的,不至于一头雾水。

时间: 2024-10-08 10:04:05

每天学一点Scala之 伴生类和伴生对象的相关文章

伴生类和伴生对象(apply方法的实践)

具有相同名字的object和class,分别为伴生对象和伴生类 1 class ApplyTest { //伴生类 2 3 } 4 5 object ApplyTest { //伴生对象 6 7 } 补充代码: object ApplyApp { def main(args: Array[String]): Unit = { var c = ApplyTest() // ==>object.apply() c() //==>class.apply() } } /** * 伴生类和伴生对象:具有

每天学一点Scala之apply方法

apply方法一般什么地方出现 此方法一般在伴生对象中实现的 目的: 改变了创建伴生类实例的方式,不再通过new的方式,而是直接使用类名() 的方式,scala底层会隐式的调用apply方法 package com.xej.learning.apply /**   * apply方法: 就是创建对象时,不再使用new的形式,而是直接使用了类名()的形式   */ private[apply] class Storm object Storm{    //创建伴生类的对象时,会隐式的调用这个的  

每天学一点Scala之内部类

1.  scala 里同样可以定义内部类 2.  每个外部类的对象的内部类,都是不同的类,因此,存数组时,要注意 3.  内部类可以访问外部类的私有属性,反之不行 package com.xej.learning.class_learning /**   * Created by erjun on 2017/8/28.   * 内部类测试   */ private[class_learning] class Kafka{    //定义一个内部类    class InnerKafka(val 

每天学一点Scala之implict 隐式参数

什么是隐式参数? 在函数或者方法中,定义一个用implicit关键字修饰的参数:此参数就是隐式参数了.Scala会自动尝试在作用域内查询用implicit修饰的对象,并自动注入参数 Scala查找隐式参数的范围? 一种是当前作用域内可见的var或val定义的隐式变量 一种是隐式参数类型的伴生对象的隐式值 第二个例子

每天学一点Scala之class 构造器

A.scala中类的构造器分为: 主构造器 从构造器 B.  主构造器 参数列表,就写在类名后面: 主构造器内容:类里,除了字段定义和方法定义外的内容,就是主构造器的内容了. C.  从构造器 类里,以def this开头的,都是从构造器, 从构造器的第一行,必须调用主构造器,或者,调用其他从构造器:其实,就是限制,从构造器的第一行,必须是主构造器,主构造器是类的唯一入口点.

每天学一点Scala之Scala与Java的区别?

A.Scala是编译型语言,可以随意调用Java代码: B.  Scala函数式编程语言,在scala世界里,函数才是一等公民: 函数可以作为参数进行传递,可以赋值给变量,可以作为返回值进行返回 scala中,具有嵌套函数.匿名函数.高阶函数.偏函数 scala支持闭包

每天学一点Scala之 Currying函数

1.Curring函数 定义? 将原来接收两个参数的一个函数,转换为两个函数,第一个函数接收原先的第一个参数,然后返回接收原先第二个参数的第二个函数. 在函数调用的过程中,就变为了两个函数连续调用的形式 在marathon源码以及Spark的源码中,也有体现,所以对()()这种形式的Curring函数,要理解. 2.例子: object CurryingTest {    def main(args: Array[String]): Unit = {       println("---->

每天学一点Scala之Try

参考文章:http://www.jianshu.com/p/0de79845eaa4 Try[A] 同样是一种容器.Option[A] 也是一种容器 Try[A] 表示一种计算, 如果计算成功,返回是A的值 如果出错的话,抛出异常Throwable Try 存在两个子类型: 1.  Success[A],表示计算成功 2.  Failure[A],表示计算失败,会抛出异常 例子如下: Try这个关键字,在marathon源码中,目前还没发现

每天学一点Scala之 高阶函数 flatten

flatten 就是将多个集合展开,组合成新的一个集合. 下面是marathon源码用到flatten的场景