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?
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.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 .
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.
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.
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(...)
def unapply(...)
können Sie benutzerdefinierte Musteranpassungen erstellen ExtraktorenEin 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
}
}
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.
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 trait
s 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.
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).
Der formale Unterschied -
Der Unterschied in der Nutzung:
object
. Sie können es mit oder ohne verwandte Klasse verwenden. Im ersten Fall wird es als Begleitobjekt bezeichnet. Sie müssen: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.
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.
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.
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.
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
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
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
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.