1. Criando um objeto

Bem, chegamos à criação de objetos. Você já encontrou isso antes, mas agora analisaremos esse tópico com mais detalhes. Na verdade, é muito fácil criar objetos.

Para criar um objeto, você precisa usar o operador new . A criação de um objeto é mais ou menos assim:

new Class(arguments)

Depois de criar um objeto, geralmente salvamos imediatamente uma referência a ele em uma variável, que geralmente compartilha o mesmo tipo do objeto criado. Isso significa que, ao criar um objeto, você geralmente vê um código como este:

Class name = new Class(arguments)

Onde é a criação de uma nova variável, e o código à direita do sinal de igual é a criação de um novo objeto cujo tipo é .Class nameClass

Exemplos:

Código Observação
Object o = new Object();
Criar um Objectobjeto
Cat pet = new Cat();
Criar um Catobjeto
Scanner console = new Scanner(System.in)
Criar um Scannerobjeto

Os programadores geralmente nomeiam variáveis ​​após suas classes, mas com uma letra minúscula. Para um programador iniciante, esse código pode ser confuso:

Código
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

Não há nada de errado com este código — este é o código mais comum, no qual uma variável é criada e imediatamente inicializada por um objeto do mesmo tipo.

À esquerda do sinal de igual temos a criação de uma variável. À direita, a criação de um objeto. É isso.

2. Construtor

Você provavelmente já viu que alguns argumentos são frequentemente passados ​​ao criar um objeto. Além do mais, os argumentos são passados ​​para alguns objetos, mas não para outros. Como funciona todo esse mecanismo com argumentos?

Aqui também tudo é simples: cada classe tem um método (ou métodos) especial que são responsáveis ​​por tratar os argumentos passados ​​ao criar um objeto. Esses métodos são chamados de construtores . Ou quando estamos falando de apenas um: o construtor .

É fácil distinguir um método construtor de um método regular. Este método tem duas características distintivas:

  • o nome de um construtor é o mesmo que o nome de sua classe (e começa com uma letra maiúscula)
  • um construtor não tem tipo de retorno.

Em geral, aqui está o que geralmente parece:

modifiers Class(arguments)
{
   Code
}

Exemplo:

Código Observação
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Point




Pointconstrutor de classe
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




Crie um objeto da Pointclasse. O construtor da classe será chamado.

Observe a aparência do construtor: ele não tem tipo de retorno e seu nome é igual ao nome da classe.

E mais uma coisa: dê uma olhada no código dentro do construtor. Os parâmetros do construtor têm os mesmos nomes dos campos da classe: x e y. É prática padrão evitar criar novos nomes de parâmetros. Os nomes são os mesmos dos campos da classe. O conflito de nomes é resolvido usando a palavra-chave this.

3. Chamando um construtor

Ao usar o operador new e um comando como "new Class ( argumentos )" para criar um novo objeto, duas coisas acontecem:

  • A máquina Java cria um objeto cujo tipo é Class
  • A máquina Java chama o construtor do objeto e passa seus argumentos

Como programador, você decide quais construtores sua classe deve ter e quais parâmetros esses construtores devem ter.

Suponha que você decida criar uma classe para rastrear gatos em um abrigo de animais. Então sua Catclasse pode ficar assim:

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Whiskers", 2);
isso é permitido
Cat cat = new Cat("Whiskers");
Mas isso não é permitido Este código não será compilado.
Cat cat = new Cat();
E isso não é permitido. Este código não irá compilar.

A Catclasse tem apenas um construtor com os parâmetros name e age. Como não há outros construtores, você deve passar o nome do gato ( name) e a idade ( age) como argumentos ao criar um objeto. Passar argumentos para o construtor não é opcional .

4. Múltiplos construtores

Mas se precisar, você pode adicionar vários construtores à classe. Não há limite para o número de construtores ou seus parâmetros. Quando você cria um objeto, o compilador seleciona automaticamente o construtor que corresponde aos parâmetros

Código Observação
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
Isso é permitido: o primeiro construtor será chamado
Cat cat = new Cat("Whiskers");
Isso é permitido: o segundo construtor será chamado
Cat cat = new Cat();
Mas isso não é permitido Este código não será compilado.

Decidimos levar em conta o fato de que a idade de um gato pode não ser conhecida. Para lidar com esse caso, adicionamos a constante especial UNKNOWNjunto com um construtor que possui apenas um parâmetro — o nome do gato.

Observe que ainda inicializamos ambas as variáveis ​​dentro de ambos os construtores. Substituímos os parâmetros desconhecidos/ausentes pela constante UNKNOWN.

Se nenhum valor for atribuído à variável idade, ela terá o valor padrão de 0. Afinal, um gatinho encontrado na rua pode muito bem ter 0 anos completos. Isso significa que um zero na variável idade não significa necessariamente "idade desconhecida".

5. Construtor padrão

Se você deseja que seus objetos sejam instanciados sem nenhum parâmetro, sua classe precisa declarar um construtor sem argumentos.

Um construtor sem parâmetros não é necessariamente um construtor sem código. Esse construtor pode conter código que inicializa variáveis ​​com valores iniciais:

Código Observação
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   public Cat()
   {
      this.name = "Nameless";
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
Isso é permitido: o primeiro construtor será chamado
Cat cat = new Cat();
Isso é permitido: o segundo construtor será chamado

Construtor padrão

Há um ponto muito importante que você deve saber e lembrar.

Se sua classe não declarar um construtor , o compilador adicionará um construtor padrão, que é um construtor sem argumentos com o modificador público.

Mas se sua classe declarar pelo menos um construtor , nenhum construtor padrão será adicionado e você precisará adicioná-lo você mesmo, se desejar.

Código Observação
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
Isso é permitido: o construtor padrão será chamado