Odpowiedzi:
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órCommerce
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żdego object
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
i class
. 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 metod private
widoczności w drugim. Te metody nie są jednak automatycznie importowane. Musisz je zaimportować jawnie lub poprzedzić je nazwą klasy / obiektu.
Na przykład:
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) = ???
, a następnie będzie mógł wywoływać metody prywatne x
klasy towarzyszącej X
.
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.
Jak zostało wyjaśnione przez wielu, object
definiuje instancję singletonu. Jedyną rzeczą w odpowiedziach tutaj, którą moim zdaniem pominięto, jest to, że object
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ęcej trait
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 przypadkiem sealed trait
z tylko case 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.
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óż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 w class
.
object Hello {
def main(args: Array[String]) {
println("Hello, World!")
}
}
Możesz także użyć go, gdy używasz obiektu singleton w Javie.
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.
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łanie new ClassName()
.
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
object Singleton{
def main(args:Array[String]){
SingletonObject.hello() // No need to create object.
}
}
object SingletonObject{
def hello(){
println("Hello, This is Singleton Object")
}
}
Wynik:
Hello, This is Singleton Object
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
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.")
}
}
Wynik:
Hello, this is Companion Class.
And this is Companion Object.
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
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);
}
}
Przepraszam, spóźniłem się, ale mam nadzieję, że ci to pomoże.
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
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.
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.
class Person(val name: String)
val me = new Person("My name")
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.
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()
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.
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