Відповіді:
class C
визначає клас, як і в Java або C ++.object O
створює одиночний об'єкт O
як екземпляр якогось анонімного класу; його можна використовувати для зберігання статичних членів, не пов'язаних із екземплярами якогось класу.object O extends T
робить об'єкт O
примірником trait T
; Ви можете пройти O
куди завгодно, T
очікується.class C
, то object C
є супутнім об'єктом класу C
; зауважте, що супутній об’єкт не є автоматично примірником C
.Також дивіться документацію Scala для об'єкта та класу .
object
як хост статичних членівНайчастіше вам потрібно object
утримувати методи та значення / змінні, які мають бути доступними без необхідності спочатку інстанціювати екземпляр якогось класу. Це використання тісно пов'язане з static
учасниками Java.
object A {
def twice(i: Int): Int = 2*i
}
Потім можна зателефонувати вище за допомогою методу A.twice(2)
.
Якщо ви twice
були членом якогось класу A
, то вам потрібно спочатку зробити екземпляр:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
Ви можете бачити, наскільки це зайве, оскільки twice
не вимагає даних, що стосуються конкретних примірників.
object
як спеціальний названий екземплярВи також можете використовувати object
себе як якийсь спеціальний екземпляр класу чи ознаки. Коли ви робите це, ваш об'єкт повинен розширити деякі trait
, щоб стати екземпляром його підкласу.
Розглянемо наступний код:
object A extends B with C {
...
}
Ця декларація спочатку оголошує анонімний (недоступний) клас, який розширює B
і C
, і інстанціює один екземпляр цього класу з назвою A
.
Це A
може передаватися функціям, що очікують об'єктів типу B
або C
, або B with C
.
object
Також у Scala існують деякі особливості об’єктів. Рекомендую ознайомитися з офіційною документацією .
def apply(...)
дозволяє звичайний метод без імен синтаксис A(...)
def unapply(...)
дозволяє створювати спеціальні екстрактори для відповідних шаблонівCommerce
клас, але JVM та мова Java будуть. (Ось як ви можете це зробити object Foo{ def main(args:Seq[String]) }
та очікуйте запуску програми.)
А class
- це визначення, опис. Він визначає тип з точки зору методів та складу інших типів.
Один object
сингл - екземпляр класу, який гарантовано є унікальним. Для кожного object
в коді створюється анонімний клас, який успадковується від усіх класів, які ви заявили object
про реалізацію. Цей клас не можна побачити з вихідного коду Scala - хоча ви можете отримати його за допомогою відображення.
Існує зв’язок між object
і class
. Об'єкт, як кажуть, є об'єктом-супутником класу, якщо вони мають однакове ім'я. Коли це відбувається, кожен має доступ до методів private
видимості в іншому. Однак ці методи не імпортуються автоматично. Вам або потрібно імпортувати їх явно, або префіксувати їх іменем класу / об'єкта.
Наприклад:
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) = ???
, тоді він буде в змозі викликати приватні методи x
класу-супутника X
.
Як було пояснено багатьма, object
визначає однотонний екземпляр. Єдине, що у відповідях тут є, що я вважаю, що це осторонь, це те, що object
служить декільком цілям.
Він може бути супутниковим об'єктом до class
/ trait
, що містить статичні або зручні методи.
Він може діяти так само, як модуль, містить пов'язані / допоміжні типи та визначення тощо.
Він може реалізувати інтерфейс, розширивши a class
або одну або кілька trait
s.
Він може представляти випадок, sealed trait
що не містить даних. У цьому відношенні його часто вважають правильнішим, ніж case class
параметри без параметра. Особливий випадок sealed trait
із лише case object
реалізаторами - це більш-менш версія Scala enum.
Це може слугувати доказом для implicit
логіки -провідної.
Він вводить однотонний тип.
Це дуже потужна і загальна конструкція. Що може дуже бентежити початківців Scala, це те, що одна і та ж конструкція може мати дуже різні види використання. І object
може служити багатьом із цих різних цілей використання відразу, що може бути ще більше заплутати.
Формальна різниця -
Різниця у використанні:
object
. Ви можете використовувати його з відповідним класом або без нього. У 1-му випадку це називається супутнім об'єктом. Ти мусиш:
Для створення програми слід використовувати основний метод в object
, а не в class
.
object Hello {
def main(args: Array[String]) {
println("Hello, World!")
}
}
Ви також можете використовувати його, коли ви використовуєте одиночний об'єкт у Java.
Об'єкт ключове слово створює новий тип одноплодной, який , як клас , який має тільки один іменований екземпляр. Якщо ви знайомі з Java, оголошення об’єкта в Scala дуже схоже на створення нового екземпляра анонімного класу.
Scala не має еквівалента статичному ключовому слову Java , і об'єкт часто використовується в Scala, де ви можете використовувати клас зі статичними членами на Java.
Об'єкт - це клас, але він вже має (є) екземпляр, тому ви не можете телефонувати new ObjectName
. З іншого боку, Class просто тип, і він може бути екземпляром, зателефонувавши new ClassName()
.
У масштабі static
поняття немає . Таким чином, scala створює одиночний об'єкт, щоб забезпечити точку входу для виконання вашої програми. Якщо ви не створите одиночний об’єкт, ваш код буде складено успішно, але не видасть жодного результату. Методи, оголошені всередині Singleton Object, доступні у всьому світі. Один об'єкт може розширювати класи та ознаки.
Приклад об'єкта 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")
}
}
Вихід:
Hello, This is Singleton Object
У масштабі, коли у вас є клас з тим самим іменем, що й об'єкт Singleton, він називається класом-супутником, а одиночний об'єкт називається об'єктом-супутником.
Клас-супутник та його супутний об'єкт повинні бути визначені в одному вихідному файлі.
Приклад об'єкта 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.")
}
}
Вихід:
Hello, this is Companion Class.
And this is Companion Object.
У системі Scala клас може містити:
1. Член даних
2. Метод члена
3. Блок конструктора
4. Вкладений клас
5. Інформація про суперкласи тощо.
Ви повинні ініціалізувати всі змінні екземпляра в класі. Не існує типової області застосування. Якщо не вказати область доступу, вона є загальнодоступною. Повинно бути об'єкт, у якому визначено основний метод. Це дає вихідну точку для вашої програми. Тут ми створили приклад класу.
Приклад шкали Скала класу
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);
}
}
Мені шкода, я запізнився, але сподіваюся, що це допоможе тобі.
Клас Scala такий же, як Java Class, але scala не дає вам жодного методу введення в клас, як основний метод у java. Основний метод, пов'язаний з ключовим словом об'єкта. Ви можете вважати ключове слово об'єкта як створення однотонного об'єкта класу, який визначається неявно.
Додаткову інформацію перевірити цей клас статті та ключове слово в програмі Scala
Об'єкт певним чином схожий на статичний клас у Java, статична характеристика означає, що статичному класу не потрібно створювати об’єкт при надходженні в JVM, він може використовуватись безпосередньо ім'ям класу та тим самим екземпляром (той самий стан даних ) ділиться скрізь, де він не використовується.
Клас так само, як і будь-який інший клас іншими мовами. Ви визначаєте клас так само, як і будь-яку іншу мову з певною різницею синтаксису.
class Person(val name: String)
val me = new Person("My name")
Однак об'єкт - це клас лише з одним об'єктом. Це робить його цікавим, оскільки його можна використовувати для створення статичних членів класу за допомогою супутнього об’єкта . Цей супутний об’єкт має доступ до приватних членів визначення класу і має те саме ім’я, що і клас, який ви визначаєте.
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()
Також слід зазначити, що клас об'єктів ліниво створюється, що є ще одним важливим моментом. Таким чином, вони не є екземплярами, якщо вони не потрібні в нашому коді.
Якщо ви визначаєте створення з'єднання для JDBC, ви можете створити їх всередині об'єкта, щоб уникнути дублювання так само, як ми робимо в Java з одиночними об'єктами.
Якщо ви надходите з java background, поняття class in scala схоже на Java, але клас у scala cant містить статичні члени.
Об'єкти в scala - це однотонний тип, який ви називаєте методами всередині нього, використовуючи ім'я об'єкта, у scala object - це ключове слово, а в java - об'єкт класу