Ich gehe gerade einige Scala-Tutorials im Internet durch und habe in einigen Beispielen festgestellt, dass zu Beginn des Beispiels ein Objekt deklariert ist.
Was ist der Unterschied zwischen class
und object
in Scala?
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 Elemente zu speichern, die nicht mit Instanzen einer Klasse verknüpft sind.object O extends T
macht das Objekt zu O
einer Instanz von trait T
; Sie können dann O
überall passieren , ein T
wird erwartet.class C
, dann object C
ist es das Begleitobjekt der Klasse C
. Beachten Sie, dass das Begleitobjekt nicht automatisch eine Instanz von ist C
.Siehe auch Scala-Dokumentation für Objekt und Klasse .
object
als Host von statischen MitgliedernIn den meisten object
Fällen müssen Sie Methoden und Werte / Variablen enthalten, die verfügbar sein sollen, ohne zuvor eine Instanz einer Klasse instanziieren zu müssen. 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 aufrufen A.twice(2)
.
Wenn Sie twice
Mitglied einer Klasse A
wären, müssten Sie zuerst eine Instanz erstellen:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
Sie können sehen, wie redundant dies ist, da twice
keine instanzspezifischen Daten erforderlich sind.
object
als spezielle benannte InstanzSie können das 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 (unzugängliche) Klasse, die sowohl B
als auch erweitert C
, und instanziiert eine einzelne Instanz dieser Klasse mit dem Namen A
.
Dieses Mittel A
kann an Funktionen übergeben werden, die Objekte vom Typ B
oder C
oder erwarten B with C
.
object
Es gibt auch einige Besonderheiten von Objekten in Scala. Ich empfehle die offizielle Dokumentation zu lesen .
def apply(...)
aktiviert die übliche Syntax ohne Methodennamen von A(...)
def unapply(...)
ermöglicht individuelle Mustervergleich erstellen Extraktoren
Commerce
Klasse nicht, die JVM und die Java-Sprache jedoch. (So können Sieobject Foo{ def main(args:Seq[String]) }
das Programm ausführen und erwarten, dass es ausgeführt wird.)A
class
ist eine Definition, eine Beschreibung. Es definiert einen Typ in Bezug auf Methoden und Zusammensetzung anderer Typen.An
object
ist ein Singleton - eine Instanz einer Klasse, die garantiert eindeutig ist. Für jedenobject
Code wird eine anonyme Klasse erstellt, die von allen Klassen erbt, derenobject
Implementierung Sie deklariert haben . Diese Klasse kann aus dem Scala-Quellcode nicht gesehen werden - obwohl Sie sie durch Reflexion erreichen können.Es gibt eine Beziehung zwischen
object
undclass
. Ein Objekt wird als Begleitobjekt einer Klasse bezeichnet, wenn sie denselben Namen haben. In diesem Fall hat jeder Zugriff aufprivate
Sichtbarkeitsmethoden des anderen. Diese Methoden werden jedoch nicht automatisch importiert. Sie müssen sie entweder explizit importieren oder ihnen den Klassen- / Objektnamen voranstellen.Zum Beispiel:
quelle
def f(x: X) = ???
, dann können private Methoden aufgerufen werden .x
X
Ein Objekt hat genau eine Instanz (Sie können nicht aufrufen
new MyObject
). Sie können mehrere Instanzen einer Klasse haben.Das Objekt dient denselben (und einigen zusätzlichen) Zwecken wie die statischen Methoden und Felder in Java.
quelle
Definiert, wie von vielen erklärt,
object
eine Singleton-Instanz. Die eine Sache in den Antworten hier, von der ich glaube, dass sie weggelassen wird, ist, dass sieobject
mehreren Zwecken dient.Es kann das Begleitobjekt zu einem
class
/ seintrait
, das statische Methoden oder Convenience-Methoden enthält.Es kann sich ähnlich wie ein Modul verhalten, das verwandte / untergeordnete Typen und Definitionen usw. enthält.
Es kann eine Schnittstelle implementieren, indem ein
class
oder ein oder mehreretrait
s erweitert werden.Es kann einen Fall von a darstellen
sealed trait
, der keine Daten enthält. In dieser Hinsicht wird es oft als korrekter angesehen als acase class
ohne Parameter. Der Sonderfall einessealed trait
mit nurcase object
Implementierern ist mehr oder weniger die Scala-Version einer Aufzählung.Es kann als Beweis für eine
implicit
gesteuerte Logik dienen.Es wird ein Singleton-Typ eingeführt.
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 eine
object
kann viele dieser verschiedenen Verwendungszwecke gleichzeitig erfüllen, was noch verwirrender sein kann.quelle
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 so weitergegeben werden, als wäre es eine Instanz einer Klasse. (Es ist also wie bei den statischen Methoden einer Klasse, aber besser).
quelle
Der formale Unterschied -
Der Unterschied in der Nutzung:
object
. Sie können es mit oder ohne zugehörige Klasse verwenden. Im ersten Fall wird es als Begleitobjekt bezeichnet. Sie müssen:Um ein Programm zu erstellen, sollten Sie die Hauptmethode in
object
und nicht in verwendenclass
.Sie können es auch verwenden, wenn Sie ein Singleton-Objekt in Java verwenden.
quelle
Das Objektschlüsselwort erstellt einen neuen Singleton-Typ, der einer Klasse ähnelt , die nur eine einzige benannte Instanz hat. Wenn Sie mit Java vertraut sind, ähnelt das Deklarieren eines Objekts in Scala dem Erstellen einer neuen Instanz einer anonymen Klasse.
Scala hat keine Entsprechung zum statischen Schlüsselwort von Java , und in Scala wird häufig ein Objekt verwendet, in dem Sie möglicherweise eine Klasse mit statischen Elementen in Java verwenden.
quelle
Objekt ist eine Klasse, aber es hat (ist) bereits eine Instanz, so dass Sie nicht aufrufen können
new ObjectName
. Auf der anderen Seite ist Class nur ein Typ und kann durch Aufrufen eine Instanz seinnew ClassName()
.quelle
In Scala gibt es kein
static
Konzept. Daher erstellt scala ein Singleton-Objekt, um den Einstiegspunkt für Ihre Programmausführung bereitzustellen. Wenn Sie kein Singleton-Objekt erstellen, wird Ihr Code erfolgreich kompiliert, es wird jedoch keine Ausgabe erzeugt. In Singleton Object deklarierte Methoden sind global verfügbar. Ein Singleton-Objekt kann Klassen und Merkmale erweitern.Beispiel für ein Scala Singleton-Objekt
Ausgabe:
Wenn Sie in Scala eine Klasse mit demselben Namen wie ein Singleton-Objekt haben, wird sie als Companion-Klasse und das Singleton-Objekt als Companion-Objekt bezeichnet.
Die Companion-Klasse und ihr Companion-Objekt müssen beide in derselben Quelldatei definiert sein.
Beispiel für ein Scala-Begleitobjekt
Ausgabe:
In Scala kann eine Klasse Folgendes enthalten:
1. Datenelement
2. Mitgliedsmethode
3. Konstruktorblock
4. Verschachtelte Klasse
5. Super Klasseninformationen usw.
Sie müssen alle Instanzvariablen in der Klasse initialisieren. Es gibt keinen Standardbereich. Wenn Sie keinen Zugriffsbereich angeben, ist dieser öffentlich. Es muss ein Objekt geben, in dem die Hauptmethode definiert ist. Es bietet den Ausgangspunkt für Ihr Programm. Hier haben wir ein Beispiel für eine Klasse erstellt.
Scala Beispiel Beispiel einer Klasse
Es tut mir leid, ich bin zu spät, aber ich hoffe, es wird Ihnen helfen.
quelle
Scala-Klasse wie Java-Klasse, aber Scala bietet Ihnen keine Eingabemethode in der Klasse, wie die Hauptmethode in Java. Die Hauptmethode, die dem Objektschlüsselwort zugeordnet ist. Sie können sich das Objektschlüsselwort als das Erstellen eines Singleton-Objekts einer Klasse vorstellen, die implizit definiert ist.
Weitere Informationen Überprüfen Sie dieses Artikelklassen- und Objektschlüsselwort in der Scala-Programmierung
quelle
Das Objekt ähnelt in gewissem Maße der statischen Klasse in Java. Das statische Merkmal bedeutet, dass die statische Klasse beim Einfügen in die JVM kein Objekt erstellen muss. Es kann direkt von ihrem Klassennamen und derselben Instanz (demselben Datenstatus) verwendet werden ) wird überall dort geteilt, wo es verwendet wird.
quelle
Eine Klasse ist wie jede andere Klasse in anderen Sprachen. Sie definieren Klasse wie jede andere Sprache mit einigen Syntaxunterschieden.
Objekt ist jedoch eine Klasse mit nur einem Objekt. Dies macht es interessant, da damit statische Elemente einer Klasse mithilfe eines Begleitobjekts erstellt werden können . Dieses Begleitobjekt hat Zugriff auf private Mitglieder der Klassendefinition und hat denselben Namen wie die von Ihnen definierte Klasse.
Bemerkenswert ist auch, dass die Objektklasse träge erstellt wird, was ein weiterer wichtiger Punkt ist. Diese werden also nur instanziiert, wenn sie in unserem Code benötigt werden.
Wenn Sie die Verbindungserstellung für JDBC definieren, können Sie sie innerhalb eines Objekts erstellen, um Doppelungen zu vermeiden, wie wir es in Java mit Singleton-Objekten tun.
quelle
Wenn Sie aus dem Java-Hintergrund kommen, ähnelt das Konzept der Klasse in Scala Java, aber die Klasse in Scala kann keine statischen Elemente enthalten.
Objekte in Scala sind Singleton-Objekte, die Sie mithilfe des Objektnamens in ihr aufrufen. In Scala ist das Objekt ein Schlüsselwort und in Java-Objekt eine Instanz der Klasse
quelle