Orientação a objetos, programação funcional, Java e Python
Do zero
Um paradigma é um jeito de pensar o programa. Os dois que o edital cobra são:
- Orientação a objetos: o programa é um conjunto de objetos que guardam dados e sabem fazer coisas. Pense numa classe como a planta de uma casa e num objeto como cada casa construída a partir dela. A planta “Contrato” diz que todo contrato tem número, valor e fornecedor, e que todo contrato sabe se reajustar. Cada contrato real é um objeto dessa classe.
- Programação funcional: o programa é uma combinação de funções que recebem dados e devolvem resultados, sem alterar nada por fora. Pense numa calculadora: a mesma conta sempre dá o mesmo resultado e não muda nada no mundo. Em vez de “pegue a lista e vá alterando”, diz-se “a partir desta lista, gere outra com os valores reajustados”.
Os quatro pilares da orientação a objetos, com o exemplo do contrato:
- Encapsulamento: o valor do contrato fica protegido dentro do objeto; ninguém muda direto, só por um método que confere as regras.
- Herança: “Contrato de TI” é um tipo de “Contrato”, herda tudo dele e acrescenta o que é seu.
- Polimorfismo: todo contrato sabe “calcular a multa”, mas cada tipo calcula do seu jeito; quem chama não precisa saber qual é o tipo.
- Abstração: o modelo guarda só o que importa ao sistema (número, valor), não tudo o que existe no mundo real.
Java e Python são as duas linguagens do edital. Java é compilada para bytecode, que roda na JVM (máquina virtual Java), e tem tipos declarados (int, String). Python é interpretada, com tipos dinâmicos e sintaxe enxuta; o edital a cita para automação e back-end.
Frase para guardar: classe é a planta, objeto é a casa; encapsular protege, herdar reaproveita, polimorfismo deixa cada um fazer do seu jeito; funcional é transformar sem alterar.
Em 1 minuto
- Sobrecarga (overloading): mesmo nome de método, parâmetros diferentes, na mesma classe; resolvida na compilação. Sobrescrita (overriding): a subclasse redefine um método herdado; resolvida em tempo de execução. A sobrescrita é a base do polimorfismo.
- Classe abstrata não pode ser instanciada; pode ter atributos de instância, construtor e métodos com e sem corpo. Interface define um contrato de métodos; desde o Java 8, pode ter também métodos
defaultestaticcom corpo, mas não guarda estado de instância (só constantes). Em Java, uma classe herda (extends) de uma só classe, mas implementa (implements) várias interfaces. - Modificadores de acesso em Java:
private(só a classe), sem modificador (o pacote),protected(o pacote e as subclasses) epublic(todos). - Funcional: funções puras (mesma entrada, mesma saída, sem efeito colateral), imutabilidade, funções como valores (de ordem superior), e as operações map (transforma cada item), filter (escolhe itens) e reduce (combina tudo num valor).
- Em Java: expressões lambda e a API de Streams (desde o Java 8). Em Python:
lambda,map,filter, compreensões de lista efunctools.reduce. - Python para automação: scripts que leem arquivos e planilhas, chamam APIs e agendam tarefas; para back-end, frameworks como Django, Flask e FastAPI.
Exemplo concreto: o contrato nas duas linguagens
Em Java, com encapsulamento, herança e sobrescrita:
// Contrato.java
public class Contrato {
private double valor; // encapsulado: só a classe acessa
public Contrato(double valor) { this.valor = valor; }
public double getValor() { return valor; }
public void reajustar(double percentual) {
if (percentual < 0) throw new IllegalArgumentException("Reajuste negativo");
valor = valor * (1 + percentual / 100);
}
public double multa() { return valor * 0.02; }
}
// ContratoTI.java
public class ContratoTI extends Contrato { // herança
public ContratoTI(double valor) { super(valor); }
@Override
public double multa() { return getValor() * 0.05; } // sobrescrita
}
// Num método de outra classe:
Contrato c = new ContratoTI(1000);
System.out.println(c.multa()); // 50.0: polimorfismo, vale o método de ContratoTI
A variável c é do tipo Contrato, mas o objeto é um ContratoTI. Em tempo de execução, o Java chama a multa() do objeto real. Isso é polimorfismo.
Em Python, o mesmo reajuste no estilo funcional, sem alterar a lista original:
from functools import reduce
valores = [1000, 2500, 400]
reajustados = list(map(lambda v: v * 1.05, valores)) # [1050.0, 2625.0, 420.0]
acima_de_mil = [v for v in reajustados if v > 1000] # [1050.0, 2625.0]
total = reduce(lambda a, b: a + b, acima_de_mil) # 3675.0
valores continua igual: cada passo cria um resultado novo. O map transforma, o filtro (aqui, uma compreensão de lista) escolhe, e o reduce junta.
Comparação: os paradigmas e as linguagens
| Orientação a objetos | Funcional | |
|---|---|---|
| Unidade | Objeto (dados e comportamento juntos) | Função (transforma entradas em saídas) |
| Estado | Objetos guardam e mudam o próprio estado | Evita estado mutável (imutabilidade) |
| Reuso | Herança e composição | Composição de funções |
| Efeitos colaterais | Comuns (métodos alteram atributos) | Evitados (funções puras) |
| Exemplo | contrato.reajustar(5) |
map(reajustar, contratos) |
| Java | Python | |
|---|---|---|
| Execução | Compilado para bytecode, roda na JVM | Interpretado (o CPython também gera bytecode) |
| Tipagem | Estática: o tipo é declarado e conferido na compilação | Dinâmica: o tipo é do valor, conferido em execução |
| Blocos | Chaves e ponto e vírgula | Indentação |
| Herança múltipla de classes | Não (só de interfaces) | Sim |
| Uso no edital | Conceitos básicos | Automação e back-end |
| Exemplo de “olá” | System.out.println("Olá"); |
print("Olá") |
| Conceito | Em Java | Em Python |
|---|---|---|
| Construtor | Bloco com o nome da classe, sem tipo de retorno (não é um método) | __init__ (inicializa o objeto já criado) |
| Referência ao próprio objeto | this |
self (primeiro parâmetro explícito) |
| Herança | class B extends A |
class B(A): |
| Atributo “privado” | private (garantido pelo compilador) |
Convenção do sublinhado (_valor) |
| Função anônima | x -> x * 2 |
lambda x: x * 2 |
Como a FCC cobra
Os pilares da orientação a objetos num trecho de código (encapsulamento, herança, polimorfismo), sobrecarga × sobrescrita, classe abstrata × interface, e a saída de pequenos programas em Java ou Python.
- Modificadores de acesso do Java.
- Características da programação funcional (funções puras, imutabilidade, map, filter, reduce).
- Tipagem estática × dinâmica.
- Python: listas, dicionários, laços, compreensões de lista e funções.
Pegadinhas
- “Sobrecarga e sobrescrita são a mesma coisa.” Falso: sobrecarga é o mesmo nome com parâmetros diferentes; sobrescrita é a subclasse redefinir um método herdado.
- “Em Java, uma classe pode estender várias classes.” Falso: estende uma só; pode implementar várias interfaces.
- “Classe abstrata pode ser instanciada com new.” Falso: só suas subclasses concretas podem.
- “Python é uma linguagem sem tipos.” Falso: tem tipos, mas a tipagem é dinâmica (o tipo é do valor, não da variável).
- “Função pura pode alterar uma variável global, desde que devolva o resultado certo.” Falso: função pura não tem efeito colateral.
- “O membro protected do Java só é visível nas subclasses.” Falso: é visível nas subclasses e também em todo o pacote.
Explique com suas palavras
Explique a um colega o que é polimorfismo, usando o exemplo de contratos com multas diferentes, e diga o que muda quando se faz o mesmo cálculo no estilo funcional.
- Escreva sem olhar a lição, com frases curtas e um exemplo seu.
- Onde travar ou precisar de jargão, há uma lacuna: releia só essa parte.
- Compare com a explicação-modelo e reescreva o que faltou.
Fica salva neste navegador.
Comparar com uma explicação-modelo
Polimorfismo é poder tratar coisas diferentes do mesmo jeito. Todo contrato sabe calcular a sua multa, mas o contrato comum cobra 2% e o de TI cobra 5%. O sistema pode ter uma lista de contratos de vários tipos e pedir a cada um “calcule a sua multa”; cada um responde do seu jeito, sem que o sistema precise perguntar o tipo antes.
No estilo funcional, em vez de objetos que guardam e mudam o próprio valor, há funções que recebem um valor e devolvem outro, sem mexer no original. Para reajustar todos os contratos, eu não altero a lista: gero uma lista nova, com cada valor reajustado. Fica mais fácil testar, porque a mesma entrada sempre dá a mesma saída.
Teste-se
Desenvolvimento de Sistemas · POO, funcional, Java e Python · Inédita, estilo FCC
Questão 1 de 3
Em orientação a objetos, quando uma subclasse redefine um método herdado da superclasse, mantendo o mesmo nome e os mesmos parâmetros, para que ele tenha outro comportamento, ocorre
A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.
Toque longo numa alternativa para riscá-la.
Desenvolvimento de Sistemas · POO, funcional, Java e Python · Inédita, estilo FCC
Questão 2 de 3
Em Java, a classe Contrato tem o método multa(), que devolve 2% do valor. A classe ContratoTI estende Contrato e sobrescreve multa() para devolver 5% do valor. Após a instrução Contrato c = new ContratoTI(1000);, a chamada c.multa() resulta em
A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.
Toque longo numa alternativa para riscá-la.
Desenvolvimento de Sistemas · POO, funcional, Java e Python · Inédita, estilo FCC
Questão 3 de 3
Em Java, um atributo declarado com o modificador de acesso protected pode ser acessado
A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.
Toque longo numa alternativa para riscá-la.
Mais duas questões deste tópico estão em Questões.
Flashcards gerados
| Frente | Verso |
|---|---|
| Os quatro pilares da orientação a objetos | Encapsulamento (proteger os dados), herança (reaproveitar), polimorfismo (cada tipo responde do seu jeito) e abstração (modelar só o essencial). |
| Classe abstrata × interface (Java) | A classe abstrata não é instanciada e pode ter estado, construtor e métodos com corpo; a interface define um contrato e, desde o Java 8, pode ter métodos default e static, mas não estado de instância. Uma classe estende uma só classe, mas implementa várias interfaces. |
| Tipagem estática × dinâmica | Na estática (Java), o tipo da variável é declarado e conferido na compilação; na dinâmica (Python), o tipo é do valor e é conferido em execução. |
| Bytecode e JVM | O Java compila o código-fonte para bytecode, que a máquina virtual Java (JVM) executa em qualquer sistema que a tenha. |
| Construtor e referência ao objeto em Python | O construtor é o método __init__, e o próprio objeto chega como primeiro parâmetro, por convenção chamado self. |
Ligação com o estudo de caso
Num caso que peça automatizar uma rotina (baixar dados de uma API, conferir planilhas, gerar relatório), Python é a escolha natural: descreva o script em passos (ler, filtrar, transformar, gravar) e cite as bibliotecas (requests para a API, pandas ou csv para os dados). Num caso de modelagem de sistema, use os pilares da orientação a objetos para justificar as classes: encapsular as regras do contrato, herdar o comum e deixar o polimorfismo tratar as variações.
Fontes da lição
- Edital nº 01/2026, Anexo II, Desenvolvimento de Sistemas (fontes/edital-01-2026.txt).
- The Java Language Specification e tutorial oficial do Java: controle de acesso.
- Documentação oficial do Python: tutorial e guia de programação funcional.
Claude explica
Tire dúvidas sobre este tema no Claude: o site copia o pedido com a lição e abre uma conversa nova, na sua conta. Confira na fonte qualquer fato de lei ou de norma.
Pratique fora do site
Faça questões da FCC sobre este tópico no QConcursos ou no Gran e registre aqui quantas fez: elas contam na meta da semana e no status do tópico.