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

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

В чем разница между class а также object в Скале?

13 ответов

Решение

ТЛ; др

  • class C определяет класс, как в Java или C++.
  • object O создает одноэлементный объект 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(...) позволяет создавать собственные экстракторы сопоставления с образцом
  • если сопровождает класс с тем же именем, объект принимает особую роль при разрешении неявных параметров

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

object is singleton - экземпляр класса, который гарантированно будет уникальным. Для каждого 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). Вы можете иметь несколько экземпляров класса.

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

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

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

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

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

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

  • Это может служить доказательством implicitлогика

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

Класс такой же, как и любой другой класс на других языках. Вы определяете класс, как и любой другой язык, с некоторой разницей в синтаксисе.

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, статические характеристики означают, что статический класс не должен создавать объект при помещении в JVM, он может использоваться непосредственно по имени класса

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

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

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

Объекты в scala относятся к одноэлементному типу, в котором вы вызываете методы, используя имя объекта, в scala объект является ключевым словом, а в java объект является экземпляром класса.

Класс - это план для объектов. Определив класс, вы можете создавать объекты из чертежа класса с ключевым словом new, Через объект вы можете использовать все функциональные возможности определенного класса.

Диаграмма для лучшего объяснения:

диаграмма

import java.io._

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc

   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("Point x location : " + x);
      println ("Point y location : " + y);
   }
}

object Demo {
   def main(args: Array[String]) {
      val pt = new Point(10, 20);

      // Move to a new location
      pt.move(10, 10);
   }
}

Источник

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

Другие вопросы по тегам