伴生类和伴生对象(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()
  }
}
/**
  * 伴生类和伴生对象:具有相同名字的object(伴生对象)和class(伴生类)
  */
class ApplyTest {
  def apply() = {
    println("this is the apply method in class")
  }
}

object ApplyTest {
  println("开始+++++++++++++")
  //最佳实践:我们通常在伴生对象中实现 new 一个伴生类实例
  def apply(): ApplyTest = {
    println("this is the apply method in object")
    new ApplyTest()       //创建伴生类实例
  }
  println("结束+++++++++++++")
}

一般的,我们使用 ApplyTest() 则是伴生对象调用apply()方法,对于我们要去new一个伴生类实例,我们一般在对应的伴生对象内的apply方法内去new

(该代码感兴趣的小伙伴可以拿去测试,代码很简单!)

举例子:

    对于数组Array来说,有两种实现对象的方式

1 object ArrayTest extends App {
2    val a = Array(1,2,3,4)
3    val b = new Array[Int](4)
4 }

二者都属于定长数组;a的写法其实是b写法的语法糖 (更精简),我们可以对Array的apply源码进行查看:

1 /** Creates an array of `Int` objects */
2   // Subject to a compiler optimization in Cleanup, see above.
3   def apply(x: Int, xs: Int*): Array[Int] = {
4     val array = new Array[Int](xs.length + 1)
5     array(0) = x
6     var i = 1
7     for (x <- xs.iterator) { array(i) = x; i += 1 }
8     array
9   }

该apply方法是在其Array的伴生对象中实现(主要在伴生对象中实现了Array的基本操作),第四行的实现即是我们声明Array的b写法

原文地址:https://www.cnblogs.com/zhixiangshu/p/10063579.html

时间: 2024-10-07 20:14:37

伴生类和伴生对象(apply方法的实践)的相关文章

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

1.  object 相当于class的单个实例,因此,在object里声明的变量都是静态变量,静态方法 2.  在object里声明的变量,都是全局变量,也就是类的公共属性,或者类似于java中父类的属性 3.  object里的构造器,也就是object 内部不在method中的代码,都属于构造器的内容 4. 同样,object的主构造器只会在第一次调用时执行,多次调用,只会执行一次. object使用场景 1.  单例模式 2.  工具类 伴生对象与 伴生类? 如果有一个class,还有一

为Jquery类和Jquery对象扩展方法

jquery.fn.extend与jquery.extend jQuery为开发插件提拱了两个方法,分别是: JavaScript代码 jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法. jQuery.fn.extend(object);给jQuery对象添加方法. fn 是什么东西呢.查看jQuery代码,就不难发现. JavaScript代码 jQuery

Java中通过Class类获取Class对象的方法详解

方式1:通过Object类的getObject()方法 Person p = new Person(); Class c = p.getClass(); 方式2: 通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单). Class c2 = Person.class; 方式3: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可) Class c3 = Class.forName("Person

js类数组转数组的方法(ArrayLike)

1. 什么是类数组ArrayLike 拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,这里你可以当做是个非负整数串来理解) 不具有数组所具有的方法 //类数组示例 var a = {'1':'gg','2':'love','4':'meimei',length:5}; Array.prototype.join.call(a,'+');//'+gg+love++meimei' //非类数组示例 var c = {'1':2}; //没有length属性就不是类数

Objective-C之成魔之路【3-类、对象和方法】

重开发者的劳动成果,请勿转载 面向对象程序设计的一些关键概念,主要关注Objective-C定义类相关的语法. OC面向对象方面的概念和其它语言差不多.相比其他语言更接近C++. 对象就是一个物件.面向对象的程序设计可以看成一个物件和你想对它做的事情. 对象(名词)----实现(动词),先定义类(Class),再定义方法(Method). C语言是典型的面向过程性语言. 在C语言中,通常是先考虑要实现什么,然后才关注对象,这几乎总是与面向对象的思考过程相反. 实现(动词)----对象(名词),先

scala 单例、伴生对象、伴生类

单例:使得对象成为系统中的唯一实例 package scala object single { private var sno:Int = 3; def singlesno()={ sno += 1 sno } } object singleTest { def main(args: Array[String]): Unit = { println(single.singlesno()) println(single.singlesno()) } } 伴生对象: 当单例对象与某个类共享同一个名称

call(),apply()方法和类数组对象arguments

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 <script type="text/javascript"> 7 /* 8 call(),apply() 9 这两个方法都是函数对象的方法,需要通过函数对象来调用 10 当对函数调用call()和apply()都会调用函数

转载---编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议47~51)

阅读目录 建议47:在equals中使用getClass进行类型判断 建议48:覆写equals方法必须覆写hashCode方法 建议49:推荐覆写toString方法 建议50:使用package-info类为包服务 建议51:不要主动进行垃圾回收 回到顶部 建议47:在equals中使用getClass进行类型判断 本节我们继续讨论覆写equals的问题,这次我们编写一个员工Employee类继承Person类,这很正常,员工也是人嘛,而且在JavaBean中继承也很多见,代码如下: 1 p

黑马程序员---Objective-C基础学习---类、对象、方法相关知识笔记

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 类.对象.方法相关知识笔记 Objective-C相对于C语言有了面向对象的特性,但是ObjC又没有其他面向对象语言那么多语法特性,ObjC本身对面向对象进行了精简.下面是一些相关知识笔记. 类定义 成员变量 方法和属性 self关键字 类定义 在C#.Java等其他高级语言中定义一个类是相当简单点的,直接一个关键字class加一对大括号基本就完成了,但是在ObjC中类的定义相对变化比较大.现