我刚刚在互联网上浏览了一些Scala教程,并注意到在一些示例中,对象是在示例的开头声明的。
Scala中类和对象的区别是什么?
我刚刚在互联网上浏览了一些Scala教程,并注意到在一些示例中,对象是在示例的开头声明的。
Scala中类和对象的区别是什么?
当前回答
Scala类和Java类一样,但是Scala没有在类中提供任何入口方法,就像Java中的main方法一样。与object关键字关联的主要方法。可以将object关键字视为创建隐式定义的类的单例对象。
更多信息请查看这篇文章 scala编程中的类和对象关键字
其他回答
形式上的区别
不能为对象提供构造函数参数 对象不是类型-不能使用new操作符创建实例。但它可以有字段、方法、扩展超类和混合特征。
用法上的区别:
Scala没有静态方法或字段。相反,你应该使用object。您可以与相关类一起使用它,也可以不使用它。在第一种情况下,它被称为同伴对象。你必须: 对类和对象使用相同的名称 把它们放在同一个源文件中。 要创建一个程序,你应该在object中使用main方法,而不是在class中。 对象Hello { def main(args: Array[String]) { println(“Hello, World !”) } } 你也可以像在java中使用单例对象一样使用它。
Scala类和Java类一样,但是Scala没有在类中提供任何入口方法,就像Java中的main方法一样。与object关键字关联的主要方法。可以将object关键字视为创建隐式定义的类的单例对象。
更多信息请查看这篇文章 scala编程中的类和对象关键字
如果你有java背景,scala中类的概念与java类似,但是scala中的类不能包含静态成员。
scala中的对象是单例类型的,你可以使用对象名在它内部调用方法,在scala中object是一个关键字,在java中object是一个类的实例
一个对象只有一个实例(你不能调用新的MyObject)。一个类可以有多个实例。
对象与Java中的静态方法和字段具有相同的(以及一些额外的)用途。
博士tl;
class C定义一个类,就像在Java或c++中一样。 object O创建一个单例对象O作为某个匿名类的实例;它可以用来保存与某些类的实例没有关联的静态成员。 对象O扩展了T,使对象O成为性状T的实例;你可以在任何地方传递O,期望传递T。 如果存在类C,则对象C是类C的伴生对象;注意,伴生对象并不自动是C的实例。
也可以参考Scala文档了解对象和类。
对象作为静态成员的宿主
大多数情况下,您需要一个对象来保存可用的方法和值/变量,而不必首先实例化某个类的实例。 这种用法与Java中的静态成员密切相关。
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不需要任何特定于实例的数据。
对象作为特殊的命名实例
您还可以使用对象本身作为类或trait的一些特殊实例。 当你这样做的时候,你的对象需要扩展一些特征,以成为它的一个子类的实例。
考虑下面的代码:
object A extends B with C {
...
}
该声明首先声明了一个匿名(不可访问)类,它扩展了B和C,并实例化了这个类的一个名为a的实例。
这意味着A可以传递给期望类型为B或C的对象的函数,或者带有C的B。
对象的附加特征
Scala中还存在一些对象的特殊特性。 我建议阅读官方文档。
def apply(…)启用A(…)常用的无方法名语法 Def unapply(…)允许创建自定义模式匹配提取器 如果伴随同名的类,则对象在解析隐式参数时承担特殊角色