0% acharam este documento útil (0 voto)
0 visualizações17 páginas

Programação Orientada A Objeto - Java

A Programação Orientada a Objetos (POO) é um paradigma que organiza o código em torno de objetos, refletindo o mundo real. Os principais componentes da POO incluem classes, objetos e métodos, que permitem a criação de sistemas modulares e reutilizáveis. Os pilares da POO são abstração, encapsulamento, herança e polimorfismo, que garantem a integridade e a flexibilidade do código.

Enviado por

Luiz Gustavo
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
0 visualizações17 páginas

Programação Orientada A Objeto - Java

A Programação Orientada a Objetos (POO) é um paradigma que organiza o código em torno de objetos, refletindo o mundo real. Os principais componentes da POO incluem classes, objetos e métodos, que permitem a criação de sistemas modulares e reutilizáveis. Os pilares da POO são abstração, encapsulamento, herança e polimorfismo, que garantem a integridade e a flexibilidade do código.

Enviado por

Luiz Gustavo
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Programação Orientada a Objeto - Java

🗓️ Data:
🎯 Tópico: Introdução ao Paradigma Orientado a Objetos

Introdução ao Paradigma Orientado a Objetos


A Programação Orientada a Objetos (POO) é um paradigma de desenvolvimento criado para
organizar o código em torno de entidades chamadas objetos, aproximando a estrutura do
software do mundo real.

Classe: Funciona como o plano de construção, molde ou abstração lógica que define quais
atributos e comportamentos os objetos gerados possuirão. Ela não ocupa memória RAM
por si só.
Objeto: É a instância concreta e real de uma classe, gerada em tempo de execução
através da palavra-chave new . Cada objeto ocupa seu próprio espaço na memória.
Método: É uma função associada à classe que define as ações ou comportamentos que o
objeto pode executar.

Os 3 Componentes Centrais da Estrutura

Componente Representação em Significado


Código
Classe public class Nome { O molde/plano para criar os objetos.
... }
Atributo private String nome; Variáveis de instância que armazenam o
estado do objeto.
Método public void acao() { Funções que definem o comportamento do
... } objeto.

Exemplo de Código Robusto: O Molde da Classe Funcionario


Abaixo está a implementação completa da classe, demonstrando como mapear características
estruturais e comportamentais básicas.

// Declaração da classe blueprint (molde)


public class Funcionario {
// Atributos (O que o objeto sabe - Variáveis de instância)
private String nome;
private int idade;
private double salario;

// Método Construtor: Inicializa o objeto quando invocado com 'new'


public Funcionario(String nome, int idade, double salario) {
[Link] = nome; // 'this' diferencia o atributo do parâmetro
[Link] = idade;
[Link] = salario;
}

// Método de negócio (Comportamento: O que o objeto faz)


public void fazerAniversario() {
[Link]++; // Incrementa a idade em 1 ano
}

// Método de negócio para aplicar aumento salarial percentual


public void aumentarSalario(double percentual) {
if (percentual > 0) {
[Link] += [Link] * (percentual / 100.0);
}
}

// Métodos de leitura (Getters) para permitir acesso seguro de fora


public String getNome() { return [Link]; }
public int getIdade() { return [Link]; }
public double getSalario() { return [Link]; }
}

Exercício Prático: Instanciação Básica


Contexto: Criação e manipulação de uma classe simples chamada Funcionario .

Código de Execução (Main)

public class Main {


public static void main(String[] args) {
// Alocando o objeto em memória com 'new'
Funcionario func = new Funcionario("Rodrigo", 29, 3500.00);

// Executando comportamentos
[Link]();
[Link](10.0); // Aumento de 10%

[Link]("Nome: " + [Link]());


[Link]("Nova Idade: " + [Link]());
[Link]("Novo Salário: R$ " + [Link]());
}
}

Gabarito de Fixação

Pergunta / Cenário Resposta Baseada nas Métricas


1. Como criamos um Utilizando obrigatoriamente a palavra-chave new seguida do
objeto na classe Main? método construtor.
2. O que acontece com a O Java aloca um espaço físico exclusivo na memória RAM
memória ao instanciar? para armazenar os valores e o estado atual daquele objeto
específico.

🗓️ Data:
🎯 Tópico: Fundamentos da Programação Orientada a Objetos (POO)

O que é o Paradigma Orientada a Objetos


A Programação Orientada a Objetos (POO) é um modelo de análise, projeto e
desenvolvimento de software baseado na composição e interação entre unidades
independentes chamadas Objetos.

O objetivo central é aproximar a estrutura do código do mundo real.


Permite a construção de sistemas modulares, facilitando a reutilização de código e
diminuindo o custo de manutenção.
Contrapõe-se ao modelo estrutural/procedural por focar em "quem realiza a ação" (objeto)
e não nas funções isoladas.

Os 4 Pilares Fundamentais da POO

Pilar Significado Técnico Aplicação Prática


Abstração Isolar os aspectos essenciais de Criar uma classe Carro contendo
um objeto do mundo real, apenas placa e modelo para um
descartando detalhes sistema de estacionamento,
irrelevantes para o sistema. ignorando a cor dos bancos.
Encapsulamento Esconder os detalhes internos de Definir atributos como private e
funcionamento de uma classe, controlar suas alterações
Pilar Significado Técnico Aplicação Prática
expondo apenas uma interface rigidamente através de métodos
segura de acesso. públicos getters e setters .
Herança Mecanismo que permite que uma Uma classe Caminhao estende a
classe (filha) herde atributos e classe Veiculo , reaproveitando o
comportamentos de outra classe motor e as rodas sem duplicar o
(pai). código.
Polimorfismo Capacidade de um mesmo O método emitirSom() funciona
método se comportar de formas de um jeito na classe Cachorro
diferentes dependendo do objeto (latido) e de outro na classe Gato
que o invoca. (miado).

Estrutura Base de uma Classe em Java


Uma classe funciona como o plano de construção (molde). A partir dela, criamos objetos reais
em memória utilizando a palavra-chave

// Molde estrutural da classe


public class Veiculo {
// 1. Atributos (O que o objeto sabe - Estado)
private String placa;
private boolean motorLigado;

// 2. Construtor (Inicialização obrigatória do objeto)


public Veiculo(String placa) {
[Link] = placa;
[Link] = false; // Estado inicial padrão
}

// 3. Métodos de Negócio (O que o objeto faz - Comportamento)


public void ligarMotor() {
[Link] = true;
}

// 4. Getters e Setters (Interface de controle segura)


public String getPlaca() {
return [Link];
}
}

Exercício Prático: Instanciação e Manipulação de Objetos


Contexto: Um desenvolvedor precisa testar a criação de instâncias com escopos controlados
em uma classe executável ( main ).

public class Main {


public static void main(String[] args) {
// Criando dois objetos distintos na memória RAM
Veiculo v1 = new Veiculo("ABC-1234");
Veiculo v2 = new Veiculo("XYZ-9876");

[Link]();

[Link]("V1 ligado? " + [Link]());


}
}

Gabarito de Análise de Execução

Pergunta / Cenário Resposta / Justificativa


1. O comando [Link]() NÃO. Cada objeto criado com a palavra-chave
altera o estado de v2 ? new possui seu próprio espaço isolado de
memória e seus próprios atributos.
2. O que acontece se tentarmos Erro de compilação. O atributo possui o
acessar [Link] diretamente na modificador de acesso private , violando as
classe Main? regras se acessado sem o método getPlaca() .

🗓️ Data:
🎯 Tópico: Classes, Objetos e Métodos de Negócio

Classes, Objetos e Métodos de Negócio


Este material aprofunda a interação prática entre objetos e a execução de métodos de negócio,
demonstrando como as mensagens são trocadas e como cada instância gerencia seu próprio
estado.

Independência de Estado: Cada objeto instanciado retém seus próprios valores de


atributos de forma isolada dos demais.
Métodos de Negócio: São os métodos responsáveis por implementar as regras e lógicas
de operação do sistema, alterando o estado interno do objeto de forma controlada.
Boas Práticas: Use sempre nomes significativos para variáveis de referência e evite criar
objetos desnecessários na memória.

Tabela De-Para: Métricas de Instanciação

Ação no Sintaxe Java Efeito em Memória


Sistema
Instanciar Funcionario f1 = new Cria a instância f1 com seus
Objeto 1 Funcionario("João", 30); próprios dados.
Instanciar Funcionario f2 = new Cria a instância f2 isolada em
Objeto 2 Funcionario("Maria", 25); outro endereço de memória.
Chamar [Link](); Altera APENAS o estado
Método interno do objeto f1 .

Exemplo de Código Avançado: Múltiplos Objetos em Ação


Vamos simular o controle de uma classe Hospital gerenciando o fluxo de ocupação de leitos.

public class Hospital {


private String nome;
private int capacidadeLeitos;
private int leitosOcupados;

public Hospital(String nome, int capacidadeLeitos) {


[Link] = nome;
[Link] = capacidadeLeitos;
[Link] = 0; // Inicia vazio
}

// Método de negócio com validação de limite


public boolean internarPaciente() {
if ([Link] < [Link]) {
[Link]++;
return true; // Internação realizada com sucesso
}
return false; // Hospital lotado
}

public int getVagasDisponiveis() {


return [Link] - [Link];
}

public String getNome() { return [Link]; }


}

Código de Teste de Independência de Estado

public class SimuladorHospitalar {


public static void main(String[] args) {
Hospital h1 = new Hospital("Hospital Central", 2);
Hospital h2 = new Hospital("Hospital da Zona Sul", 50);

// Internando pacientes no Hospital 1


[Link]();
[Link]();

[Link]([Link]() + " vagas: " +


[Link]());
[Link]([Link]() + " vagas: " +
[Link]());
}
}

Gabarito de Verificação

Pergunta / Situação Resposta Esperada


1. Se chamarmos internarPaciente() NÃO. Os objetos possuem ciclo de vida e
no Hospital 1, o Hospital 2 é afetado? estados totalmente independentes e isolados
na memória RAM.

🗓️ Data:
🎯 Tópico: Encapsulamento Avançado e Construtores

O que é o Encapsulamento Refratado


O encapsulamento garante a integridade dos dados internos da classe. Sem ele, qualquer
trecho de código externo poderia corromper o estado de um objeto inserindo dados inválidos.
Utilizado para ocultar os detalhes de implementação internos de uma classe e proteger o
estado do objeto contra modificações diretas e inseguras de fora.

Atributos Privados: Por convenção e segurança, os atributos devem ser definidos


estritamente como privados ( private ).
Getters e Setters: São os métodos de acesso públicos que permitem ler ( get ) e modificar
( set ) os valores de forma totalmente controlada e validada pela própria classe.
Modificadores de Acesso: Controlam o nível de visibilidade que as outras classes têm
sobre os membros (atributos/métodos) de uma determinada classe.

Modificador Símbolo Visibilidade de Acesso Quando Aplicar


UML
public + Visto por QUALQUER classe Métodos de negócio globais
do sistema, de qualquer e construtores primários.
pacote.
private - Visto APENAS e Praticamente TODOS os
exclusivamente pela própria atributos de instância para
classe dona do membro. proteger o estado.
protected # Visto pela própria classe, por Atributos ou métodos
classes do mesmo pacote e auxiliares que pais querem
por suas SUBCLASSES. liberar para seus filhos
diretos.
package (nenhum) Visto apenas por classes que Classes utilitárias internas
(padrão) habitam o MESMO PACOTE do módulo.
físico de diretório.

Mecânica dos Construtores e Sobrecarga


O construtor é executado IMEDIATAMENTE no momento do new . Ele não possui tipo de
retorno (nem mesmo void ) e obrigatoriamente carrega o mesmo nome da classe.

Sobrecarga de Construtores: Permite que uma mesma classe ofereça caminhos


alternativos para a criação do objeto, variando a quantidade ou os tipos dos parâmetros
recebidos.

public class ContaBancaria {


private String numero;
private double saldo;

// Construtor 1: Para contas novas (iniciam com saldo zero)


public ContaBancaria(String numero) {
[Link] = numero;
[Link] = 0.0;
}

// Construtor 2 (Sobrecarga): Para migração de sistemas (já trazem saldo)


public ContaBancaria(String numero, double saldo Inicial) {
[Link] = numero;
[Link] = saldoInicial;
}
}

Exercício Prático: Validação e Proteção de Atributos via Setter


Contexto: Um sistema financeiro não pode aceitar de forma alguma a atribuição de um limite
de crédito negativo para um cliente.

Implementação com Regra de Negócio Interna

public class LimiteCredito {


private double valorLimite;

public void setValorLimite(double valorLimite) {


if (valorLimite >= 0) {
[Link] = valorLimite;
} else {
[Link]("ERRO: Operação negada! Limite inválido.");
}
}
}

Gabarito de Verificação de Segurança

Entrada de Dados Comportamento do Sistema


setValorLimite(500.00) Aceito. Passa pela validação condicional e altera o atributo
em memória.
setValorLimite(-150.00) Bloqueado. O estado anterior do objeto permanece intacto e
a mensagem de erro é exibida.

🗓️ Data:
🎯 Tópico: Construtores de Classes e Sobrecarga
Construtores de Classes e Sobrecarga
O Construtor é um método especial executado OBRIGATORIAMENTE no exato momento em
que um objeto é criado no sistema por meio do operador new .

Características: Possui exatamente o mesmo nome da classe e NÃO possui tipo de


retorno (nem mesmo void ).
Construtor Padrão: Se você não declarar nenhum construtor explicitamente, o Java cria
de forma automática um construtor vazio por trás dos panos.
Sobrecarga: Permite criar múltiplos construtores na mesma classe, mudando apenas a
quantidade ou o tipo dos parâmetros recebidos.

Tabela de Sintaxe de Construtores

Tipo de Exemplo de Assinatura Java Quando Utilizar


Construtor
Padrão / Vazio public Hospital() { } Quando o objeto não exige dados
iniciais obrigatórios para existir.
Com public Hospital(String Para forçar o preenchimento de dados
Parâmetros nome) { ... } vitais logo na instanciação.

Exemplo de Código com Sobrecarga de Construtores

public class PassagemAerea {


private String codigoVoo;
private double preco;
private boolean classeExecutiva;

// Construtor 1: Passagem econômica padrão


public PassagemAerea(String codigoVoo, double preco) {
[Link] = codigoVoo;
[Link] = preco;
[Link] = false; // Valor default
}

// Construtor 2 (Sobrecarga): Permite definir a categoria no momento da


compra
public PassagemAerea(String codigoVoo, double preco, boolean
classeExecutiva) {
[Link] = codigoVoo;
[Link] = preco;
[Link] = classeExecutiva;
}
}

Código de Teste de Inicialização

public class TesteVoo {


public static void main(String[] args) {
// Chamando o Construtor 1
PassagemAerea p1 = new PassagemAerea("G3-1234", 450.00);

// Chamando o Construtor 2 (Sobrecarga)


PassagemAerea p2 = new PassagemAerea("LA-9876", 1800.00, true);
}
}

🗓️ Data:
🎯 Tópico: Herança e a Palavra-Chave

Herança e a Palavra-Chave
A Herança é o pilar que estabelece um relacionamento de generalização e especialização
entre classes, permitindo o reaproveitamento de atributos e métodos e evitando a duplicação
de código.

Superclasse (Pai): A classe mais ampla que centraliza os atributos e métodos comuns.
Subclasse (Filha): A classe especializada que utiliza a palavra-chave extends para
herdar automaticamente todos os membros da classe pai.
Regra de Ouro: A classe filha herda os comportamentos, mas pode adicionar atributos e
métodos próprios específicos do seu domínio.

Representação Estrutural (Visão UML de Herança)

Elemento Representação Gráfica Significado no Modelo


Relação de Seta com ponta triangular fechada Indica que a classe filha herda
Herança apontando para o pai. tudo da classe pai.
Exemplo de Código: Implementando Herança com extends

// Superclasse genérica
public class Veiculo {
protected String placa; // 'protected' permite que os filhos vejam
diretamente
protected double velocidade;

public Veiculo(String placa) {


[Link] = placa;
[Link] = 0.0;
}

public void acelerar() {


[Link] += 10.0;
}
}

// Subclasse especializada
public class Motocicleta extends Veiculo {
private int cilindradas;

public Motocicleta(String placa, int cilindradas) {


super(placa); // Invoca obrigatoriamente o construtor do pai
[Link] = cilindradas;
}

// Método específico apenas de motocicletas


public void empinar() {
[Link]("Motocicleta empinando...");
}
}

🗓️ Data:
🎯 Tópico: Herança e Reescrita de Métodos ( @Override e super )

O que é Herança em Java


A herança estabelece uma relação de generalização/especialização do tipo "É UM". Em Java,
utilizamos a palavra-chave extends para acionar a herança.
A classe que cede as características é chamada de Superclasse (Classe Pai).
A classe que herda e expande as características é a Subclasse (Classe Filha).
Restrição Crucial: Java implementa apenas herança simples. Uma classe filha pode
herdar de apenas UMA superclasse direta por vez.

Uso do Operador super


A palavra-chave super é utilizada pela classe filha para fazer referência explícita aos
membros ou construtores da classe pai.

// Classe Pai
public class Funcionario {
protected String nome;
protected double salarioBase;

public Funcionario(String nome, double salarioBase) {


[Link] = nome;
[Link] = salarioBase;
}
}

// Classe Filha
public class Gerente extends Funcionario {
private double bonusGerencial;

public Gerente(String nome, double salarioBase, double bonusGerencial) {


// OBRIGATORIAMENTE repassa os dados para o construtor do Pai primeiro
super(nome, salarioBase);
[Link] = bonusGerencial;
}
}

Reescrita de Métodos ( @Override )


A reescrita acontece quando a subclasse decide alterar por completo (ou customizar) o
comportamento de um método que ela herdou da superclasse.

A Anotação @Override : Avisa ao compilador que aquele método está substituindo a


lógica do pai. Se houver algum erro de digitação no nome do método, o compilador gera
um erro imediatamente, evitando bugs em tempo de execução.

public class Funcionario {


public double calcularRendimento() {
return [Link];
}
}

public class Gerente extends Funcionario {


@Override
public double calcularRendimento() {
// Customiza a lógica aproveitando a base do pai somada ao bônus local
return [Link]() + [Link];
}
}

🗓️ Data:
🎯 Tópico: Polimorfismo Dinâmico em Java

O que é o Polimorfismo Dinâmico


O Polimorfismo permite que uma variável de referência do tipo da superclasse aponte para um
objeto de qualquer uma de suas subclasses em tempo de execução.

// Declarado como Funcionario (Pai), mas instanciado como Gerente (Filho)


Funcionario colab = new Gerente("Rodrigo", 5000.0, 1500.0);

// Executará a lógica customizada de Gerente automaticamente!


[Link]([Link]());

Tabela de Atribuição Polimórfica

Tipo da Variável Objeto Real (Instância) Validade no Java


(Referência)
Veiculo new Veiculo(...) Válido. Instanciação clássica padrão.
Veiculo new Válido (Polimorfismo). Pois um Carro
CarroEsportivo(...) Esportivo é um Veículo.
CarroEsportivo new Veiculo(...) INVÁLIDO. Erro de compilação. Nem
todo veículo é um modelo esportivo.

Exemplo de Código Prático de Polimorfismo


public class SimuladorDeTransito {
// Método polimórfico que aceita qualquer tipo de veículo como argumento
public void testarAceleracao(Veiculo v) {
[Link](); // O Java decidirá em tempo de execução qual método
rodar
[Link]("Velocidade final registrada: " + [Link]);
}
}

// Classe Executável
public class MainPolimorfismo {
public static void main(String[] args) {
SimuladorDeTransito simulador = new SimuladorDeTransito();

Veiculo v1 = new Veiculo();


Veiculo v2 = new CarroEsportivo(); // Atribuição polimórfica

[Link](v1); // Exibe 10.0 (Usa a lógica de


Veiculo)
[Link](v2); // Exibe 40.0 (Usa a lógica de
CarroEsportivo)
}
}

🗓️ Data:
🎯 Tópico: Classes Abstratas e Interfaces

Classes Abstratas e Interfaces


No topo da arquitetura de sistemas orientados a objetos, criamos estruturas puramente
conceituais que servem apenas como contratos ou moldes abstratos para guiar o
desenvolvimento das classes concretas.

Classe Abstrata ( abstract class ): Uma classe que NÃO pode ser instanciada
diretamente com new . Ela serve de base para herança e pode misturar métodos abstratos
(sem corpo) e concretos.
Interface ( interface ): Um contrato 100% abstrato que define apenas quais métodos as
classes que o assinarem devem obrigatoriamente implementar. Permite contornar a
ausência de herança múltipla no Java.
Tabela Comparativa Final: Abstratas vs. Interfaces

Critério Técnico Classe Abstrata Interface


Palavra-chave de Vinculada via herança: Vinculada via contrato: implements .
ligação extends .
Instanciação ( new ) PROIBIDA de forma direta. PROIBIDA de forma direta.
Herança Múltipla Não permite (apenas Permitida (uma classe pode
herança simples). implementar várias interfaces).
Tipo de Atributos Aceita variáveis normais Aceita apenas constantes públicas
de qualquer tipo. ( public static final ).

Exemplo de Código Arquitetural Completo


Abaixo, criamos um contrato via interface e garantimos que a regra seja cumprida.

// Definição da Interface (Contrato Puro)


public interface Autenticavel {
boolean login(String chave);
}

// Superclasse Abstrata (Molde Conceitual)


public abstract class Usuario doSistema implements Autenticavel {
protected String login;

public UsuarioDoSistema(String login) {


[Link] = login;
}

// Método concreto comum a todos os usuários


public String getLogin() { return [Link]; }
}

// Classe Concreta que herda e é obrigada a cumprir a interface


public class Administrador extends UsuarioDoSistema {
private String senhaMestra;

public Administrador(String login, String senhaMestra) {


super(login);
[Link] = senhaMestra;
}

// Cumprindo o contrato da interface obrigatoriamente


@Override
public boolean login(String chave) {
return [Link](chave);
}
}

Exercício Prático de Conclusão da Grade de POO


Contexto: Um arquiteto de software projetou um sistema logístico onde diferentes meios de
transporte realizam entregas, mas cada um calcula o tempo estimado de rota de forma única.

Gabarito de Arquitetura e Engenharia de Código

Pergunta / Desafio Resposta Estruturada


1. Como impedir que alguém faça new Declarando a classe Entregador
Entregador() no sistema? obrigatoriamente com o modificador abstract .
2. Se criarmos uma lista do tipo SIM. Por conta do Polimorfismo, uma coleção
List<Entregador> , podemos colocar estruturada baseada no tipo genérico da
Motoboys e Caminhões juntos nela? superclasse aceita perfeitamente qualquer uma
de suas subclasses derivadas.
3. Qual a vantagem de definir o Obriga TODAS as subclasses que estenderem
método calcularTempoRota() como o pai a implementar sua própria versão do
abstrato na classe pai? cálculo, garantindo uniformidade na chamada
do método em todo o sistema.

Você também pode gostar