Scala中 object 和 class的区别

object

在scala中没有静态方法和静态字段,所以在scala中可以用object来实现这些功能,直接用对象名调用的方法都是采用这种实现方式,例如Array.toString。对象的构造器在第一次使用的时候会被调用,如果一个对象从未被使用,那么他的构造器也不会被执行;对象本质上拥有类(scala中)的所有特性,除此之外,object还可以一扩展类以及一个或者多个特质:例如,

abstract class ClassName(val parameter){}

object Test extends ClassName(val parameter){}

trait TraitA{}

trait TraitB{}

trait TraitC{}

object Test1 extends TraitA with TraitB with TraitC{}

注意:object不能提供构造器参数,也就是说object必须是无参的

我们通常会定义和使用object的apply方法,有如下情形,apply方法就会被调用,Object(参数1 ,参数2 ,……)这样是隐含的调用apply方法,当然也可以显示的调用,如下Array("Mary","tong"),当然也可以这样来写Array.apply("Mary","tong"),一般我们提倡隐式的写法。

所有的main方法都必须在object中被调用,来提供程序的主入口,十分简单,不举例说明,处理main方法以外,scala中还提供了扩展App特质,然后将程序代码放入都早起方法体内,如

object Hello extends App{

println("Hello World !!!")

}

这样的代码可以直接执行,输出

如果需要命令行参数,可以直接调用args属性来得到,例如

def main(args: Array[String]) {
  if (args.length > 0 )
    println("Hello " + args(0))
  else
    println("Hello World")
}
scala中并没有枚举类型,但是,标准类库中提供了一个枚举类型的接口,在object下面,可以扩展出枚举类型(Enumeration),
具体示例如下:
object EnumerationDemo extends Enumeration{
  val red, green, blue, pink = Value

  val black = Value   // 上面一条语句是简写
  val white = Value
  val gray = Value

  val yellow = Value(12, "huang")    //可以随意指定id和名称,但是避免重复
  val purple = Value("zi")          //id为13
  val orange = Value(20)
}
上面的代码为实现枚举类型的具体代码,如果不指定id和name,系统默认是id从0开始,name就是变量的名称,可以指定其中的任何一个或者是两个全部指定,已经指定的就按指定的初始化,并且后面的依次递增。

枚举的引用可以直接objectName.red这样来进行引用,也可以将import objectName._来进行导入引用,还可以给枚举类型增加一个类型别名,具体如下:
object EnumerationDemo extends Enumeration{
  type EnumerationDemo = Value
  val red, green, blue, pink = Value

  val black = Value
  val white = Value
  val gray = Value

  val yellow = Value(12, "huang")
  val purple = Value("zi")
  val orange = Value(20)
}
现在枚举类型变成了EnumerationDemo.EnumerationDemo 这种用法只有在使用import语句的时候才显得有意义。
package enumeration

import EnumerationDemo._

/**
 * Created by tongtong on 2015/9/8.
 *
 */
class EnumDemo {
  def transportation(color:Enumeration): Unit ={
    if (color == red)
      "Stop"
    else if (color == green)
      "go"
    else if (color == yellow)
      "wait"
  }
}
枚举类型也可以通过for循环将所有元素输出,同时可以通过Enumeration(Int)和Enumeration.withName("")来进行

定位操作

class

在scala中,类名可以和对象名为同一个名字,该对象称为该类的伴生对象,类和伴生对象可以相互访问他们的私有属性,但是
他们必须在同一个源文件内。类只会被编译,不能直接被执行,类的申明和主构造器在一起被申明,在一个类中,主构造器只有一个,
所有必须在内部申明主构造器或者是其他申明主构造器的辅构造器,主构造器会执行类定义中的所有语句。scala对每个字段都会提供
getter和setter方法,同时也可以显示的申明,但是针对val类型,只提供getter方法,默认情况下,字段为公有类型,可以在setter
方法中增加限制条件来限定变量的变化范围,在scala中方法可以访问改类所有对象的私有字段
时间: 2024-08-05 04:51:43

Scala中 object 和 class的区别的相关文章

Scala中 => Unit 与 () =>Unit的区别

() => Unit ---> 是一个函数:=> Unit --> 是一个执行结果为Unit的表达式 code: => Unit是 by name 传递参数.参数是一个返回值为Unit的代码块.在传递的时候,参数没有被调用.比如: def test(code : => Unit){ println("start") code // 这行才会调用传入的代码块,写成code()亦可 println("end") } test{// 此

Scala 中Array,List,Tuple的区别

虽然学了一段时间的Scala了,但是总觉得基础不是太扎实,还有很多的基础知识比较模糊,于是最近又打算重新学习基础. Scala中的三种集合类型包括:Array,List,Tuple.那么到底这三种有哪些异同呢?说实话,我之前一直没弄明白,所以今天特意花了点时间学习了一下. 相同点: 1.长度都是固定的,不可变长 2.早期的Scala版本,Array.List都不能混合类型,只有Tuple可以,2.8版本以后,3者的元素都可以混合不同的类型(转化为Any类型) 不同点: 1.Array 中的元素值

scala中object和class的理解---apply方法是初始化方法

1.class Scala的类和C#中的类有点不一样,诸如: 声明一个未用priavate修饰的字段 var age,scala编译器会字段帮我们生产一个私有字段和2个公有方法get和set ,这和C#的简易属性类似:若使用了private修饰,则它的方法也将会是私有的.这就是所谓的统一访问原则. 细节的东西太多,还是上代码在注释里面细讲吧 [java] view plain copy //类默认是public级别的 class Person{ var age=18  //字段必须得初始化()

【Todo】【转载】Scala中Array, List, Tuple的区别

参考了这篇文章: https://my.oschina.net/u/1034176/blog/512314 1. 在Scala 2.7中,Array.List都不能混合类型,只有Tuple可以:而在Scala以上版本中,3者的元素都可以混合不同的类型(转化为Any类型),只不过是当使用混合类型时,Array和List会将元素类型转化为Any类型,而Tuple则保留每一个元素的初始类型. 2. 可变性 3. 关于初始化 Array 1) val array= new Array[String](3

Scala中的isInstanceOf和asInstanceOf区别

判断对象是否属于某个给定的类,可以用isInstanceOf方法:用asInstanceOf方法将引用转换为子类的引用. obj.isInstanceOf[T]就如同Java的obj instanceof T 判断obj是不是T类型. obj.asInstanceOf[T]就如同Java的(T)obj 将obj强转成T类型. 原文地址:https://www.cnblogs.com/cosmos-wong/p/11441169.html

scala class和object,trait的区别

Scala类 1 2 3 4 5 6 7 8 9 10 11 12 13 class Counter {   private var value = 0 // 必须初始化字段   def increment() { value += 1 } // 方法默认公有   def current = value // 调用必须是myCounter.current这种风格 } class Student{    var age=20     //底层编译器会自动为私有的age添加get和set的公有方法,

JavaScript中object和Object有什么区别

JavaScript中object和Object有什么区别,为什么用typeof检测对象,返回object,而用instanceof 必须要接Object呢 -------------------------------------------------------------------- 这个问题和我之前遇到的问题非常相似,我认为这里有两个问题需要解决,一个是运算符new的作用机制,一个是function关键字和Funtion内置对象之间的区别.看了一些前辈的博客和标准,这里帮提问者总结一

ECMA5.1中Object.seal()和Object.freeze()的区别

1  Object.seal(O)的调用 When the seal function is called, the following steps are taken:   If Type(O) is not Object throw a TypeError exception.   For each named own property name P of O,      Let desc be the result of calling the [[GetOwnProperty]] int

unity中 Object 与 object的区别.

小写的object是泛类, 引用的是System.Object. 大写的Object引用的是UnityEngine.Object. UnityEngine.Object继承System.Object. 需要注意的是重载的运算符. System.Object a = new System.Object(); UnityEngine.Object b = new UnityEngine.Object(); Debug.Log (a); //System.Object Debug.Log (b); /