Разница между объектом и классом в Scala

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

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

13 ответов


tl; dr

  • class C определяет класс, как в Java или C++.
  • object O создает синглтон объект O как экземпляр некоторого анонимного класса; его можно использовать для хранения статических членов, которые не связаны с экземплярами некоторого класса.
  • object O extends T делает объект O экземпляр trait T; затем вы можете передать O где угодно, a 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 чтобы стать экземпляром подкласса it.

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

object A extends B with C {
  ...
}

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

это значит A смогите быть передано к функциям ожидая объекты типа B или C или B with C.

дополнительные возможности object

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

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

A class определение, описание. Он определяет тип с точки зрения методов и состава других типов.

An 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
   }
}

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


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

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

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

  • он может реализовать интерфейс, расширяя class или один или несколько traits.

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

  • он может выступать в качестве доказательства implicitприводом логика.

  • он вводит одноэлементный тип.

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


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


формальное различие -

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

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

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

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


        
      


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

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


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


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

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


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

Одноэлементный Объект 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, когда у вас есть класс с тем же именем, что и одноэлементный объект, он называется companion class, а одноэлементный объект называется companion object.

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

Объект 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. Data member

2. Метод элемента

3. Конструктор Блок

4. Вложенный класс

5. Супер класс информация и т. д.

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

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

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


объект равен статическому классу в Java для некоторых расширений, статические характеристики означают, что статическому классу не нужно создавать объект при вводе в JVM, он может использоваться его именем класса напрямую


Если вы исходите из фона java, концепция класса в scala похожа на Java, но класс в scala не может содержать статические члены.

объекты в scala являются одноэлементным типом, который вы вызываете методами внутри него, используя имя объекта, в Scala object-ключевое слово, а в java object-экземпляр класса


класс и объект: класс-это определение, которое описывает все атрибуты сущности или объекта. И object является экземпляром класса.