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

455

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

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

Теги:
class
object

13 ответов

403
Лучший ответ

Коротко

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

Не так кратко

Рассмотрим пример

object A extends B with C {
  def f(x: Any): Any = ???
}

В представлении Scala это объявление

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

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

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

Существуют специальные методы, которые могут быть определены для объектов:

  • def apply(...) позволяет использовать обычный синтаксис без имени A(...)
  • def unapply(...) позволяет создавать настраиваемые шаблоны экстракторы
  • если сопровождается классом с тем же именем, объект принимает особую роль при разрешении неявных параметров
  • 37
    Он также определит класс A и создаст все методы в объекте A как статические методы в классе A (для взаимодействия с Java). (По модулю ошибка в Scala 2.7, которая была исправлена в Scala 2.8)
  • 2
    @KenBloom действительно? Я пробовал и не работает: scala> Commerce res8: Commerce.type = Commerce $ @ 6eb2756 scala> classOf [Commerce] <console>: 23: ошибка: не найдена: введите Commerce classOf [Commerce] ^ scala> new Commerce < консоль>: 23: ошибка: не найдена: введите Commerce new Commerce ^
Показать ещё 4 комментария
223

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
   }
}
  • 1
    Извините, что беспокою вас, но не могли бы вы указать на пример о том, как импортировать методы в объект-компаньон или как их префикс?
  • 4
    @ithkuil Готово. Извините за глупый пример, я не мог придумать хороший и короткий.
Показать ещё 7 комментариев
56

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

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

15

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

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

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

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

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

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

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

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

11

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

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

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

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

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



11

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

2

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

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

1

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

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

1

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

1

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

0

В 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

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

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

Изображение 6054

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

Источник

-21

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

  • 8
    В Java это правда. В Scala не так много, и дело не в этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню