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

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

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

+595
источник поделиться
15 ответов

ТЛ; др

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

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
   }
}
+242
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

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

+70
источник

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

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

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

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

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

  • Он может служить доказательством логики implicit -driven.

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

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

+18
источник

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

+17
источник

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

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

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

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

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



+14
источник

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

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

+5
источник

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

+4
источник

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

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

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

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

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
источник

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

Дополнительная информация проверить эту статью ключевое слово class и object в scala программировании

+1
источник

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

0
источник

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

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

0
источник

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

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 с одноэлементными объектами.

0
источник

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

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

diagram

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

Источник

-1
источник

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

-24
источник

Посмотрите другие вопросы по меткам или Задайте вопрос