理解scala中的类和对象

时间:2016-06-16 09:21:32

标签: java 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{
    //...
}
这是一种令人头脑麻木的麻木。据我所知,answer我可以认为object只是抽象方法的类。即我们可以(在我看来)用java中的Class<T>对象定义一些映射。

但在此示例中,classobject扩展了 不同的 trait。这就是我真正感到困惑的地方。我无法想象这意味着什么以及为何使用它。

2 个答案:

答案 0 :(得分:8)

我试图从了解Java的人的角度解释Scala object是什么。

在Java中,您可以定义&#34; normal&#34;班级成员和static班级成员。当Java中的某些东西(例如成员变量)是static时,那里只有该成员变量的一个实例,该实例由该类的所有实例共享。

在Scala中,没有static。与Java相比:无论您在Java中使用static,您都会在Scala中添加object

Scala object是一个单例 - 它只有一个实例,就像Java中的static成员一样,只有一个实例。

我希望能更清楚地了解Scala object究竟是什么。

Scala object可以像任何其他类或特征一样扩展类或特征,以便它继承在其扩展的类或特征中定义的内容。真的没有理由为什么这不可能。

请注意,如果您有classobject同名,那么这两个属于一起 - 他们可以看到彼此的私人成员。 object被称为班级的伴侣对象

请注意,意味着object是该类的实例。它不是 - 它是一个独立的东西站在课堂旁边。也许你对类和对象扩展不同特征的困惑来自于对这一点的误解。

答案 1 :(得分:1)

一个类与其他语言的任何其他类一样。您可以像定义任何其他语言一样定义类,就像其他任何语言一样。另外,case classes中定义了一些方便的方法,可以轻松地初始化对象。

class Person(val name: String)
val me = new Person("My name")

但是,对象是仅具有单个对象的类。这很有趣,因为它可以用于使用 companion对象创建类的静态成员。该伴随对象可以访问类定义的私有成员,并且与您要定义的类具有相同的名称。

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中使用单例对象那样在对象内部创建它们以避免重复。

相关问题