Classes: são abstrações de objetos do mundo real, que define um tipo de objeto e suas características (atributos) e as ações que o objeto realizam (métodos). As classes especificam a estrutura e o comportamento dos objetos, e os objetos são instâncias de classes. Todos objetos possui: identidade, estado e comportamento.
Instanciação: instanciar uma classe significa criar um novo objeto a partir da estrutura desta classe. Para instanciar com um construtor padrão (sem argumentos) utiliza-se esta sintaxe:
- Atributos: os atributos definem o estado interno de um objeto, ou seja, suas características. Exemplo: carro (cor, modelo, ano). Os atributos de um objeto só podem ser usados/acessados pelo próprio objeto (getters), ou seja, eles devem ser privados (private) ou protegidos (protected). Um atributo poderá ser do tipo protected a classe em que ele está será pai de outra classe (herança). Deve-se evitar o uso de atributos do tipo público (public). Exemplo de declaração de atributos de uma determinada classe:
- Métodos: os métodos de um objeto são as funções que operam sobre este objeto. Exemplo: carro (dirigir, estacionar, parar). O tipo de valor de retornar void indica que o método não possui um retorno. Exemplo de um método:
- Encapsulamento: é o mecanismo utilizado para disponibilizar métodos, protegendo o acesso indevido aos atributos de uma instância (objeto). Por exemplo, a única maneira do objeto Pessoa alterar o valor do atributo saldo do objeto Carteira é acessando os métodos depositar (valor) ou retirar (valor) do objeto Carteira. Eles são declaradas através de métodos getter (para buscar os valores) e setter (para alterar os valores). Exemplo de encapsulamento de uma classe com dois atributos (nome do tipo String e hora do tipo int):
- Construtores: são métodos especiais que são chamados automaticamente quando instâncias são criadas através da palavra new. O código que eles contêm são executados antes de qualquer outro código em outros métodos. Pode haver vários construtores dentro de uma classe, desde que eles não possuam a mesma assinatura, ou seja, é necessário fazer a sobrecarga deles. Exemplo de uma classe com dois construtores, um com todos os parâmetros e outro sem parâmetros:
- Sobrecarga de métodos (overload): utilizando-se a sobrecarga, é possível passar mais ou menos argumentos em um método, contanto que suas assinaturas sejam diferentes. A assinatura de um método é composta de seu nome mais os tipos de argumentos que são passados para este método. Isso é bem útil para se criar métodos com menos argumentos, em situações específicas.
- Sobrescrita de métodos (override): a sobrescrita cria um novo método na classe filha (herança) que contém a mesma assinatura e o mesmo tipo de retorno do método sobrescrito. A anotação @Override é colocada em cima do método que será sobrescrito. Exemplo de sobrescrita de uma interface:
- this: um método pode chamar outro da mesma classe, mas um construtor não pode chamar outro construtor diretamente. Por isso, o Java cria para cada instância uma “autorreferência”, ou seja, uma referência à própria instância, utilizando a palavra this.
- Casting: permite atribuir o valor de um tipo da variável a outro tipo de variável, forçando-o a assumir um formato. Por exemplo, declarando um float com valor de 32.33, é possível fazer um casting e passar este número para inteiro, arredondando-o. Por exemplo, vamos fazer um casting de uma variável do tipo float (vfal) para o tipo int:
- Campos estáticos (static): eles são compartilhados por todas as instâncias de uma determinada classe, ou seja, somente um valor será armazenado em um campo estático. Caso esse valor seja modificado por uma instância desta classe, isso se refletira em todas as outras instancias desta classe. Os campos estáticos são declarados com o modificador static e podem ser utilizados para gerenciar filas e compartilhar constantes que serão usadas por várias instâncias desta classe. Exemplo:
Métodos estáticos (static): estes métodos podem ser chamados sem precisar criar instâncias das classes às quais pertencem. Sua aplicação mais frequente é a criação de bibliotecas de métodos (classe que contém somente métodos estáticos, geralmente agrupados por função). Por exemplo:
Tipo primitivo: é um tipo que não representa classes e que definem de que tipo são as variáveis (int, float, char, …). É recomendado utilizar os tipos primitivos quando se for criar métodos que realizam cálculos matemáticos ou quando não queremos ter atributos nulos (atributo opcional).
Classe Wrapper: é uma classe que representa um tipo primitivo e possui como grande vantagem atribuir valor nulo (atributo opcional). São exemplos desta classe o Integer, Boolean, String, etc. Porém, caso ela não seja utilizada de forma correta, ela poderá gerar uma exceção do tipo NullPointerException. É possível transformar um Wrapper em tipo primitivo (e vice-versa) fazendo um Unboxing/Autoboxing. O Autoboxing é um recurso do compilador Java que faz a conversão entre tipos primitivos de dados e os respectivos objetos cujas classes acondicionam um determinado tipo primitivo (como converter um tipo primitivo int em um objeto cuja classe é Integer). Já o Unboxing, faz o processo inverso do Autoboxing.
Interface: são padrões definidos através de contratos ou especificações. Um contrato é responsável por definir um determinado conjunto de métodos que serão implementados nas classes que assinarem esse contrato. Os métodos dessa classe são sempre definidos como abstract e as variáveis são definidas por padrão como constantes (static final). As classes que implementam uma interface precisam adicionar todos os métodos da interface, ou se transformar em uma classe abstrata. Exemplo de uma interface:
- Classe abstrata: são classes que servem como modelo para outras classes que vão herdá-la e que não podem ser instanciadas. Para criar um objeto que usa uma classe abstrata, é preciso criar uma classe que vai herdar a classe abstrata e sobrescrever os métodos dela. Exemplo de uma classe abstrata:
- equals and hashCode: o hashCode é uma ferramenta da JVM utilizada para montar uma tabela hash (tabela onde as informações são armazenadas conforme um número hash calculado com base nas propriedades da informação) de forma completa. Isso permite que operações de comparação entre elementos seja feito de maneira muito mais rápida. Para isso funcionar, é necessário determinar primeiro a “região” em que um objeto está, que é um espaço dentro de uma coleção onde os objetos ficam agrupados por semelhança, facilitando a busca deles. A ideia da função hash é garantir que somente uma informação esteja em uma determinada “região”, mas isso nem sempre é possível. Quando mais de uma informação acaba chegando em uma mesma “região”, ocorre a chamada colisão da tabela hash. Para resolver o problema da colisão, é criado o método equals, que determina se os objetos de uma “região” são iguais. A ideia deste método é garantir que dois objetos são “significativamente iguais”, ou seja, que eles tenham um valor igual dada as suas propriedades.
Top comments (0)