this
e
super
são duas palavras-chave especiais em Java que representam a instância atual de uma classe e sua superclasse, respectivamente. Os programadores Java muitas vezes confundem essas palavras e mostram pouco conhecimento de suas propriedades especiais, que são frequentemente questionadas em entrevistas sobre o Java Core. Por exemplo, algumas perguntas que vêm imediatamente à mente são sobre
this
e
super
: É possível atribuir um significado diferente a uma palavra-chave
this
em Java? e qual é a diferença entre palavras-chave
this
e
super
em Java. Não sabe? Bem, não vou dar a resposta aqui - ela pode ser encontrada no final do artigo.
Então, como eu disse no início, a principal diferença entre
this
e
super
em Java é que
this
a instância atual de uma classe representa, enquanto
super
a instância atual da classe pai representa. Aqui está um exemplo de uso de variáveis
this
e
super
- você provavelmente já viu exemplos de chamada de construtores de um a partir de outro, os chamados. chamar construtores em uma cadeia, isso é possível através do uso de palavras-chave
this
e
super
. Dentro de uma classe, para chamar seu construtor sem argumento, é usado
this()
, enquanto
super()
é usado para chamar o construtor sem argumento, ou como também é chamado, o construtor padrão da classe pai. A propósito, desta forma você pode chamar não apenas um construtor sem argumentos, mas também qualquer outro construtor, passando-lhe os parâmetros apropriados.
this
Veremos um exemplo desse uso em breve
super
. Também em
this
Java
super
eles são usados para acessar variáveis de uma instância de classe e seu pai. Na verdade, elas podem ser acessadas sem os prefixos
super
e
this
, mas somente se no bloco atual tais variáveis não se sobrepuserem a outras variáveis, ou seja, se não contém variáveis locais com os mesmos nomes, caso contrário você terá que usar nomes com prefixos, mas isso não importa, porque nesta forma, eles são ainda mais legíveis. Um exemplo clássico dessa abordagem é usá-la
this
dentro de um construtor que recebe um parâmetro com o mesmo nome da variável de instância. Posteriormente neste artigo, descobriremos quais outras diferenças existem entre
super
e
this
e veremos alguns exemplos de seu uso.
Como isso e super são semelhantes
Antes de examinar as diferenças entre palavras-chave
this
e
super
, vejamos algumas de suas semelhanças:
- Ambos
this
e super
são variáveis não estáticas, portanto não podem ser usadas em um contexto estático, o que significa que não podem ser usadas no método principal. Isso resultará em um erro em tempo de compilação "uma variável não estática this
não pode ser referenciada em um contexto estático". A mesma coisa acontece se você usar a palavra-chave no método principal super
.
- Ambos
this
, e super
podem ser usados dentro de construtores para chamar outros construtores em uma cadeia, por exemplo, this
() e super
() chamam o construtor sem argumentos das classes herdeira e pai, respectivamente.
No exemplo abaixo, primeiro passamos uma chamada de um construtor sem argumento da classe B para um construtor da mesma classe B que recebe um único parâmetro do tipo
String
, que por sua vez
super("")
chama o construtor de um argumento da superclasse.
class A{
A(){
System.out.println("Конструктор без аргументов класса A");
}
A(String args){
System.out.println("Конструктор с одним аргументом класса A");
}
}
class B extends A{
B(){
this("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
Saída: Construtor de um argumento da classe A Construtor de um argumento da classe B Construtor sem argumento da classe B
- Dentro do construtor
this
, e super
deve aparecer acima de todas as outras expressões, logo no início, caso contrário o compilador emitirá uma mensagem de erro. Daí resulta que um construtor não pode conter ambos this()
, e super()
.
Diferenças entre super e isso
Agora sabemos como usar palavras-chave
super
e
this
entender por que elas são necessárias. Mas há outra opção para usar essas palavras-chave que não mencionei - nas classes Inner, onde com a ajuda delas é muito conveniente referir-se a uma classe externa usando a forma de notação Outer.
this
para sua instância atual e Outer.
super
- para seu pai. Não se esqueça de substituir Outer pelo nome da classe externa. Agora vamos listar brevemente as principais diferenças entre palavras-chave
this
e
super
- uma variável
this
refere-se à instância atual da classe na qual é usada, enquanto se super
refere à instância atual da classe pai.
- Cada construtor, na ausência de chamadas explícitas para outros construtores, chama implicitamente
super()
o construtor sem argumento de sua classe pai, mas você sempre tem a opção de chamar explicitamente qualquer outro construtor com this()
, ou super()
.
Provavelmente isso é tudo o que pode ser dito sobre as diferenças entre palavras-chave
this
e
super
em Java e como elas são usadas em programas. Como vimos, seu objetivo principal é chamar um construtor de outro e fazer referência a variáveis de instância declaradas na classe atual e em sua classe pai. Não se esqueça que estas não são exatamente variáveis comuns, e agora - a resposta à minha pergunta, que fiz no primeiro parágrafo. Não, uma variável
this
não pode receber um novo valor porque é declarada final. Você pode tentar fazer isso no IDE - você receberá um erro de compilação "você não pode atribuir um novo valor a uma variável
this
- ela é declarada final".
Artigo original aqui .
GO TO FULL VERSION