Buscar

Programação Orientada a Objetos - Maurício_Braga -2ª webconferência

Prévia do material em texto

PROGRAMAÇÃO ORIENTADA A 
OBJETOS
MAURÍCIO DA MOTTA BRAGA
Operadores em Java
• Operadores aritméticos
• Consistem de:
• Adição (+);
• Subtração (-);
• Multiplicação (*);
• Divisão real entre dois números (/);
• Divisão inteira entre dois números inteiros (/);
• Resto da divisão inteira entre dois números inteiros (%).
Operadores
• Operadores relacionais
• Utilizados na comparação de literais ou números;
• Retornam valores lógicos;
• Consistem de:
• Igual a (==);
• Diferente de (!=);
• Maior que (>);
• Menor que (<);
• Maior ou igual a (>=);
• Menor ou igual a (<=).
Operadores
• Operadores lógicos
• Utilizados para combinar resultados de expressões lógicas;
• Consistem de:
• E (AND);
• OU (OR);
• NÃO (NOT).
Operadores Lógicos em Java
• Operadores Booleanos:
! - Não & - E 
| - Ou
Comando de entrada de dados em Java
• Para fazer a leitura de dados do teclado em programas Java, utilizaremos 
o objeto Scanner:
• O objeto Scanner pode ser usado com variáveis numéricas, lógicas e do 
tipo texto.
Scanner s = new Scanner(System.in);
int numero = s.nextInt();
Comando de saída de dados em Java
• Para escrevermos na tela, usaremos a função println, disponível no Java.
• Para concatenar uma variável com um texto, usamos o sinal +.
• Ex:
• System.out.println(“O saldo atual é” + saldo);
• System.out.println(soma);
System.out.println(var ou expressão ou mensagem +...);
Comando SE na linguagem Java
int x = 5, y = 10; 
if (x >= y) {
System.out.println(“X é maior ou igual a Y.”); 
}
else { 
System.out.println(“X é menor que Y.”);
}
Exemplo – Programa testa par ou ímpar
public static void main(String[] args) {
int numero=0;
System.out.println(“Forneça o número:");
Scanner s = new Scanner (System.in);
numero=s.nextInt();
if (numero % 2 == 0) {
System.out.println("O número é par. ");
}
else {
System.out.println("O número é ímpar. ");
}
}
Exemplo comando switch em Java
public static void main(String[] args) {
int numero =0;
System.out.println("Digite um número:");
Scanner s = new Scanner (System.in);
numero=s.nextInt();
switch (numero) {
case 0:
System.out.println(“Você digitou 0.");
break;
case 1:
System.out.println(" Você digitou 1.");
break;
Exemplo comando switch em Java
case 2:
System.out.println(" Você digitou 2.");
break;
case 3:
System.out.println(" Você digitou 3.");
break;
default:
System.out.println(" Você digitou um valor menor que 0 ou maior que 3");
break;
}
}
Exemplo – comando de repetição
• programa que lê diversos números informados pelo usuário e 
após cada leitura exibe se o número é par ou ímpar. Se o usuário 
fornecer um valor negativo o programa irá encerrar a execução 
(sem entretanto testar se esse número negativo é par ou ímpar).
class solucao {
public static void main(String[] args) {
int num = 0;
System.out.println( "Para sair, entre com um valor < 0");
System.out.println( "Digite um número:");
Scanner s = new Scanner(System.in);
num = s.nextInt();
while (num >=0) {
if (num % 2 == 0)
System.out.println("O número " + num + " é par");
else
System.out.println("O número " + num + " é impar");
System.out.println( "Digite o próximo número:");
num = s.nextInt();
}
System.out.println("Tchau…");
} }
• É o mecanismo para definir uma nova classe em termos de uma já 
existente
• É o relacionamento entre classes de objetos que permite a uma classe 
possuir atributos e operações definidas por outra classe mais genérica.
• A classe mãe é chamada de superclasse e a classe filha de subclasse.
Herança
• Imagine um programa para gerenciar a folha de pagamento de uma empresa. 
Tal programa pode conter uma classe Empregado.
• A classe empregado é definida para o empregado comum, que possui um 
salário fixo.
• Entretanto, a empresa também possui empregados que possuem além do 
salário fixo, uma comissão sobre as vendas realizadas. Essa é a única diferença 
entre os dois tipos de funcionários.
• Como implementar no programa suporte a esse funcionário comissionado?
Exemplo
class Empregado {
private double salario;
private String nome;
public Empregado(String nome_emp, double val) {
nome = nome_emp;
if (val > 0)
salario = val;
}
public double getSalario() {
return salario;
}
// resto dos métodos omitidos para simplificar
}
Exemplo
• Copiar todo o código da classe Empregado para uma nova classe 
EmpregadoComComissao, modificando a mesma para adicionar o suporte a 
comissões.
• Problemas desta solução:
• Necessidade de manter dois códigos: Sempre que for necessário 
adicionar/corrigir a classe Empregado, será necessário corrigir a classe 
EmpregadoComComissao também.
• A melhor solução é utilizar herança.
Solução utilizando encapsulamento
class EmpregadoComComissao extends Empregado {
private double comissao;
private int numero_vendas;
public EmpregadoComComissao(String n_emp, double val, 
double com) {
super(n_emp, val);
if (com > 0)
comissao = com;
}
public void adicionarVendas(int vendas) {
numero_vendas = numero_vendas + vendas;
}
public double calcularPagamento() {
return getSalario() + comissao*numero_vendas;
}
}
Exemplo
• EmpregadoComComissão herda de Empregado, obtendo todos os 
métodos e atributos definidos nesta.
• Uma vez que um objeto do tipo EmpregadoComComissão é 
também um objeto do tipo Empregado, ele pode receber 
quaisquer mensagens que seriam enviadas a um objeto do tipo 
Empregado. 
Solução utilizando herança
public static void main(String[] args) {
EmpregadoComComissao c = new EmpregadoComComissao(“Ricardo 
Silva”, 3500, 0.15);
c.adicionarVendas(5);
System.out.println(“Nome: ” + c.getNome());
System.out.println(“Salário Fixo: ” + c.getSalario());
System.out.println(“Salario total: ” + c.calcularPagamento());
}
Exemplo
• Nem sempre encapsulamento é a melhor solução.
• Possibilidade de alterar o funcionamento herdado da classe mãe, 
criando uma classe mais adequada a um tipo de situação, sem 
precisar mexer na classe original.
• Possibilidade de criar classes mais específicas, reutilizando código de 
classes genéricas.
Porque utilizar herança?
• Uma vez que subclasses podem ser superclasses de novas classes, 
podemos definir uma hierarquia de classes em nossos programas
• Podemos entender a hierarquia de classe como uma árvore que contém 
todas as classes que estão relacionadas através de herança.
• A hierarquia de classes em Java se inicia com a classe Object, definida 
em java.lang.
• Uma classe herda atributos e métodos de todos os seus ancestrais.
• Em Java, uma classe pode herdar diretamente de apenas uma classe 
(herança simples). E possível, entretanto, implementar várias 
interfaces.
Hierarquia de classes
Hierarquia de classes
Conta
ContaCorrente Poupança
ContaEspecial
Veículo
Carro Moto
CarroEsportivo
• Como podemos saber quando devemos utilizar herança e não 
encapsulamento?
• A forma de validar herança é usar a frase “é um”.
• Exemplo: gato e animal mamífero.
• Todo gato é um animal mamífero.
• Todo mamífero é um gato (?)
Validação da herança
Herança
• Uma subclasse pode possuir os seguintes tipos de métodos:
• Herdados: Métodos que a subclasse adquiriu da superclasse.
• Sobreescritos: Métodos herdados que foram redefinidos na 
subclasse.
• Novos: Métodos adicionados na subclasse.
• Apóia-se nos conceitos de encapsulamento e herança, permitindo 
a construção de softwares flexíveis para se adaptar a requisitos 
futuros, reduzindo o esforço da manutenção.
• Domínio da técnica é fundamental para se aproveitar ao máximo 
as vantagens da programação OO.
Polimorfismo
Polimorfismo
• Permite que um objeto possa ser utilizado (acessado / referenciado) de 
várias formas. Outros objetos poderão interagir com ele sem saber a 
sua forma específica.
• Viabiliza que um mesmo nome possa representar diferentes 
comportamentos, selecionados através de um mecanismo automático.
• Permite a uma mesma ação ser implementada de diversas maneiras 
em objetos diferentes.
Polimorfismo
•O polimorfismo é resolvido dinamicamente
• Ocorre quando uma classe possui um método com o mesmo 
nome e assinatura (número, tipo e ordem dos parâmetros) de 
um método da superclasse. Quando isso acontece, dizemos 
que a subclasse sobrepõe o método da superclasse
Exemplo polimorfismo
Elipse
desenhar()
Circulo
desenhar()
O tratamento do desenhar()
em Circulo irá sobrescrever
o desenhar() da Elipse. 
Apesar de herdar o método 
dela e poder reutilizá-lo, ele
Implementará de outra 
maneira este método
Exemplo polimorfismo
class Elipse { 
public void desenhar () { 
// código para desenhar uma elipse 
}
}
class Circulo extends Elipse {
public void desenhar () { 
// código para desenhar um círculo 
}
} 
Exemplo polimorfismo
Elipse figura1 = new Elipse();
Elipse figura2 = new Círculo();
figura1.desenhar();
figura2.desenhar();
• Pode ser aplicado à métodos, classes e variáveis. O efeito do 
modificador vai depender sobre que elemento ele foi aplicado:
• Classes: Impede que a classe possa ser estendida através de 
herança.
• Métodos: Impede que o método seja redefinido na subclasse.
• Variável: Torna a variável uma constante. 
O modificador final
• Classe que podem conter tanto métodos abstratos quanto métodos 
convencionais.
• Não podem ser instanciadas. Sua utilização exige o uso de subclasses 
que irão implementar os métodos abstratos;
• São criadas para serem estendidas.
Classes abstratas
• Métodos que não possuem corpo (implementação). Contém 
apenas a declaração.
• Sua presença torna a classe automaticamente abstrata.
• Devem ser implementados nas subclasses da classe abstrata 
que os definiu. 
Métodos abstratos
• Uma classe deve ser declarada abstrata se:
• A classe possui um ou mais métodos abstratos.
• A classe herda um ou mais métodos abstratos, os quais não 
são implementados.
• A classe declara que implementa uma determinada interface 
mas não fornece implementação para todos os métodos desta 
interface. 
Classes abstratas
Exemplo
Considere o exemplo envolvendo herança:
Figura
Retângulo
ElipsePolígono
Triângulo
Quadrado
Círculo
Exemplo
• A classe Figura define uma figura genérica.
• Vimos que cada subclasse dessa hierarquia definida por 
Figura contém um método desenhar.
• Não é possível definir um método desenhar para uma figura 
genérica; este método deve ser abstrato, devendo ser 
implementado em cada subclasse de Figura.
Exemplo
public abstract class Figura { 
// método abstrato; subclasses de figura devem
// fornecer uma implementação para esse método. 
public abstract void desenhar( ); 
}
A classe Figura poderia ser definida como abstrata, como no 
exemplo abaixo:
• Possuem apenas métodos abstratos;
• Os atributos, quando presentes, se resumem a constantes estáticas;
• Podem ser definidas como interfaces, para maior flexibilidade no 
uso.
Classes abstratas “puras”
• Tipo de classe que possui apenas métodos abstratos; Os atributos, se 
existirem, devem ser public, static e final.
• Não podem ser instanciadas. Sua utilização exige o uso de uma classe que 
implemente a interface;
• Classes que desejam implementar uma interface utilizam a palavra reservada 
implements.
Interfaces
• Funcionam como um “contrato”: Uma classe que implementa uma 
interface deve implementar todos os métodos dessa interface;
• Ao implementar uma interface, a classe mantém o direito de herdar 
de outra classe.
• Uma classe pode implementar diversas interfaces, incrementando o 
polimorfismo.
Interfaces
Interfaces
• Aumentam o nível de reusabilidade.
• Facilitam a criação de arquiteturas baseadas em componentes.
• Reduzem o esforço de evolução do software.
Exemplo Interface
public interface MinhaInterface {
public void meuMetodoAbstrato ();
}
Exemplo Interface
public class MinhaClasse implements MinhaInterface {
public void meuMetodoAbstrato() {
System.out.println(“Método implementado!”);
}
}
Vantagens do uso de interfaces
• Aumentam a reusabilidade do software;
• Facilitam a evolução da aplicação;
• Facilitam a utilização de componentes no sistema;
• Viabilizam o polimorfismo.
• É possível ter métodos com o mesmo nome numa mesma classe.
• A lista de parâmetros deve ser diferente.
• O tipo retornado pode ser diferente.
• Exemplo:
• public static int max(int a, int b);
• public static long max(long a, long b);
• public static double max(double a, double b);
Sobrecarga de métodos
OBRIGADO(A)
MAURÍCIO DA MOTTA 
BRAGA
BRAGA.MAURICIO@GMAIL.COMPROFESSOR
OBRIGADO(A)

Continue navegando