Разница между объектом и классом в Scala - PullRequest
576 голосов
/ 18 ноября 2009

Я просто просматриваю некоторые учебники по Scala в Интернете и заметил, что в некоторых примерах объект объявляется в начале примера.

В чем разница между class и object в Scala?

Ответы [ 13 ]

521 голосов
/ 18 ноября 2009

ТЛ; др

  • class C определяет класс, как в Java или C ++.
  • object O создает singleton объект O как экземпляр некоторого анонимного класса; его можно использовать для хранения статических членов, которые не связаны с экземплярами какого-либо класса.
  • object O extends T делает объект O экземпляром trait T; затем вы можете передать O куда угодно, ожидается T.
  • если существует class C, то object C является сопутствующим объектом класса C; обратите внимание, что объект-компаньон не автоматически является экземпляром C.

Также см. Документацию Scala для объекта и класса .

Использование в качестве хоста статических членов

Чаще всего вам нужен 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 как особый экземпляр класса или черты. Когда вы делаете это, ваш объект должен расширяться на trait, чтобы стать экземпляром его подкласса.

Рассмотрим следующий код:

object A extends B with C {
  ...
}

Это объявление сначала объявляет анонимный (недоступный) класс, который расширяет как B, так и C, и создает экземпляр одного экземпляра этого класса с именем A.

Это означает, что A может быть передано в функции, ожидающие объекты типа B или C, или B with C.

Дополнительные функции object

В Scala также есть некоторые особенности объектов. Рекомендую прочитать официальную документацию .

  • def apply(...) включает обычный синтаксис без имени метода A(...)
  • def unapply(...) позволяет создавать пользовательские сопоставления с шаблоном экстракторы
  • если сопровождает класс с тем же именем, объект принимает на себя особую роль при разрешении неявных параметров
240 голосов
/ 18 ноября 2009

A 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
   }
}
67 голосов
/ 18 ноября 2009

Объект имеет ровно один экземпляр (вы не можете вызвать new MyObject). Вы можете иметь несколько экземпляров класса.

Объект служит теми же (и некоторыми дополнительными) целями как статические методы и поля в Java.

17 голосов
/ 20 января 2015

Как было объяснено многими, object определяет одноэлементный экземпляр. Единственная вещь в ответах здесь, которую я считаю, не учитывается, это то, что object служит нескольким целям.

  • Это может быть сопутствующий объект для class / trait, содержащий то, что можно считать статическими или вспомогательными методами.

  • Он может действовать как модуль, содержащий связанные / вспомогательные типы и определения и т. Д.

  • Он может реализовать интерфейс путем расширения class или одного или нескольких trait с.

  • Может представлять собой случай sealed trait, который не содержит данных. В этом отношении он часто считается более правильным, чем case class без параметров. Особый случай sealed trait с только case object разработчиками - более или менее версия перечисления Scala.

  • Может служить доказательством для implicit -приводной логики.

  • Вводится однотонный тип.

Это очень мощная и общая конструкция. Новичков в Scala может смутить то, что одна и та же конструкция может иметь совершенно разные применения. И object может одновременно обслуживать многие из этих различных применений, что может быть еще более запутанным.

15 голосов
/ 18 ноября 2009

Определение объекта в Scala похоже на определение класса в Java, который имеет только статические методы. Однако в Scala объект может расширять другой суперкласс, реализовывать интерфейсы и передаваться, как если бы он был экземпляром класса. (Так что это как статические методы в классе, но лучше).

12 голосов
/ 17 мая 2014

Формальная разница -

  1. Вы не можете предоставить параметры конструктора для Объектов
  2. Объект не является типом - вы не можете создавать экземпляр с оператором new. Но он может иметь поля, методы, расширять суперкласс и смешивать черты.

Разница в использовании:

  • Scala не имеет статических методов или полей. Вместо этого вы должны использовать object. Вы можете использовать его с или без связанного класса. В первом случае это называется объектом-компаньоном. Ты должен:
    1. использовать одно и то же имя для класса и объекта
    2. поместите их в тот же исходный файл.
  • Для создания программы вы должны использовать метод main в object, а не в class.

    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
    
  • Вы также можете использовать его так же, как и одноэлементный объект в Java.

    1035 *

4 голосов
/ 12 марта 2017

Ключевое слово object создает новый одноэлементный тип, который похож на class , который имеет только один именованный экземпляр. Если вы знакомы с Java, объявление объекта в Scala очень похоже на создание нового экземпляра анонимного класса.

Scala не имеет эквивалента ключевому слову static в Java, а объект часто используется в Scala, где вы можете использовать класс со статическими членами в Java.

2 голосов
/ 01 ноября 2017

В scala нет понятия static. Таким образом, scala создает одноэлементный объект, чтобы обеспечить точку входа для выполнения вашей программы. Если вы не создадите одноэлементный объект, ваш код будет успешно скомпилирован, но не даст никакого вывода. Методы, объявленные внутри Singleton Object, доступны глобально. Одноэлементный объект может расширять классы и признаки.

Пример объекта-одиночки Scala

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

В scala, когда у вас есть класс с тем же именем, что и одноэлементный объект, он называется сопутствующим классом, а одноэлементный объект называется сопутствующим объектом.

Сопутствующий класс и его сопутствующий объект должны быть определены в одном и том же исходном файле.

Пример объекта-компаньона Scala

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. Информация о суперклассе и т. Д.

Вы должны инициализировать все переменные экземпляра в классе. Там нет области по умолчанию. Если вы не укажете область доступа, она будет общедоступной. Должен быть объект, в котором определен основной метод. Это обеспечивает отправную точку для вашей программы. Здесь мы создали пример класса.

Образец Scala Пример класса

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);  
    }  
} 

Извините, я опоздал, но надеюсь, это поможет вам.

2 голосов
/ 09 июня 2017

Объект является классом, но у него уже есть (есть) экземпляр, поэтому вы не можете вызвать new ObjectName. С другой стороны, Class является просто типом и может быть экземпляром, вызывая new ClassName().

1 голос
/ 22 июня 2017

Класс Scala такой же, как класс Java, но scala не дает вам никакого метода ввода в классе, как метод main в java. Основной метод, связанный с ключевым словом объекта. Вы можете думать о ключевом слове объекта как о создании одноэлементного объекта класса, который определен неявно.

больше информации проверить эту статью ключевое слово класса и объекта в scala-программировании

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...