wake-up-neo.com

Unterschied zwischen Objekt und Klasse in Scala

Ich gehe gerade einige Scala-Tutorials im Internet durch und habe in einigen Beispielen bemerkt, dass ein Objekt zu Beginn des Beispiels deklariert wird.

Was ist der Unterschied zwischen class und object in Scala?

553
Steve

tl; dr

  • class C definiert eine Klasse, genau wie in Java oder C++.
  • object O erstellt ein Singleton Objekt O als Instanz einer anonymen Klasse. Es kann verwendet werden, um statische Member aufzunehmen, die nicht Instanzen einer Klasse zugeordnet sind.
  • object O extends T macht das Objekt O zu einer Instanz von trait T; Sie können dann O überall übergeben, ein T wird erwartet.
  • wenn ein class C vorhanden ist, ist object C das Begleitobjekt der Klasse C; Beachten Sie, dass das Begleitobjekt nicht automatisch eine Instanz von C ist.

Weitere Informationen finden Sie in der Scala-Dokumentation für object und class .

Verwendung als Host statischer Member

In den meisten Fällen benötigen Sie ein object-Objekt, um Methoden und Werte/Variablen zu speichern, die verfügbar sein sollen, ohne dass zuerst eine Instanz einer Klasse instanziiert werden muss. Diese Verwendung ist eng mit static-Mitgliedern in Java verbunden.

object A {
  def twice(i: Int): Int = 2*i
}

Sie können dann die obige Methode mit A.twice(2) aufrufen.

Wenn twice Mitglied einer Klasse A wäre, müssten Sie zuerst eine Instanz erstellen:

class A() {
  def twice(i: Int): Int = 2 * i
}

val a = new A()
a.twice(2)

Sie sehen, wie dies redundant ist, da twice keine instanzspezifischen Daten benötigt.

Verwendung als spezielle benannte Instanz

Sie können object selbst auch als spezielle Instanz einer Klasse oder eines Merkmals verwenden ..__ Wenn Sie dies tun, muss Ihr Objekt einige trait erweitern, um eine Instanz einer Unterklasse davon zu werden.

Betrachten Sie den folgenden Code:

object A extends B with C {
  ...
}

Diese Deklaration deklariert zuerst eine anonyme (nicht zugreifbare) Klasse, die B und C erweitert und eine einzelne Instanz dieser Klasse namens A instantiiert.

Dies bedeutet, dass A an Funktionen übergeben werden kann, die Objekte des Typs B oder C oder B with C erwarten.

Zusätzliche Funktionen von object

Es gibt auch einige Besonderheiten von Objekten in Scala. Ich empfehle, die offizielle Dokumentation zu lesen.

  • def apply(...) aktiviert die übliche Methodennamens-Syntax von A(...)
  • Mit def unapply(...) können Sie benutzerdefinierte Musteranpassungen erstellen Extraktoren
  • begleitet eine Klasse desselben Namens, nimmt das Objekt beim Auflösen von impliziten Parametern eine besondere Rolle ein.
502
ziggystar

Ein class ist eine Definition, eine Beschreibung. Sie definiert einen Typ in Bezug auf Methoden und Zusammensetzung anderer Typen.

Ein object ist ein Singleton - eine Instanz einer Klasse, die garantiert eindeutig ist. Für jedes object im Code wird eine anonyme Klasse erstellt, die von den Klassen erbt, für deren Implementierung Sie object deklariert haben. Diese Klasse kann nicht aus dem Scala-Quellcode gesehen werden. Sie können sie jedoch durch Nachdenken erreichen.

Es besteht eine Beziehung zwischen object und class. Ein Objekt wird als Begleitobjekt einer Klasse bezeichnet, wenn sie denselben Namen haben. In diesem Fall hat jeder Zugriff auf Methoden der private-Sichtbarkeit im anderen. Diese Methoden werden jedoch nicht automatisch importiert. Sie müssen sie entweder explizit importieren oder ihnen den Klassen-/Objektnamen voranstellen.

Zum Beispiel:

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
   }
}
237

Ein Objekt hat genau one Instanz (Sie können new MyObject nicht aufrufen). Sie können multiple -Instanzen einer Klasse haben.

Das Objekt dient same (und einige zusätzliche) purpose als statische Methoden und Felder in Java. 

66
Thomas Jung

Wie von vielen erläutert, definiert object eine Einzelinstanz. Ich glaube, dass die Antworten hier, die ich für ausgeschlossen halte, darin bestehen, dass object mehrere Zwecke erfüllt.

  • Es kann das Begleitobjekt eines class/trait sein, das möglicherweise statische oder Convenience-Methoden enthält.

  • Es kann sich wie ein Modul verhalten, das verwandte/untergeordnete Typen und Definitionen enthält usw.

  • Es kann eine Schnittstelle implementieren, indem es ein class oder ein oder mehrere traits erweitert.

  • Es kann einen Fall eines sealed trait darstellen, der keine Daten enthält. In dieser Hinsicht wird es oft als korrekter als ein case class ohne Parameter betrachtet. Der Sonderfall eines sealed trait mit nur case object-Implementatoren ist mehr oder weniger die Scala-Version eines Enums.

  • Es kann als Beweis für implicit-gesteuerte Logik dienen.

  • Es führt einen Singleton-Typ ein.

Es ist ein sehr mächtiges und allgemeines Konstrukt. Was für Scala-Anfänger sehr verwirrend sein kann, ist, dass dasselbe Konstrukt sehr unterschiedliche Verwendungszwecke haben kann. Und ein object kann vielen dieser verschiedenen Zwecke gleichzeitig dienen, was noch verwirrender sein kann.

17
acjay

Das Definieren eines Objekts in Scala entspricht dem Definieren einer Klasse in Java, die nur statische Methoden enthält. In Scala kann ein Objekt jedoch eine andere Oberklasse erweitern, Schnittstellen implementieren und als eine Instanz einer Klasse herumgereicht werden. (Es ist also wie bei den statischen Methoden einer Klasse, aber besser).

15
Ken Bloom

Der formale Unterschied - 

  1. sie können keine Konstruktorparameter für Objekte angeben.
  2. Objekt ist kein Typ - Sie können keine Instanz mit einem neuen Operator erstellen. Es kann jedoch Felder und Methoden haben, eine Superklasse erweitern und Merkmale einmischen. 

Der Unterschied in der Nutzung:

  • Scala hat keine statischen Methoden oder Felder. Verwenden Sie stattdessen object. Sie können es mit oder ohne verwandte Klasse verwenden. Im ersten Fall wird es als Begleitobjekt bezeichnet. Sie müssen:
    1. verwenden Sie denselben Namen für Klasse und Objekt
    2. lege sie in dieselbe Quelldatei. 
  • Um ein Programm zu erstellen, sollten Sie die Hauptmethode in object verwenden, nicht in class.

    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
    
  • Sie können es auch verwenden, wenn Sie ein Einzelobjekt in Java verwenden.

     

     

12
irudyak

Das Schlüsselwort object erstellt einen neuen Singleton-Typ, der einer class ähnelt, die nur eine benannte Instanz hat. Wenn Sie mit Java vertraut sind, ist das Deklarieren eines object in Scala sehr ähnlich dem Erstellen einer neuen Instanz einer anonymen Klasse.

In Scala gibt es keine Entsprechung zum Schlüsselwort static von Java. In Scala wird häufig ein object verwendet, in dem Sie möglicherweise eine Klasse mit statischen Elementen in Java verwenden.

4
user2989087

In scala gibt es kein static-Konzept. Daher erstellt scala ein Einzelobjekt, um einen Einstiegspunkt für die Programmausführung bereitzustellen. Wenn Sie kein Einzelobjekt erstellen, wird der Code erfolgreich kompiliert, es wird jedoch keine Ausgabe erzeugt. In Singleton Object deklarierte Methoden sind global zugänglich. Ein Einzelobjekt kann Klassen und Merkmale erweitern.

Beispiel eines Scala-Singleton-Objekts

object Singleton{  
    def main(args:Array[String]){  
        SingletonObject.hello()         // No need to create object.  
    }  
}  


object SingletonObject{  
    def hello(){  
        println("Hello, This is Singleton Object")  
    }  
}  

Ausgabe:

Hello, This is Singleton Object

Wenn Sie in Scala eine Klasse mit demselben Namen wie das Singleton-Objekt haben, wird diese als Companion-Klasse und das Singleton-Objekt als Companion-Objekt bezeichnet.

Die Begleiterklasse und ihr Begleitobjekt müssen beide in derselben Quelldatei definiert sein.

Beispielobjekt für Scala-Begleiter

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.")  
    }  
}  

Ausgabe:

Hello, this is Companion Class.
And this is Companion Object.

In scala kann eine Klasse Folgendes enthalten:

1. Datenmitglied

2. Member-Methode  

3. Konstruktionsblock  

4. Geschachtelte Klasse  

5. Informationen zur Superklasse usw.

Sie müssen alle Instanzvariablen in der Klasse initialisieren. Es gibt keinen Standardbereich. Wenn Sie keinen Zugriffsbereich angeben, ist er öffentlich. Es muss ein Objekt geben, in dem die Hauptmethode definiert ist. Es bietet einen Ausgangspunkt für Ihr Programm. Hier haben wir ein Beispiel für die Klasse erstellt.

Scala-Beispiel für eine Klasse

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);  
    }  
} 

Es tut mir leid, ich bin zu spät, aber ich hoffe, es wird Ihnen helfen.

2
Bhaskar Das

Object ist eine Klasse, aber sie hat bereits eine Instanz, Sie können also nicht new ObjectName aufrufen. Andererseits ist Class nur ein Typ und es kann eine Instanz sein, indem new ClassName() aufgerufen wird.

2
Yonggoo Noh

Die Scala-Klasse ist dieselbe wie die Java-Klasse, aber Sie erhalten in scala keine Eingabemethode wie die Hauptmethode in Java. Die dem Objektschlüsselwort zugeordnete Hauptmethode. Sie können sich das Schlüsselwort object so vorstellen, dass ein Einzelobjekt einer Klasse erstellt wird, die implizit definiert ist.

weitere Informationen finden Sie in diesem Artikel Klassen- und Objektschlüsselwort in der Scala-Programmierung

1
FOD

Das Objekt entspricht in einigen Fällen der statischen Klasse in Java. Die statischen Merkmale bedeuten, dass die statische Klasse kein Objekt erstellen muss, wenn sie in die JVM gestellt wird. Sie kann durch ihren Klassennamen direkt verwendet werden

0
David

Wenn Sie aus Java-Hintergrund kommen, ist das Konzept der Klasse in Scala Java ähnlich, aber die Klasse in Scala kann keine statischen Member enthalten.

Objekte in Scala sind Singleton-Typen, in denen Sie Methoden unter Verwendung des Objektnamens aufrufen. In Scala-Objekt handelt es sich um ein Schlüsselwort und in Java-Objekt um eine Klasseninstanz

0
Vivek

Eine Klasse ist wie jede andere Klasse in anderen Sprachen. Sie definieren Klasse wie jede andere Sprache mit einem gewissen Syntaxunterschied.

class Person(val name: String)
val me = new Person("My name")

Object ist jedoch eine Klasse mit nur einem Objekt. Dies macht es interessant, da es verwendet werden kann, um statische Member einer Klasse mit Begleitobjekt zu erstellen. Dieses Companion-Objekt hat Zugriff auf private Mitglieder der Klassendefinition und hat denselben Namen wie die von Ihnen definierte Klasse.

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()

Bemerkenswert ist auch, dass die Objektklasse träge erstellt wird, was ein weiterer wichtiger Punkt ist. Daher werden diese nicht instanziiert, es sei denn, sie werden in unserem Code benötigt.

Wenn Sie die Verbindungserstellung für JDBC definieren, können Sie diese innerhalb eines Objekts erstellen, um eine Duplizierung zu vermeiden, genau wie wir dies in Java mit Singleton-Objekten tun.

0
Piyush P