zoukankan      html  css  js  c++  java
  • 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中方法可以访问改类所有对象的私有字段
  • 相关阅读:
    物流能力和综合层次结构
    new Eclipse 3.0+Lomboz 3.0+Tomcat 5.0.16配置
    30件你不知道可以通过Internet来办到的事
    《网上苏州》电子地图建设方案
    IT从业人员必看的10个论坛
    非常在线网站站长自述创业经历
    防止对 Visual Basic .NET 或 C# 代码进行反相工程
    略论中国人的思维方式
    C# vs. Java:相反的思维方式 (译文)
    Java多线程编程经验谈
  • 原文地址:https://www.cnblogs.com/liuchuanfeng/p/7210977.html
Copyright © 2011-2022 走看看