Я просто просматриваю несколько обучающих программ Scala в Интернете и заметил в некоторых примерах, что объект объявлен в начале примера.
В чем разница между class
и object
в Scala?
Вы можете думать о ключевом слове 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(...)
позволяет создавать настраиваемые шаблоны экстракторы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
). У вас может быть несколько экземпляров класса.
Объект служит тот же (и некоторые дополнительные) цели как статические методы и поля в Java.
Как было объяснено многими, object
определяет экземпляр singleton. Единственное, что в ответах здесь, я считаю, не учтено в том, что object
выполняет несколько целей.
Это может быть объект-компаньон для class
/trait
, содержащий то, что может считаться статическими методами или удобными методами.
Он может действовать как модуль, содержащий связанные/вспомогательные типы и определения и т.д.
Он может реализовать интерфейс, расширив class
или один или несколько trait
s.
Он может представлять собой случай sealed trait
, который не содержит данных. В этом отношении он часто считается более правильным, чем a case class
без параметров. Частный случай sealed trait
с только конструкторами case object
является более или менее версией Scala перечисления.
Он может служить доказательством логики implicit
-driven.
Он вводит одноэлементный тип.
Это очень мощная и общая конструкция. Что может быть очень запутанным для новичков Scala, так это то, что одна и та же конструкция может иметь совершенно разные виды использования. И object
может обслуживать многие из этих разных применений одновременно, что может быть еще более запутанным.
Формальное различие -
Разница в использовании:
object
. Вы можете использовать его с классом или без него. В первом случае он назывался сопутствующим объектом. Вы должны:
Чтобы создать программу, вы должны использовать основной метод в object
, а не class
.
object Hello {
def main(args: Array[String]) {
println("Hello, World!")
}
}
Вы также можете использовать его при использовании объекта singleton в java.
Определение объекта в Scala похоже на определение класса в Java, который имеет только статические методы. Тем не менее, в Scala объект может расширять другой суперкласс, реализовывать интерфейсы и передаваться, как если бы это был экземпляр класса. (Это похоже на статические методы в классе, но лучше).
Ключевое слово объекта создает новый одноэлементный тип, который похож на класс, который имеет только один именованный экземпляр. Если вы знакомы с Java, объявление объекта в Scala очень похоже на создание нового экземпляра анонимного класса.
Scala не имеет эквивалента статическому ключевому слову Javas, а объект часто используется в Scala, где вы можете использовать класс со статическими членами в Java.
Scala класс такой же, как Java Class, но scala не дает вам никакого метода ввода в классе, как основной метод в java. Основной метод, связанный с ключевым словом объекта. Вы можете думать о ключевом слове object как создании одноэлементного объекта класса, который определен неявно.
Дополнительная информация проверить эту статью ключевое слово class и object в scala программировании
Объект - это класс, но у него уже есть экземпляр, поэтому вы не можете вызвать new ObjectName
. С другой стороны, Класс является просто типом, и он может быть экземпляром, вызывая new ClassName()
.
Объект равен статическому классу в Java до некоторого расширения, статические характеристики означают, что статический класс не должен создавать объект при вводе в JVM, он может быть использован им непосредственно именем класса
В 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);
}
}
Прошу прощения, я слишком поздно, но надеюсь, что это поможет вам.
Класс - это проект для объектов. После определения класса вы можете создавать объекты из плана класса с ключевым словом 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);
}
}
Класс и объект: класс - это определение, описывающее все атрибуты объекта или объекта. И объект является экземпляром класса.