我有两节课。
class A (name: String) {
}
object A {
}
根据Singleton的定义,我们只能有一个这种类型的对象。但是,我可以使用以下代码创建两个类型A
的不同对象。
object B {
def main(args: Array[String]): Unit = {
val a = new A("Vinod")
println(a)
val b = new A("XYZ")
println(b)
}
}
有人可以解释一下,我的理解不正确吗?
答案 0 :(得分:4)
伴侣对象不是伴侣类的实例。它们甚至不是同一类型。
class A
object A {
var state = 0
def update() :Unit = state = state + 1
}
val abc :A = new A //instance of class A
val xyz :A.type = A //2nd reference to object A
// both reference the same singleton object
xyz.update() //res0: Unit = ()
A.state //res1: Int = 1
abc.state //Error: value state is not a member of A$A2521.this.A
答案 1 :(得分:4)
object
本身 是一个单身人士。它有自己的类,运行时不存在同一类的其他实例。
但是,您在此处描述的模式不同:object A
不是类A
的实例,除非您使用object A extends A
这样做。您可以通过将类A
设为A
类使其成为类sealed
的唯一实例,但几乎在所有情况下都不需要这样做。
如果您真的想要单身模式,请删除class
并仅使用object A
,其所有成员都将是"静态"就Java而言。
请注意,object A
的实际类型可以称为A.type
,如果存在类A
,则默认情况下与A
类型完全无关。同样,A.type
可以成为A
的子类型,如果您明确这样做的话。
答案 2 :(得分:0)
伴侣对象可以被认为是类的静态空间。如果你想让A成为单身人士,你可以把它变成一个对象而不是一个类
答案 3 :(得分:0)
BundleTable.EnableOptimizations = false;
bundles.Add(new ScriptBundle("~/Scripts/jquery").Include(
"~/Scripts/jquery-1.11.2.min.js",
"~/Scripts/jquery.ui.min.js"
));
bundles.Add(new ScriptBundle("~/Scripts/customscripts").Include(
"~/Scripts/BeatPicker.min.js",
"~/Scripts/chosen.jquery.js",
"~/Scripts/legacy.js",
"~/Scripts/custombox.js",
"~/Scripts/ion.rangeSlider.js",
"~/Scripts/ion.rangeSlider.min.js",
"~/Scripts/iCheck/icheck.min.js",
// "~/Scripts/jquery.ui.datepicker1.min.js",
"~/Scripts/jquery.dataTables.min.js",
"~/Scripts/jquery.ui.datepicker.monthyearpicker.js",
"~/Scripts/jquery.unobtrusive-ajax.min.js",
"~/Scripts/jquery.akordeon.js",
"~/Scripts/jquery.autogrow-min.js",
"~/Scripts/jquery.corner.js",
指new A
(不是单身人士),而不是class A
。您可以轻松检查它:如果删除object A
,则class A
行将不再编译。
另请注意,new A
不是必须单身:它们可以嵌套在类或特征中,在这种情况下,外部类型的每个实例都有一个。