Scala中的对象和类之间的区别

我只是在浏览互联网上的一些Scala教程,并注意到在一些示例中,在示例开始时声明了一个对象。

Scala中的classobject什么区别?


TL;博士

  • class C定义了一个类,就像在Java或C ++中一样。
  • object O创建一个单例对象O作为一些匿名类的实例; 它可以用来保存与某些类的实例无关的静态成员。
  • object O extends T使对象O成为trait T一个实例; 然后你可以在任何地方传递O ,预计T
  • 如果存在class C ,则object C是类C的伴随对象; 请注意,伴随对象不会自动成为C一个实例。
  • 另请参阅对象和类的Scala文档。

    用作主机的静态成员

    大多数情况下,您需要一个object来保存应该可用的方法和值/变量,而无需首先实例化某个类的实例。 这与Java中的static成员密切相关。

    object A {
      def twice(i: Int): Int = 2*i
    }
    

    然后可以使用A.twice(2)调用上述方法。

    如果twice是某个A类的成员,那么您需要先创建一个实例:

    class A() {
      def twice(i: Int): Int = 2 * i
    }
    
    val a = new A()
    a.twice(2)
    

    您可以看到这是多余的,因为twice不需要任何实例特定的数据。

    用作特殊命名实例

    您也可以将object本身用作某个类或特征的特殊实例。 当你这样做时,你的对象需要扩展一些trait才能成为它的一个子类的实例。

    考虑下面的代码:

    object A extends B with C {
      ...
    }
    

    该声明首先声明一个匿名(不可访问)的类,它扩展了BC ,并实例化了这个类的一个名为A实例。

    这意味着可以将A传递给期望BC类型的对象的函数,或者将B with C传递给B with C

    object其他特征

    在Scala中还有一些特殊的对象。 我建议阅读官方文档。

  • def apply(...)启用A(...)的常用方法无名语法
  • def unapply(...)允许创建自定义模式匹配提取器
  • 如果伴随着一个相同名称的类,则该对象在解析隐式参数时承担特殊的角色

  • 一个class是一个定义,一个描述。 它根据方法和其他类型的组合来定义类型。

    一个object是一个单例 - 一个保证是唯一的类的实例。 对于代码中的每个object ,都会创建一个匿名类,该类继承自您声明要实现的object任何类。 这个类不能从Scala源代码中看到 - 尽管你可以通过反思来了解它。

    objectclass之间有关系。 如果一个对象具有相同的名称,则称它为类的伴侣对象。 发生这种情况时,每个人都可以访问另一方中的private可见性方法。 虽然这些方法不会自动导入。 您必须显式导入它们,或者以类/对象名称作为前缀。

    例如:

    class X {
      // class X can see private members of object X
      // Prefix to call
      def m(x: Int) = X.f(x)
    
      // Import and use
      import X._
      def n(x: Int) = f(x)
    
      private def o = 2
    }
    
    object X {
      private def f(x: Int) = x * x
    
      // object X can see private members of class X
      def g(x: X) = {
        import x._
        x.o * o // fully specified and imported
       }
    }
    

    一个对象只有一个实例(你不能调用new MyObject )。 你可以有一个类的多个实例。

    对象与Java中的静态方法和字段相同 (以及其他一些) 用途

    链接地址: http://www.djcxy.com/p/23641.html

    上一篇: Difference between object and class in Scala

    下一篇: How to define an empty object in PHP