JavaRush /Blogue Java /Random-PT /Diferenças entre construtores e métodos comuns.
fog
Nível 18

Diferenças entre construtores e métodos comuns.

Publicado no grupo Random-PT
Um construtor é um método especial destinado a definir inicialmente os valores dos campos de um objeto. À primeira vista, os construtores de objetos não diferem muito dos métodos de objetos comuns. E, de fato, dentro do construtor podemos fazer tudo o que podemos fazer em métodos de objetos regulares: enviar texto para o console, acessar todos os campos e métodos do novo objeto, lançar exceções e assim por diante. Assim como os métodos regulares, os construtores podem ter argumentos. Assim como os métodos sobrecarregados, pode haver vários construtores com assinaturas diferentes. Assim como os métodos genéricos, os construtores podem ser parametrizados por variáveis ​​de tipo. Mesmo se olharmos para o bytecode gerado pelo compilador, no local onde deveria haver uma chamada ao construtor, encontraremos uma chamada para algum método cujo nome a chamada não difere da chamada para outros métodos <init>de o objeto. E tendo encontrado o bytecode deste método, descobriremos que ele contém o resultado da compilação do nosso construtor. Parece que não existem muitas diferenças em relação aos métodos convencionais, mas existem e são bastante significativas. Primeiro, vamos descobrir por que realmente precisamos de construtores? Para armazenar e processar quaisquer dados, sejam tipos primitivos, arrays ou objetos, precisamos de uma certa quantidade de memória. Podem ser registros do processador, espaço de pilha ou um pedaço de espaço alocado na seção de dados do processo ou em uma parte da memória alocada dinamicamente (heap). Em muitas linguagens de programação, para fins de aceleração, quando um programa solicita um novo pedaço de memória, a memória foi dada ao programa não limpa e pode conter dados arbitrários que foram armazenados anteriormente nesta célula de memória. Preparar e escrever os valores necessários em tal pedaço de memória para que no final houvesse alguma estrutura de dados significativa caiu inteiramente sobre os ombros do programador. Naturalmente, os programadores queriam facilitar suas vidas e escreveram rotinas para inicializar (ou seja, definir valores iniciais) para estruturas de dados usadas com frequência. Tais rotinas eram usadas quase constantemente, então os criadores da linguagem Java decidiram tornar tais rotinas de inicialização obrigatórias para serem chamadas ao criar objetos e as chamaram de construtores . Quando um novo objeto é criado em Java, acontece o seguinte: Primeiro, o gerenciador de memória Java aloca a quantidade de memória necessária para acomodar o objeto. Neste caso, são levados em consideração não apenas os campos declarados diretamente na classe do objeto criado, mas também os campos declarados em todos os ancestrais desta classe. Além disso, este volume inclui espaço para colocação de estruturas que são utilizadas pela máquina Java para necessidades internas. Todos os campos desse “espaço em branco” são automaticamente definidos com valores padrão - nullpara tipos de referência, 0para números e falseparaboolean. Depois disso, é chamado automaticamente o construtor da classe, cuja tarefa é definir os valores iniciais dos campos do objeto. Embora em um método normal a primeira instrução possa ser qualquer coisa, o construtor tem muito menos liberdade. A primeira instrução de um construtor deve ser uma chamada explícita para outro construtor da mesma classe ou uma chamada explícita ou implícita para um construtor de uma classe pai. Chamadas explícitas para construtores da mesma classe são feitas usando uma palavra-chave thisseguida por um conjunto de argumentos entre parênteses. Chamar explicitamente o construtor de uma classe pai é feito exatamente da mesma maneira, mas a palavra-chave é usada super. Nos argumentos de uma chamada explícita ao construtor da mesma classe ou classe pai, não é possível acessar os campos e métodos do objeto, bem como utilizar as palavras-chave thise super, pois uma chamada explícita ao construtor introduz um contexto estático. Para chamar implicitamente o construtor de uma classe pai, você não precisa escrever nada, mas o construtor padrão é chamado implicitamente, que deve existir e estar visível para a classe atual. Ao mesmo tempo, deve-se ter em mente que se a cadeia de chamada dos construtores pais for interrompida antes que o construtor da classe Objectlocalizado no topo da cadeia conclua seu trabalho com sucesso, então o objeto não será finalizável, ou seja, o método finalize()de tal objeto nunca será chamado. Após a conclusão do construtor da classe pai, o controle é transferido implicitamente para os blocos inicializadores de instância e inicializadores de campo de instância da classe atual. Os inicializadores são executados na ordem em que aparecem no texto do programa. Somente depois que os inicializadores concluírem seu trabalho o controle será transferido para o restante do construtor. Os demais recursos dos construtores estão relacionados ao modelo de memória Java. Se uma classe, ou um de seus ancestrais, substituir o método finalize(), então a conclusão do construtor acontecerá antes ( acontece antes ) da execução do método finalize(). Se algum thread viu uma referência a um objeto após a conclusão do construtor, é garantido que esse thread verá os finalcampos inicializados corretamente do objeto, cuja inicialização ocorreu antes da conclusão do construtor.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION