我刚刚在互联网上浏览了一些Scala教程,并注意到在一些示例中,对象是在示例的开头声明的。
Scala中类和对象的区别是什么?
我刚刚在互联网上浏览了一些Scala教程,并注意到在一些示例中,对象是在示例的开头声明的。
Scala中类和对象的区别是什么?
当前回答
在Scala中定义一个对象就像在Java中定义一个只有静态方法的类。然而,在Scala中,对象可以扩展另一个超类,实现接口,并像类的实例一样传递。(所以它就像类的静态方法,但更好)。
其他回答
博士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(…)允许创建自定义模式匹配提取器 如果伴随同名的类,则对象在解析隐式参数时承担特殊角色
在Scala中定义一个对象就像在Java中定义一个只有静态方法的类。然而,在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中对单例对象所做的那样。
object关键字创建了一个新的单例类型,就像只有一个命名实例的类。如果您熟悉Java,那么在Scala中声明一个对象非常类似于创建一个匿名类的新实例。
Scala没有与Java的静态关键字等价的东西,在Scala中经常使用对象,在Java中可以使用带有静态成员的类。
在scala中,没有静态的概念。因此,scala创建了一个单例对象,为程序执行提供入口点。 如果您不创建单例对象,您的代码将成功编译,但不会产生任何输出。在单例对象中声明的方法是全局可访问的。单例对象可以扩展类和特征。
Scala单例对象示例
object Singleton{
def main(args:Array[String]){
SingletonObject.hello() // No need to create object.
}
}
object SingletonObject{
def hello(){
println("Hello, This is Singleton Object")
}
}
输出:
Hello, This is Singleton Object
在scala中,当你有一个与单例对象同名的类时,它被称为伴侣类,而单例对象被称为伴侣对象。
伴生类及其伴生对象必须在同一个源文件中定义。
Scala配套对象示例
class ComapanionClass{
def hello(){
println("Hello, this is Companion Class.")
}
}
object CompanoinObject{
def main(args:Array[String]){
new ComapanionClass().hello()
println("And this is Companion Object.")
}
}
输出:
Hello, this is Companion Class.
And this is Companion Object.
在scala中,一个类可以包含:
1. 数据成员
2. 成员方法
3.构造函数块
4. 嵌套类
5. 超班信息等。
必须初始化类中的所有实例变量。没有默认作用域。如果不指定访问范围,则为public。必须有一个对象,其中定义了main方法。它为您的程序提供了起点。在这里,我们创建了一个类的示例。
Scala类示例
class Student{
var id:Int = 0; // All fields must be initialized
var name:String = null;
}
object MainObject{
def main(args:Array[String]){
var s = new Student() // Creating an object
println(s.id+" "+s.name);
}
}
对不起,我来晚了,但我希望这能帮助到你。