Baixe o app para aproveitar ainda mais
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)
Compartilhar