Java orientado a objetos
Valores e referências, contratos, composição, igualdade, coleções e genéricos.
Programa, tipos e referências
javac Main.javacompila para bytecode;java Mainexecuta na JVM com um JDK. Entrada:public static void main(String[] args).- Primitivos guardam valores; referências guardam referências ou
null. Java passa argumentos por valor: reatribuir um parâmetro não muda a variável do chamador, mas mutar o objeto partilhado é visível. 5 / 2dá2;5 / 2.0dá2.5.bytevai de -128 a 127:b + 1éint,b++converte de volta com possível overflow. Converte paralongantes de somar.finalfixa a variável, não o objeto.staticpertence à classe, semthis.
O construtor fixa os invariantes; cada método conserva-os. Setters públicos que aceitam tudo não são encapsulamento.
Igualdade, hash e exposição
==em referências é identidade;equalsé a igualdade do tipo. Redefineequals(Object), nunca sóequals(Tipo): a sobrecarga falha viaObjecte coleções. Usa@Override.- Iguais têm o mesmo
hashCode; hashes iguais não implicam igualdade. Não mudes campos de igualdade/hash dentro de umHashSetou como chave deMap. - Vista não modificável bloqueia essa vista mas acompanha a origem; cópia defensiva separa a coleção, não os elementos mutáveis. Para um snapshot, copia no construtor e não devolvas a lista interna.
Herança, composição e despacho
- Herança exige cumprir o contrato da base; composição delega a um colaborador e varia sem subclasses. Uma classe estende uma base e implementa várias interfaces.
- Overloading resolve na compilação pelo tipo declarado; overriding resolve em execução pelo objeto. Com
Animal a = new Gato(),visitar(a)escolhevisitar(Animal)ea.falar()usaGato. - Interface funcional tem uma operação abstrata; uma lambda implementa-a.
Coleções e genéricos
| Preciso de | Escolho | Custo e condição |
|---|---|---|
| Sequência com duplicados | List, em geral ArrayList | Índice em tempo constante; meio linear. |
| Unicidade lógica | Set, em geral HashSet | Esperado constante com bom hash; sem garantia de ordem de iteração. |
| Associação por chave | Map | Chave igual substitui o valor. |
| Ordem com unicidade | TreeSet + Comparator | ; comparação zero conta como duplicado. |
TreeSetpor x e depois y preserva(2,1)e(2,9); compara comInteger.compare, nunca por subtração. Campos de ordenação ficam estáveis no conjunto.- Genéricos são invariantes:
List<Integer>não éList<Number>. Origem produz com? extends T, destino recebe com? super T;extendsnão é imutabilidade. Apagamento impedeinstanceof Caixa<Integer>.
static <T> void copiar(java.util.List<? extends T> origem,
java.util.List<? super T> destino) {
for (T valor : origem) destino.add(valor);
}
Com origem List<Integer> com [2, 3] e destino List<Number> com [1.5], copiar dá [1.5, 2, 3]. A origem e o destino partilham T = Integer: o destino aceita inteiros por ser lista de números. Uma List<Double> não serviria de destino, porque não aceita Integer só por ambos serem números.
Exceções
throw lança, throws declara. IOException é verificada; RuntimeException não. Fecha recursos com try-with-resources; o garbage collector não fecha ficheiros.