Właśnie przeglądam kilka samouczków Scali w Internecie i zauważyłem w niektórych przykładach, że obiekt został zadeklarowany na początku przykładu.
Jaka jest różnica między class
i object
w Scala?
class C
definiuje klasę, tak jak w Javie lub C ++.object O
tworzy obiekt singletonuO
jako instancję jakiejś anonimowej klasy; może być używany do przechowywania elementów statycznych, które nie są powiązane z instancjami niektórych klas.object O extends T
czyni obiekt O
przykładem trait T
; następnie możesz przejść O
gdziekolwiek, T
oczekuje się.class C
, to object C
jest to obiekt towarzyszący klasy C
; zwróć uwagę, że obiekt towarzyszący nie jest automatycznie instancją C
.Zobacz także dokumentację Scali dla obiektu i klasy .
object
jako host członków statycznychNajczęściej potrzebujesz object
metody i wartości / zmiennych, które powinny być dostępne bez konieczności tworzenia instancji jakiejś klasy. To użycie jest ściśle związane z static
członkami w Javie.
object A {
def twice(i: Int): Int = 2*i
}
Następnie możesz wywołać powyższą metodę za pomocą A.twice(2)
.
Gdyby twice
był członkiem jakiejś klasy A
, najpierw musiałbyś utworzyć instancję:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
Możesz zobaczyć, jak to jest zbędne, ponieważ twice
nie wymaga żadnych danych specyficznych dla instancji.
object
jako specjalne nazwane wystąpienieMożesz także użyć object
siebie jako specjalnego wystąpienia klasy lub cechy. Kiedy to zrobisz, twój obiekt musi rozszerzyć część trait
, aby stać się instancją jego podklasy.
Rozważ następujący kod:
object A extends B with C {
...
}
Ta deklaracja pierwszy deklaruje anonimowy (niedostępne), który rozciąga się zarówno klasę B
i C
oraz instancję jedno wystąpienie tej klasy o nazwie A
.
Oznacza to, że A
można przekazać funkcje oczekujące obiektów typu B
lub C
, lub B with C
.
object
Istnieją również specjalne cechy obiektów w Scali. Polecam przeczytać oficjalną dokumentację .
def apply(...)
włącza zwykłą składnię bez nazwy metody A(...)
def unapply(...)
pozwala na tworzenie niestandardowych ekstraktorów dopasowujących wzór
Commerce
klasy, ale JVM i język Java to zrobią. (Tak możesz zrobićobject Foo{ def main(args:Seq[String]) }
i oczekiwać, że program się uruchomi.)A
class
jest definicją, opisem. Definiuje typ pod względem metod i składu innych typów.An
object
jest singletonem - wystąpieniem klasy, która gwarantuje wyjątkowość. Dla każdegoobject
w kodzie tworzona jest anonimowa klasa, która dziedziczy po wszystkich klasach, które zadeklarowałeśobject
do zaimplementowania. Tej klasy nie można zobaczyć z kodu źródłowego Scali - choć można do niej dojść poprzez refleksję.Istnieje związek między
object
iclass
. Mówi się, że obiekt jest obiektem towarzyszącym klasy, jeśli mają tę samą nazwę. Kiedy tak się dzieje, każdy ma dostęp do metodprivate
widoczności w drugim. Te metody nie są jednak automatycznie importowane. Musisz je zaimportować jawnie lub poprzedzić je nazwą klasy / obiektu.Na przykład:
źródło
def f(x: X) = ???
, a następnie będzie mógł wywoływać metody prywatnex
klasy towarzyszącejX
.Obiekt ma dokładnie jedną instancję (nie można wywołać
new MyObject
). Możesz mieć wiele instancji klasy.Obiekt służy tym samym (i niektórym dodatkowym) celom, jak metody statyczne i pola w Javie.
źródło
Jak zostało wyjaśnione przez wielu,
object
definiuje instancję singletonu. Jedyną rzeczą w odpowiedziach tutaj, którą moim zdaniem pominięto, jest to, żeobject
służy ona kilku celom.Może to być obiekt towarzyszący do
class
/trait
, zawierający coś, co można uznać za metody statyczne lub metody wygody.Może działać podobnie jak moduł, zawierający pokrewne / pomocnicze typy i definicje itp.
Może implementować interfejs poprzez rozszerzenie
class
jednego lub więcejtrait
s.Może reprezentować przypadek,
sealed trait
który nie zawiera danych. Pod tym względem często uważa się to za bardziej poprawne niżcase class
bez parametrów. Szczególnym przypadkiemsealed trait
z tylkocase object
implementatorami jest mniej więcej wersja wyliczenia Scala.Może działać jako dowód na
implicit
logikę napędzaną.Wprowadza typ singletonu.
To bardzo mocna i ogólna konstrukcja. To, co może być bardzo mylące dla początkujących Scali, to fakt, że ten sam konstrukt może mieć bardzo różne zastosowania. I
object
może służyć jednocześnie wielu z tych różnych zastosowań, co może być jeszcze bardziej mylące.źródło
Definiowanie obiektu w Scali jest jak definiowanie klasy w Javie, która ma tylko metody statyczne. Jednak w Scali obiekt może rozszerzać kolejną nadklasę, implementować interfejsy i być przekazywany tak, jakby był instancją klasy. (Więc to jest jak metody statyczne w klasie, ale lepiej).
źródło
Różnica formalna -
Różnica w użyciu:
object
. Możesz go używać z pokrewną klasą lub bez niej. W pierwszym przypadku nazywa się to obiektem towarzyszącym. Musisz:Aby utworzyć program, powinieneś użyć metody głównej w
object
, a nie wclass
.Możesz także użyć go, gdy używasz obiektu singleton w Javie.
źródło
Obiekt kluczowe tworzy nowy typ Singleton, który jest jak klasy , który ma tylko jedno wystąpienie nazwane. Jeśli znasz Javę, zadeklarowanie obiektu w Scali przypomina tworzenie nowej instancji anonimowej klasy.
Scala nie ma odpowiednika statycznego słowa kluczowego Java , a obiekt jest często używany w Scali, gdzie można użyć klasy z elementami statycznymi w Javie.
źródło
Obiekt jest klasą, ale ma już (jest) instancję, więc nie można wywoływać
new ObjectName
. Z drugiej strony, klasa jest po prostu typem i może być instancją przez wywołanienew ClassName()
.źródło
W scali nie ma
static
pojęcia. Tak więc scala tworzy obiekt singleton, który zapewnia punkt wejścia do wykonania programu. Jeśli nie utworzysz obiektu singleton, kod zostanie pomyślnie skompilowany, ale nie wygeneruje żadnych danych wyjściowych. Metody zadeklarowane w obiekcie Singleton są dostępne globalnie. Obiekt singleton może rozszerzać klasy i cechy.Przykład obiektu Scala Singleton
Wynik:
W scali, gdy masz klasę o tej samej nazwie co obiekt singletonu, nazywa się to klasą towarzyszącą, a obiekt singletonu nazywa się obiektem towarzyszącym.
Klasa towarzysząca i jej obiekt towarzyszący muszą być zdefiniowane w tym samym pliku źródłowym.
Przykład obiektu Scala Companion
Wynik:
W scali klasa może zawierać:
1. Członek danych
2. Metoda członka
3. Blok konstruktora
4. Klasa zagnieżdżona
5. Informacje o superklasie itp.
Musisz zainicjować wszystkie zmienne instancji w klasie. Nie ma domyślnego zakresu. Jeśli nie określisz zakresu dostępu, jest on publiczny. Musi istnieć obiekt, w którym zdefiniowana jest metoda główna. Stanowi punkt wyjścia dla twojego programu. Tutaj stworzyliśmy przykład klasy.
Przykład Scali Przykład klasy
Przepraszam, spóźniłem się, ale mam nadzieję, że ci to pomoże.
źródło
Klasa Scala taka sama jak klasa Java, ale scala nie daje żadnej metody wprowadzania w klasie, takiej jak metoda główna w java. Główna metoda związana ze słowem kluczowym object. Możesz myśleć o słowie kluczowym object jako o utworzeniu obiektu singleton klasy, która jest zdefiniowana niejawnie.
więcej informacji sprawdź tę klasę i słowo kluczowe obiektu w programowaniu scala
źródło
Obiekt jest w pewnym stopniu podobny do klasy statycznej w Javie, charakterystyka statyczna oznacza, że klasa statyczna nie musi tworzyć obiektu podczas wstawiania do JVM, może być używana przez nazwę swojej klasy bezpośrednio i to samo wystąpienie (ten sam stan danych ) jest udostępniany wszędzie tam, gdzie jest używany.
źródło
Klasa jest jak każda inna klasa w innych językach. Definiujesz klasę jak każdy inny język z pewną różnicą składni.
Jednak obiekt jest klasą zawierającą tylko jeden obiekt. To sprawia, że jest interesujący, ponieważ można go używać do tworzenia statycznych elementów klasy za pomocą obiektu towarzyszącego . Ten obiekt towarzyszący ma dostęp do prywatnych członków definicji klasy i ma taką samą nazwę jak klasa, którą definiujesz.
Warto również zauważyć, że leniwie tworzona jest klasa obiektów, co jest kolejnym ważnym punktem. Nie są one zatem tworzone, chyba że są potrzebne w naszym kodzie.
Jeśli definiujesz tworzenie połączeń dla JDBC, możesz utworzyć je wewnątrz obiektu, aby uniknąć duplikacji, tak jak robimy to w Javie z obiektami singletonowymi.
źródło
Jeśli pochodzisz z java, pojęcie klasy w scali jest trochę podobne do Javy, ale klasa w scala nie może zawierać elementów statycznych.
Obiekty w scala są typu singleton, który wywołujesz metody wewnątrz niej za pomocą nazwy obiektu, w scala obiekt jest słowem kluczowym, a w obiekcie Java jest instancją klasy
źródło