scala中伴生类和伴生对象理解

scala中class创建的是伴生类,object创建的是伴生对象

伴生类中可以声明无参构造器和有参构造器,辅助构造器,属性,方法

伴生对象属于单例对象,也可以声明属性,方法,但是不可以声明构造器

scala创建对象可以通过new的方式也可以通过伴生对象的方式进行创建。但是如果想用伴生对象的方式进行创建就必须定义apply方法,在apply方法中通过new的方式创建对象。

val dog = Dog 默认是dog指向单列对象

val dog = Dog(“aa”)带有参数的就默认会调用单列对象的apply方法,如果单列对象中没有定义apply方法就会报错。apply方法属于伴生对象和伴生类的一个桥梁

参考Array的apply方法源码:

/** Creates an array of `Int`objects */

// Subject to a compiler optimization in Cleanup, see above.

def apply(x: Int, xs: Int*): Array[Int] = {

val array =new Array[Int](xs.length +1)

array(0) = x

var i =1

  for (x <- xs.iterator) { array(i) = x; i +=1 }

array

}

伴生对象和伴生类的简单介绍之代码:

// 伴生类

class Dog {

  // val修饰:能访问,不能修改,相当于java中定义的一个成员变量,有getter方法,没有setter方法

  val id:Int = 9527

  //var修饰: 能访问,也能修改,相当于有getter,setter方法

  var age:Int = 3

  //private val修饰: 只能自己和伴生对象访问

  private val nickname:String = "旺财"

  //  private[this] val修饰:相当于java中的private,只能自己访问

  private[this] val name:String = "小黄"

  private def printSalary(): Unit ={

    /**

      * 伴生对象中的属性相当于java中的静态变量,方法相当于静态方法: static double salary;

      */

    println(Dog.salary)

    val dog1 = new Dog();

    println(Dog.myAge())

    println(Dog.name)

  }

}

/**

  * 伴生对象

  *    有object Dog也有class Dog

  * 单例类

  *    有object Dog没有class Dog

  *  互为伴生关系的类和对象可以互相访问对方的使用private修饰的变量和方法

  */

// 在Dog类中,声明了一个 private val nickname:String = "旺财" 这样的变量

object Dog{

  var name:String = "huangbo"

  private val salary:Double = 1000000

  // 这个方法一定被static修饰了。

  def myAge():Int = {

    return 18

  }

  def main(args: Array[String]): Unit = {

    val dog:Dog = new Dog()

    println(dog.id)

//  会报错  dog.id = 777

    println(dog.age)

    dog.age = 4

    println(dog.age)

    println(dog.nickname)

// 会报错   println(dog.name)

    println(dog.printSalary())

  }

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容