Scala中有类方法吗?

时间:2014-01-14 20:25:54

标签: oop scala

许多oo语言都有类方法和类变量的功能。例如,Ruby允许使用元类。在Scala中以类似的方式查看伴随对象是否公平?

2 个答案:

答案 0 :(得分:2)

  

以类似的方式查看伴侣物体是否公平   Scala呢?

是的,这是考虑它们的合理方式。

答案 1 :(得分:2)

在JVM上,类不是与Ruby或其他动态语言相同的对象。当然,您可以将类的表示形式作为类Class[_]的特殊对象,但它主要用于反射,并且不能使用自定义方法。但是,JVM具有静态方法和字段的概念,它们与类相关联,并且不需要使用该类的对象:

public class SomeClass 
    public static int add(int x, int y) { return x + y; }
}

public class OtherClass {
    public static void main() {
        int z = SomeClass.add(1, 2);
    }
}

这些方法和字段本质上是“全局的”(除非我们考虑类加载器机制),例如,方法不能在子类中重写。

Scala不允许您直接定义和使用静态 - 语言中没有“静态”概念。但是,在Scala中,您可以定义单个对象,这些对象可用于模拟静态字段和方法,同时比静态更强大,例如,它们可以参与继承。在内部,这些对象是Scala编译器为您生成的特殊类的实例。

此外,Scala还有一些特殊的单例对象,称为伴随对象,它们与某些类共享名称:

class SomeClass

object SomeClass

在内部,这些对象是与SomeClass完全不同的类的实例(可以作为SomeClass.type访问),但Scala以特殊方式处理它们,例如,您可以访问SomeClass来自SomeClass个伴侣对象的私人成员,反之亦然。伴随对象还提供额外的隐式范围。但是,SomeClass.typeSomeClass是完全不同的类。

简而言之,是的,您可以将伴侣对象视为“类”方法和字段的容器,但仅在某种程度上。伴随对象不是任何方式的元类;它们具有完全不同的语义和实现。