Respuestas:
class C
define una clase, tal como en Java o C ++.object O
crea un objeto singletonO
como instancia de alguna clase anónima; se puede usar para mantener miembros estáticos que no están asociados con instancias de alguna clase.object O extends T
convierte el objeto en O
una instancia de trait T
; luego puede pasar a O
cualquier lugar, T
se espera a.class C
, entonces object C
es el objeto compañero de la clase C
; tenga en cuenta que el objeto complementario no es automáticamente una instancia de C
.Consulte también la documentación de Scala para el objeto y la clase .
object
como anfitrión de miembros estáticosEn la mayoría de los casos, necesita una object
para contener métodos y valores / variables que estarán disponibles sin tener que instanciar primero una instancia de alguna clase. Este uso está estrechamente relacionado con los static
miembros en Java.
object A {
def twice(i: Int): Int = 2*i
}
Luego puede llamar al método anterior usando A.twice(2)
.
Si twice
fuera miembro de alguna clase A
, primero necesitaría hacer una instancia:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
Puede ver cuán redundante es esto, ya twice
que no requiere ningún dato específico de la instancia.
object
como una instancia especial con nombreTambién puede usar el object
propio como alguna instancia especial de una clase o rasgo. Cuando haces esto, tu objeto necesita extenderse un poco trait
para convertirse en una instancia de una subclase de él.
Considere el siguiente código:
object A extends B with C {
...
}
Esta declaración declara por primera vez una clase anónima (inaccesibles) que se extiende a ambos B
y C
, y crea la instancia de una única instancia de esta clase llamada A
.
Esto significa que A
puede pasarse a funciones que esperan objetos de tipo B
o C
, o B with C
.
object
También existen algunas características especiales de los objetos en Scala. Recomiendo leer la documentación oficial .
def apply(...)
habilita la sintaxis sin nombre del método habitual de A(...)
def unapply(...)
permite crear extractores de coincidencia de patrones personalizadosCommerce
clase, pero la JVM y el lenguaje Java sí. (Así es como puedes hacer object Foo{ def main(args:Seq[String]) }
y esperar que el programa se ejecute.)
A class
es una definición, una descripción. Define un tipo en términos de métodos y composición de otros tipos.
Un object
es un singleton, una instancia de una clase que se garantiza que es única. Para cada parte object
del código, se crea una clase anónima, que hereda de las clases que declaró object
implementar. Esta clase no se puede ver desde el código fuente de Scala, aunque se puede obtener a través de la reflexión.
Hay una relación entre object
y class
. Se dice que un objeto es el objeto compañero de una clase si comparten el mismo nombre. Cuando esto sucede, cada uno tiene acceso a métodos de private
visibilidad en el otro. Sin embargo, estos métodos no se importan automáticamente. Tiene que importarlos explícitamente o prefijarlos con el nombre de clase / objeto.
Por ejemplo:
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
}
}
def f(x: X) = ???
, entonces podría llamar a métodos privados x
, de la clase compañera X
.
Un objeto tiene exactamente una instancia (no se puede llamar new MyObject
). Puede tener varias instancias de una clase.
El objeto cumple los mismos propósitos (y algunos más) que los métodos y campos estáticos en Java.
Como muchos han explicado, object
define una instancia singleton. Lo único en las respuestas aquí que creo que se omite es que object
tiene varios propósitos.
Puede ser el objeto complementario de un class
/ trait
, que contiene lo que podría considerarse métodos estáticos o métodos de conveniencia.
Puede actuar como un módulo, que contiene tipos y definiciones relacionados / subsidiarios, etc.
Puede implementar una interfaz extendiendo class
uno o más trait
s.
Puede representar un caso de un sealed trait
que no contiene datos. A este respecto, a menudo se considera más correcto que case class
a sin parámetros. El caso especial de un sealed trait
con solo case object
implementadores es más o menos la versión Scala de una enumeración.
Puede actuar como evidencia de la implicit
lógica impulsada.
Introduce un tipo singleton.
Es una construcción muy poderosa y general. Lo que puede ser muy confuso para los principiantes de Scala es que la misma construcción puede tener usos muy diferentes. Y object
puede servir muchos de estos diferentes usos a la vez, lo que puede ser aún más confuso.
Definir un objeto en Scala es como definir una clase en Java que solo tiene métodos estáticos. Sin embargo, en Scala un objeto puede extender otra superclase, implementar interfaces y pasarlo como si fuera una instancia de una clase. (Entonces es como los métodos estáticos en una clase pero mejor).
La diferencia formal
La diferencia en el uso:
object
. Puede usarlo con o sin clase relacionada. En el primer caso se llama objeto complementario. Tienes que:
Para crear un programa, debe usar el método principal en object
, no en class
.
object Hello {
def main(args: Array[String]) {
println("Hello, World!")
}
}
También puede usarlo al usar un objeto singleton en java.
La palabra clave object crea un nuevo tipo singleton, que es como una clase que solo tiene una única instancia con nombre. Si está familiarizado con Java, declarar un objeto en Scala es muy parecido a crear una nueva instancia de una clase anónima.
Scala no tiene equivalente a la palabra clave estática de Java , y un objeto a menudo se usa en Scala, donde puede usar una clase con miembros estáticos en Java.
Object es una clase pero ya tiene (es) una instancia, por lo que no puede llamar new ObjectName
. Por otro lado, Class es solo tipo y puede ser una instancia llamando new ClassName()
.
En scala, no hay static
concepto. Entonces scala crea un objeto singleton para proporcionar un punto de entrada para la ejecución de su programa. Si no crea un objeto singleton, su código se compilará correctamente pero no generará ningún resultado. Los métodos declarados dentro de Singleton Object son accesibles globalmente. Un objeto singleton puede extender clases y rasgos.
Ejemplo de objeto Scala Singleton
object Singleton{
def main(args:Array[String]){
SingletonObject.hello() // No need to create object.
}
}
object SingletonObject{
def hello(){
println("Hello, This is Singleton Object")
}
}
Salida:
Hello, This is Singleton Object
En scala, cuando tiene una clase con el mismo nombre que el objeto singleton, se llama clase acompañante y el objeto singleton se llama objeto acompañante.
La clase complementaria y su objeto complementario deben definirse en el mismo archivo fuente.
Ejemplo de objeto de Scala Companion
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.")
}
}
Salida:
Hello, this is Companion Class.
And this is Companion Object.
En scala, una clase puede contener:
1. Miembro de datos
2. Método del miembro
3. Bloque constructor
4. Clase anidada
5. Información de super clase, etc.
Debe inicializar todas las variables de instancia en la clase. No hay alcance predeterminado. Si no especifica el alcance de acceso, es público. Debe haber un objeto en el que se defina el método principal. Proporciona un punto de partida para su programa. Aquí, hemos creado un ejemplo de clase.
Ejemplo de clase Scala de clase
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);
}
}
Lo siento, es demasiado tarde, pero espero que te ayude.
La clase Scala es igual a la clase Java, pero scala no le ofrece ningún método de entrada en clase, como el método principal en Java. El método principal asociado con la palabra clave objeto. Puede pensar en la palabra clave object como la creación de un objeto singleton de una clase que se define implícitamente.
Para obtener más información, consulte esta clase de artículo y la palabra clave de objeto en la programación de Scala
El objeto es similar a la clase estática en Java hasta cierto punto, la característica estática significa que la clase estática no necesita crear un objeto cuando se coloca en la JVM, puede usarse directamente por su nombre de clase y la misma instancia (mismo estado de datos ) se comparte donde sea que se use.
Una clase es como cualquier otra clase en otros idiomas. Define la clase como cualquier otro idioma con alguna diferencia de sintaxis.
class Person(val name: String)
val me = new Person("My name")
Sin embargo, object es una clase con un solo objeto solamente. Esto lo hace interesante ya que se puede usar para crear miembros estáticos de una clase usando un objeto complementario . Este objeto complementario tiene acceso a miembros privados de la definición de clase y tiene el mismo nombre que la clase que está definiendo.
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()
Además, un punto notable es que la clase de objeto se crea perezosamente, que es otro punto importante. Por lo tanto, estos no se instancian a menos que sean necesarios en nuestro código.
Si está definiendo la creación de conexión para JDBC, puede crearlos dentro del objeto para evitar la duplicación al igual que lo hacemos en Java con objetos singleton.
Si viene de Java, el concepto de clase en scala es similar a Java, pero la clase en scala no puede contener miembros estáticos.
Los objetos en scala son de tipo singleton al que llamas métodos dentro de él usando el nombre del objeto, en scala el objeto es una palabra clave y en java el objeto es una instancia de clase