了解Scala中的类和对象
了解Scala中的类和对象
我对Scala非常陌生,现在我必须处理一个既包含Scala又包含Java的项目。我遇到了这样一种构造:
class SomeType{ //... } trait Trait1 extends scala.AnyRef{ } trait Trait2 extends extends scala.AnyRef{ } class MyClass(arg : SomeType) extends Trait1{ //... } object MyClass extends Trait2{ //... }
这令人感觉有些无聊。通过阅读这篇答案,我了解到我们可以将object
视为只带有抽象方法的类。也就是说,在Java中我们可以(依我之见)定义一些使用Class
对象的映射关系。
但是在这个例子中,class
和object
继承的是不同的trait
。这就是我真正困惑的地方,我无法想象它的含义以及为什么要使用它。
一个类就像其他语言中的任何其他类一样。您可以使用一些语法差异定义类,就像使用其他任何语言一样。此外,有些带有一些方便方法定义的case 类,允许轻松初始化对象。
class Person(val name: String) val me = new Person("My name")
然而,对象是只有单个对象的类。这使得它非常有趣,因为它可以使用伴随对象创建类的静态成员。此伴随对象可以访问类定义的私有成员,并且与您正在定义的类具有相同的名称。
class Person(var name: String) { import Person._ def hi(): String = sayHello(name) } object Person { private def sayHello(name: String): String = "Hello " + name } val me = new Person("My name") me.hi()
此外,值得注意的一点是,对象类是惰性创建的,这是另一个重要的点。因此,除非需要在我们的代码中使用它们,否则它们不会被实例化。
如果您正在为JDBC定义连接创建,则可以将它们创建在对象内部,以避免重复,就像我们在Java中使用单例对象一样。
我会试着从一个了解Java的人的角度来解释Scala的object
是什么。
在Java中,您可以定义“普通”类成员和static
类成员。当Java中的某些东西(例如成员变量)是static
时,那么只有一个该成员变量的实例,该实例被该类的所有实例共享。
在Scala中,没有static
。与Java相比:您在Java中要使static
的任何内容,在Scala中都可以放入一个object
中。
Scala object
是单例的 - 只有一个实例,就像只有一个static
成员的Java一样。
希望这使得Scala object
是什么变得更加清晰。
Scala object
可以像任何其他类或trait一样扩展类或trait,这样它就会继承在它扩展的类或trait中定义的任何内容。真的没有理由不能这样做。
请注意,如果您拥有一个具有相同名称的
请注意,这并不意味着object
是类的实例。它不是 - 它是一个独立的东西,站在类的旁边。也许您对类和对象扩展不同traits的困惑来自于这个观点的误解。