AULA 08 MÓDULO 2 herança e interfaces ⏱ 55 min

Herança e Interfaces

extends: herança única com IS-A. implements: contratos múltiplos com CAN-DO. @Override. super(). Consumir API HTTP com HttpClient Java 11+.

extendsimplements@OverridesuperinterfaceHttpClientprotected

Herança — IS-A em Java

Herança modela relações IS-A: Gerente É UM Funcionario. A subclasse herda atributos e métodos da superclasse e pode adicionar e sobrescrever comportamento.

⚠️
herança múltipla não existe em Java
Java não tem herança múltipla de classes — o problema do diamante. A solução são interfaces: você pode implementar quantas quiser.
1
extends Funcionario — Gerente herda nome, cpf e os métodos de Funcionario
2
super(nome, cpf) — Chama o construtor da superclasse — obrigatório antes de usar this
3
@Override — Anota que o método sobrescreve da superclasse. Sem isso, Java não avisa se você errar o nome.
4
protected — Atributos protected: acessíveis na classe e subclasses, mas não fora da hierarquia

Interfaces — CAN-DO

Interface define um contrato: todo implementador garante aquele conjunto de métodos. Permite que objetos não relacionados por herança compartilhem comportamento.

Classe abstrata
É UM tipo de algo.
Pode ter implementação parcial.
Uma só por herança.
Tem estado (atributos).
Interface
É CAPAZ DE algo.
Contrato puro (default methods: exceção).
Várias por classe.
Sem estado.

Consumindo API HTTP com Java

O HttpClient do Java 11+ usa interfaces para modelar requests e responses — é o exemplo mais concreto de contrato real. Vamos consumir uma API de CEP para demonstrar.

🌐
conexão com Redes de Computadores
Você está estudando HTTP, TCP/IP e camadas OSI em Redes 1. HttpClient implementa exatamente essas camadas. request() encapsula toda a comunicação TCP+HTTP — você só define o contrato (URL, método, headers).
java
// Herança em Java
public class Funcionario {
    protected String nome;
    protected String cpf;

    public Funcionario(String nome, String cpf) {
        this.nome=nome; this.cpf=cpf;
    }
    public String toString() { return nome; }
}

public class Gerente extends Funcionario {
    private String departamento;

    public Gerente(String nome, String cpf, String dep) {
        super(nome, cpf); // OBRIGATÓRIO — antes de usar this
        this.departamento = dep;
    }

    @Override
    public String toString() {
        return super.toString() + " [Gerente/" + departamento + "]";
    }
}

// Interface + implementação
public interface Rastreavel {
    String getLocalizacao(); // contrato puro
}

public class Veiculo implements Rastreavel {
    private String placa, lat, lon;
    public String getLocalizacao() { return lat + "," + lon; }
}

// HttpClient — consumir API de CEP (Java 11+)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://viacep.com.br/ws/01001000/json/"))
    .GET()
    .build();

HttpResponse<String> response = client.send(request,
    HttpResponse.BodyHandlers.ofString());

System.out.println(response.statusCode()); // 200
System.out.println(response.body());       // JSON do endereço
quiz · aula 08
Teste seus conhecimentos em Java
0/3 respondidas
QUESTÃO 01
Qual é a diferença entre extends e implements em Java?
QUESTÃO 02
Por que @Override é importante mesmo sendo opcional?
QUESTÃO 03
Interface é mais adequada quando...
0/3