Estou analisando alguns tutoriais do Scala na Internet e notei em alguns exemplos que um objeto é declarado no início do exemplo.
Qual é a diferença entre class
e object
no Scala?
class C
define uma classe, assim como em Java ou C ++.object O
cria um objeto singletonO
como instância de alguma classe anônima; pode ser usado para armazenar membros estáticos que não estão associados a instâncias de alguma classe.object O extends T
torna o objeto O
uma instância de trait T
; então você pode passar para O
qualquer lugar, umT
é esperado.class C
, então object C
é o objeto complementar da classe C
; observe que o objeto complementar não é automaticamente uma instância de C
.Consulte também a documentação do Scala para objeto e classe .
object
como host de membros estáticosNa maioria das vezes, você precisa object
manter métodos e valores / variáveis que devem estar disponíveis sem precisar instanciar uma instância de alguma classe. Esse uso está intimamente relacionado aos static
membros em Java.
object A {
def twice(i: Int): Int = 2*i
}
Você pode chamar o método acima usando A.twice(2)
.
Se você twice
fosse membro de alguma classe A
, seria necessário primeiro criar uma instância:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
Você pode ver como isso é redundante, pois twice
não requer nenhum dado específico da instância.
object
como uma instância nomeada especialVocê também pode usar o object
próprio como uma instância especial de uma classe ou característica. Quando você faz isso, seu objeto precisa estender um pouco trait
para se tornar uma instância de uma subclasse dele.
Considere o seguinte código:
object A extends B with C {
...
}
Esta declaração primeiro declara uma classe anônima (inacessível) que se estende tanto B
e C
, e instancia uma única instância desta classe chamada A
.
Isso significa que A
pode ser passado para funções que esperam objetos do tipo B
ou C
, ou B with C
.
object
Também existem alguns recursos especiais de objetos no Scala. Eu recomendo ler a documentação oficial .
def apply(...)
ativa a sintaxe usual do método sem nome de A(...)
def unapply(...)
permite criar extratores de correspondência de padrão personalizados
Commerce
classe, mas a JVM e a linguagem Java reconhecerão . (É assim que você pode fazerobject Foo{ def main(args:Seq[String]) }
e esperar que o programa seja executado.)A
class
é uma definição, uma descrição. Ele define um tipo em termos de métodos e composição de outros tipos.An
object
é um singleton - uma instância de uma classe que é garantida como única. Para cadaobject
código, é criada uma classe anônima, que herda de quaisquer classes que você declarouobject
implementar. Essa classe não pode ser vista no código-fonte do Scala - embora você possa entender através da reflexão.Existe uma relação entre
object
eclass
. Diz-se que um objeto é o objeto complementar de uma classe se eles compartilharem o mesmo nome. Quando isso acontece, cada um tem acesso a métodos deprivate
visibilidade no outro. Esses métodos não são importados automaticamente, no entanto. Você precisa importá-los explicitamente ou prefixá-los com o nome da classe / objeto.Por exemplo:
fonte
def f(x: X) = ???
, em seguida, ele poderá chamar métodos particularesx
, da classe complementarX
.Um objeto tem exatamente uma instância (você não pode chamar
new MyObject
). Você pode ter várias instâncias de uma classe.O objeto serve aos mesmos propósitos (e alguns adicionais) dos métodos e campos estáticos em Java.
fonte
Como já foi explicado por muitos,
object
define uma instância singleton. A única coisa nas respostas aqui que acredito ser deixada de fora é queobject
serve a vários propósitos.Pode ser o objeto complementar de um
class
/trait
, contendo o que pode ser considerado métodos estáticos ou métodos de conveniência.Pode agir como um módulo, contendo definições e tipos relacionados / subsidiários, etc.
Ele pode implementar uma interface estendendo um
class
ou um ou maistrait
s.Pode representar um caso de um
sealed trait
que não contém dados. A esse respeito, geralmente é considerado mais correto que umcase class
sem parâmetros. O caso especial de umsealed trait
com apenascase object
implementadores é mais ou menos a versão Scala de um enum.Pode atuar como evidência para a
implicit
lógica orientada.Introduz um tipo singleton.
É uma construção muito poderosa e geral. O que pode ser muito confuso para os iniciantes do Scala é que o mesmo construto pode ter usos muito diferentes. E
object
pode servir para muitos desses diferentes usos ao mesmo tempo, o que pode ser ainda mais confuso.fonte
Definir um objeto no Scala é como definir uma classe em Java que possui apenas métodos estáticos. No entanto, no Scala, um objeto pode estender outra superclasse, implementar interfaces e ser transmitido como se fosse uma instância de uma classe. (Portanto, é como os métodos estáticos em uma classe, mas melhor).
fonte
A diferença formal -
A diferença no uso:
object
. Você pode usá-lo com ou sem classe relacionada. No primeiro caso, é chamado de objeto complementar. Voce tem que:Para criar um programa, você deve usar o método principal em
object
, não emclass
.Você também pode usá-lo como usa o objeto singleton em java.
fonte
A palavra-chave object cria um novo tipo de singleton, que é como uma classe que possui apenas uma única instância nomeada. Se você estiver familiarizado com Java, declarando um objeto no Scala é como criar uma nova instância de uma classe anônima.
Scala não tem equivalente à palavra-chave estática do Java , e um objeto é frequentemente usado no Scala onde você pode usar uma classe com membros estáticos em Java.
fonte
O objeto é uma classe, mas já possui (é) uma instância, portanto você não pode chamar
new ObjectName
. Por outro lado, Class é apenas um tipo e pode ser uma instância chamandonew ClassName()
.fonte
Na Scala, não há
static
conceito. Portanto, o scala cria um objeto singleton para fornecer um ponto de entrada para a execução do seu programa. Se você não criar um objeto singleton, seu código será compilado com êxito, mas não produzirá nenhuma saída. Os métodos declarados dentro do Singleton Object são acessíveis globalmente. Um objeto singleton pode estender classes e características.Exemplo de objeto Scala Singleton
Resultado:
No scala, quando você tem uma classe com o mesmo nome que o objeto singleton, ela é chamada de classe complementar e o objeto singleton é chamado de objeto complementar.
A classe complementar e seu objeto complementar devem ser definidos no mesmo arquivo de origem.
Exemplo de objeto complementar Scala
Resultado:
No scala, uma classe pode conter:
1. Membro dos dados
2. Método membro
3. Bloco Construtor
4. Classe aninhada
5. Informações de classe super etc.
Você deve inicializar todas as variáveis de instância na classe. Não há escopo padrão. Se você não especificar o escopo de acesso, é público. Deve haver um objeto no qual o método principal esteja definido. Ele fornece o ponto de partida para o seu programa. Aqui, criamos um exemplo de classe.
Exemplo de Classe Scala de Classe
Sinto muito, estou muito atrasado, mas espero que ajude você.
fonte
A classe Scala é igual à Java Class, mas o scala não fornece nenhum método de entrada na classe, como o método principal em java. O principal método associado à palavra-chave do objeto. Você pode pensar na palavra-chave do objeto como a criação de um objeto singleton de uma classe definida implicitamente.
Para obter mais informações, consulte este artigo classe e objeto de palavra-chave na programação scala
fonte
O objeto é semelhante à classe estática em Java, até certo ponto, a característica estática significa que a classe estática não precisa criar um objeto ao colocar na JVM, pode ser usada diretamente por seu nome de classe e pela mesma instância (mesmo estado de dados ) é compartilhado onde quer que seja usado.
fonte
Uma classe é como qualquer outra classe em outros idiomas. Você define classe como qualquer outro idioma com alguma diferença de sintaxe.
No entanto, objeto é uma classe apenas com um único objeto. Isso o torna interessante, pois pode ser usado para criar membros estáticos de uma classe usando o objeto complementar . Esse objeto complementar tem acesso a membros particulares da definição de classe e tem o mesmo nome da classe que você está definindo.
Além disso, um ponto digno de nota é que a classe de objetos é criada preguiçosamente, o que é outro ponto importante. Portanto, eles não são instanciados, a menos que sejam necessários em nosso código.
Se você estiver definindo a criação da conexão para JDBC, poderá criá-los dentro do objeto para evitar duplicação, como fazemos em Java com objetos singleton.
fonte
Se você é proveniente de Java, o conceito de classe no scala é semelhante ao Java, mas a classe no scala não pode conter membros estáticos.
Objetos no scala são do tipo singleton, você chama métodos dentro dele usando o nome do objeto, no objeto scala é uma palavra-chave e no objeto java é uma instância da classe
fonte