我刚刚在互联网上浏览了一些Scala教程,并注意到在一些示例中,对象是在示例的开头声明的。
Scala中类和对象的区别是什么?
我刚刚在互联网上浏览了一些Scala教程,并注意到在一些示例中,对象是在示例的开头声明的。
Scala中类和对象的区别是什么?
当前回答
类就像其他语言中的任何其他类一样。定义类就像任何其他语言一样,只是在语法上有所不同。
class Person(val name: String)
val me = new Person("My name")
然而,object是一个只有单个对象的类。这使得它很有趣,因为它可以用于使用伴生对象创建类的静态成员。这个伴随对象可以访问类定义的私有成员,并且它与您正在定义的类具有相同的名称。
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中对单例对象所做的那样。
其他回答
形式上的区别
不能为对象提供构造函数参数 对象不是类型-不能使用new操作符创建实例。但它可以有字段、方法、扩展超类和混合特征。
用法上的区别:
Scala没有静态方法或字段。相反,你应该使用object。您可以与相关类一起使用它,也可以不使用它。在第一种情况下,它被称为同伴对象。你必须: 对类和对象使用相同的名称 把它们放在同一个源文件中。 要创建一个程序,你应该在object中使用main方法,而不是在class中。 对象Hello { def main(args: Array[String]) { println(“Hello, World !”) } } 你也可以像在java中使用单例对象一样使用它。
正如许多人所解释的,object定义了一个单例实例。在这里的答案中,我认为有一件事被遗漏了,那就是对象有几个用途。
It can be the companion object to a class/trait, containing what might be considered static methods or convenience methods. It can act much like a module, containing related/subsidiary types and definitions, etc. It can implement an interface by extending a class or one or more traits. It can represent a case of a sealed trait that contains no data. In this respect, it's often considered more correct than a case class with no parameters. The special case of a sealed trait with only case object implementors is more or less the Scala version of an enum. It can act as evidence for implicit-driven logic. It introduces a singleton type.
这是一个非常强大和普遍的结构。Scala初学者可能非常困惑的是,相同的构造可能有截然不同的用途。一个物体可以同时用于多种不同的用途,这可能会更令人困惑。
类就像其他语言中的任何其他类一样。定义类就像任何其他语言一样,只是在语法上有所不同。
class Person(val name: String)
val me = new Person("My name")
然而,object是一个只有单个对象的类。这使得它很有趣,因为它可以用于使用伴生对象创建类的静态成员。这个伴随对象可以访问类定义的私有成员,并且它与您正在定义的类具有相同的名称。
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中对单例对象所做的那样。
Scala类和Java类一样,但是Scala没有在类中提供任何入口方法,就像Java中的main方法一样。与object关键字关联的主要方法。可以将object关键字视为创建隐式定义的类的单例对象。
更多信息请查看这篇文章 scala编程中的类和对象关键字
对象在某种程度上类似于Java中的静态类,静态特性意味着静态类在放入JVM时不需要创建对象,它可以直接由它的类名使用,并且无论在哪里使用,都共享相同的实例(相同的数据状态)。