Pular para o conteúdo

Orientação a objetos, programação funcional, Java e Python

Prioridade Média 17 min de leitura Status: Não visto Lido Praticado Dominado

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 default e static com 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) e public (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 e functools.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.

  1. Escreva sem olhar a lição, com frases curtas e um exemplo seu.
  2. Onde travar ou precisar de jargão, há uma lacuna: releia só essa parte.
  3. 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

Alternativas

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

Alternativas

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

Alternativas

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

FrenteVerso
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

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.

Registrar questões feitas lá
Errei uma questão lá: criar flashcard