一、对象
1.1、伴生对象
相同的名字,在同一个源文件中。 这个就是伴生机制,所谓伴生,就是在语言层面上,把static 成员和非static成员用不同的表达方式,class和object,但双方具有相同的package和name,但是最终编译器会把他们编译到一起,这是纯粹从语法层面上的约定。通过javap可以反编译看到。
package com.chb.test class Test1 { var field = "field" def doSomething = println("do something"); } object Test1 { val a = "a string" def printString = println(a); }
1、Scala没有静态方法或静态字段,你可以用object这个语法结构来达到相同目的。 2、Object可以扩展其他类或特质,不能提供构造器参数,放在object中的方法都是静态方法。 3、何时使用object :
- 1、作为存放工具函数或常量的地方。
- 2、高效的共享单个不可变实例。
- 3、需要单个实例来协调某个服务时(单例模式)
1、伴生类私有化 2、在伴生对象中创建一个实例 3、在apply()中返回伴生类的实例
package com.chb.scala import scala.collection.immutable.Map /** * 伴生类: */ class TestClass private {//1、伴生类私有化 private val tc1 = 1 def add() = { tc1 + TestClass.tc2 //调用伴生对象的私有属性TestClass.xx } def test { println("test class println") } } /** * 伴生对象: * */ object TestClass { val tcInstance = new TestClass() //2、在伴生对象中创建一个实例 private val tc2 = tcInstance.tc1+2 //调用 伴生类 的私有属性,通过伴生类的实例来调用 def apply() = { //3、在apply()中返回伴生类的实例 tcInstance } } object testMain{ def main(args: Array[String]):Unit = { for(i <- 0 until 10){ //此处在创建对象时, 发现伴生类已经私有化, 实际调用的是伴生对象的apply(), 返回实例对象。 val tcls = TestClass() println(i+"->"+tcls) } } }