JavaRush /Blogue Java /Random-PT /Diferença entre esta e super palavras-chave em Java
grishin
Nível 27
Харьков

Diferença entre esta e super palavras-chave em Java

Publicado no grupo Random-PT
thise supersã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 thise super: É possível atribuir um significado diferente a uma palavra-chave thisem Java? e qual é a diferença entre palavras-chave thise superem Java. Não sabe? Bem, não vou dar a resposta aqui - ela pode ser encontrada no final do artigo. Diferença entre esta e super palavras-chave em Java - 1Então, como eu disse no início, a principal diferença entre thise superem Java é que thisa instância atual de uma classe representa, enquanto supera 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 thise 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. thisVeremos um exemplo desse uso em breve super. Também em thisJava supereles 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 supere 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 thisdentro 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 supere thise veremos alguns exemplos de seu uso.

Como isso e super são semelhantes

Antes de examinar as diferenças entre palavras-chave thise super, vejamos algumas de suas semelhanças:
  1. Ambos thise supersã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 thisnão pode ser referenciada em um contexto estático". A mesma coisa acontece se você usar a palavra-chave no método principal super.

  2. Ambos this, e superpodem 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(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        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
  1. Dentro do construtor this, e superdeve 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 supere thisentender 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. thispara 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 thisesuper
  1. uma variável thisrefere-se à instância atual da classe na qual é usada, enquanto se superrefere à instância atual da classe pai.

  2. 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 thise superem 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 thisnã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 .
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION