Como você sabe, uma classe fornece o blueprint para objetos; você cria um objeto de uma classe. Cada uma das seguintes instruções retiradas do programa CreateObjectDemo
cria um objeto e o atribui a uma variável:
A primeira linha cria um objeto do Point
classe, e cada uma das segunda e terceira linhas criam um objeto da classe Rectangle
.
Cada uma dessas instruções tem três partes (discutido em detalhes abaixo):
- Declaração: O código definido em negrito são todas as declarações de variáveis que associam um nome de variável a um tipo de objeto.
- Instanciação: a nova palavra-chave é um operador Java que cria o objeto.
- Inicialização: o novo operador é seguido por uma chamada a um construtor, que inicializa o novo objeto.
Declarando uma variável para referir-se a um objeto
Anteriormente, você aprendeu que para declarar uma variável, você escreve:
type name;
Isso notifica o compilador que você usará name para se referir aos dados cujo tipo é type. Com uma variável primitiva, esta declaração também reserva a quantidade adequada de memória para a variável.
Você também pode declarar uma variável de referência em sua própria linha. Por exemplo:
Point originOne;
Se você declarar originOne
assim, seu valor será ser indeterminado até que um objeto seja realmente criado e atribuído a ele. A simples declaração de uma variável de referência não cria um objeto. Para isso, você precisa usar o operador new
, conforme descrito na próxima seção. Você deve atribuir um objeto a originOne
antes de usá-lo em seu código. Caso contrário, você obterá um erro do compilador.
Uma variável neste estado, que atualmente não faz referência a nenhum objeto, pode ser ilustrada da seguinte forma (o nome da variável, originOne
, além de uma referência apontando para nada):
Instanciando uma classe
O novo operador instancia uma classe alocando memória para um novo objeto e retornando uma referência a essa memória. O novo operador também invoca o construtor do objeto.
O novo operador requer um único argumento postfix: uma chamada para um construtor. O nome do construtor fornece o nome da classe a ser instanciada.
O novo operador retorna uma referência ao objeto que ele criou. Esta referência é geralmente atribuída a uma variável do tipo apropriado, como:
A referência retornada pelo novo operador não tem que ser atribuído a uma variável. Também pode ser usado diretamente em uma expressão. Por exemplo:
int height = new Rectangle().height;
Esta declaração será discutida na próxima seção.
Inicializando um objeto
Aqui está o código para a classe Point:
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; }}
Esta classe contém um único construtor. Você pode reconhecer um construtor porque sua declaração usa o mesmo nome que a classe e não tem tipo de retorno. O construtor na classe Point leva dois argumentos inteiros, conforme declarado pelo código (int a, int b). A instrução a seguir fornece 23 e 94 como valores para esses argumentos:
Point originOne = new Point(23, 94);
O resultado da execução deste declaração pode ser ilustrada na próxima figura:
Aqui está o código para a classe Rectangle, que contém quatro construtores:
Cada construtor permite que você forneça valores iniciais para a origem, largura e altura do retângulo, usando os tipos primitivos e de referência. Se uma classe tem vários construtores, eles devem ter assinaturas diferentes. O compilador Java diferencia t s construtores com base no número e no tipo dos argumentos. Quando o compilador Java encontra o código a seguir, ele sabe como chamar o construtor na classe Rectangle que requer um argumento Point seguido por dois argumentos inteiros:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Isso chama um dos Rectangle
“construtores que inicializa origin
para originOne
. Além disso, o construtor define width
como 100 e height
como 200.Agora, existem duas referências ao mesmo objeto Point – um objeto pode ter várias referências a ele, conforme mostrado na próxima figura:
A linha de código a seguir chama o construtor Rectangle
que requer dois argumentos inteiros, que fornecem o inicial valores de largura e altura. Se você inspecionar o código dentro do construtor, verá que ele cria um novo objeto Point cujos valores xey são inicializados em 0:
Rectangle rectTwo = new Rectangle(50, 100);
O construtor Rectangle usado na instrução a seguir não leva nenhum argumento, então é chamado de construtor sem argumento:
Rectangle rect = new Rectangle();
Todas as classes têm pelo menos um construtor. Se uma classe não declara nenhum explicitamente, o compilador Java fornece automaticamente um construtor sem argumento, chamado de construtor padrão. Este construtor padrão chama o construtor do pai da classe “sem argumento, ou o construtor Object
se a classe não tiver outro pai. Se o pai não tiver nenhum construtor (Object
tiver um), o compilador rejeitará o programa.