【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
我刚刚浏览了Internet上的一些Scala教程,并注意到在某些示例中,在示例开始时声明了一个对象。
Scala中的class
和object
什么区别?
#1楼
一个对象只有一个实例(您不能调用new MyObject
)。 您可以有一个类的多个实例。
对象具有与 Java中的静态方法和字段相同 (和一些其他) 目的 。
#2楼
tl; dr
-
class C
定义一个类,就像在Java或C ++中一样。 -
object O
创建一个单例对象O
作为某个匿名类的实例; 它可用于保存与某些类的实例不相关的静态成员。 -
object O extends T
使对象O
成为trait T
的实例; 然后,您可以将O
传递到任何一个预期为T
位置。 - 如果有
class C
,那么object C
是类C
的伴随对象 ; 请注意,伴随对象不是C
的实例。
用作静态成员的主机
通常,您需要一个object
来保存无需首先实例化某个类的实例即可使用的方法和值/变量。 此用法与Java中的static
成员密切相关。
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
不需要任何特定于实例的数据。
用作特殊的命名实例
您也可以将object
本身用作类或特征的某些特殊实例。 当您执行此操作时,您的对象需要扩展某些trait
以使其成为其子类的实例。
考虑以下代码:
object A extends B with C {
...
}
该声明首先声明一个扩展B
和C
的匿名(不可访问)类,并实例化名为A
的此类的单个实例。
这意味着A
可以传递给期望对象类型为B
或C
或B with C
。
object
附加功能
Scala中还存在一些对象的特殊功能。 我建议阅读官方文档 。
#3楼
class
是定义,描述。 它根据方法和其他类型的组成来定义类型。
object
是单例-保证类的实例是唯一的。 对于代码中的每个object
,都会创建一个匿名类,该匿名类继承自您声明要实现的object
任何类。 从Scala源代码中看不到此类,尽管您可以通过反射来了解。
object
和class
之间有关系。 如果对象共享相同的名称,则称它们为类的伴侣对象。 发生这种情况时,每个人都可以访问另一个人的private
可见性方法。 但是,这些方法不会自动导入。 您要么必须显式导入它们,要么用类/对象名作为前缀。
例如:
class X {
// class X can see private members of object X
// Prefix to call
def m(x: Int) = X.f(x)
// Import and use
import X._
def n(x: Int) = f(x)
private def o = 2
}
object X {
private def f(x: Int) = x * x
// object X can see private members of class X
def g(x: X) = {
import x._
x.o * o // fully specified and imported
}
}
#4楼
在Scala中定义对象就像在Java中定义仅具有静态方法的类。 但是,在Scala中,对象可以扩展另一个超类,实现接口,并且可以像类的实例一样被传递。 (所以就像类上的静态方法一样,但效果更好)。
#5楼
类和对象:类是一个定义,它描述实体或对象的所有属性。 对象是类的实例。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3153005