我刚刚在互联网上浏览了一些Scala教程,并注意到在一些示例中,对象是在示例的开头声明的。

Scala中类和对象的区别是什么?


当前回答

object关键字创建了一个新的单例类型,就像只有一个命名实例的类。如果您熟悉Java,那么在Scala中声明一个对象非常类似于创建一个匿名类的新实例。

Scala没有与Java的静态关键字等价的东西,在Scala中经常使用对象,在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);  
    }  
} 

对不起,我来晚了,但我希望这能帮助到你。

正如许多人所解释的,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初学者可能非常困惑的是,相同的构造可能有截然不同的用途。一个物体可以同时用于多种不同的用途,这可能会更令人困惑。

对象在某种程度上类似于Java中的静态类,静态特性意味着静态类在放入JVM时不需要创建对象,它可以直接由它的类名使用,并且无论在哪里使用,都共享相同的实例(相同的数据状态)。

Object是一个类,但它已经是一个实例,因此不能调用new ObjectName。另一方面,Class只是类型,它可以通过调用new ClassName()作为实例。