UNIVERSIDADE DO ESTADO DE SANTA CATARINA DCC Departamento de Ciência da Computação Joinville SC

Documentos relacionados
UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Linguagem de Programação III

Classes e Objetos. Sintaxe de classe em Java

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Ex: carro_desportivo poderá ser uma subclasse de automóvel (carro_desportivo é_um automóvel)

Programação Java (nível intermediário) 4. Polimorfismo

Interfaces. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

4 Conceito de Herança

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Interfaces POO. Prof. Marcio Delamaro

Linguagem de Programação II Implementação

POO29004 Programação Orientada a Objetos

Java para Desktop. Programação Orientada à Objetos 2 JSE

Programação Orientada a Objetos em Java

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Classe Abstrata e Interface

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Orientação a objetos. Programação. Orientada a Objetos. Orientação a objetos. Orientação a objetos. Abstração e encapsulamento

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

Polimorfismo. O que é polimorfismo?

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

Conceitos de Programação Orientada a Objetos

Avançando em Java com Polimorfismo. Prof.: Hugo Barros

Interfaces e Classes Abstratas

9 Classes Abstractas e Interfaces

Linguagem de Programação IV Introdução

Aula 10 POO 1 Classes Abstratas. Profa. Elaine Faria UFU

Especificam quem tem acesso a cada entidade, isto é, quem tem acesso a. cada classe e cada membro da classe (dados e métodos)

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Linguagem de programação Programação Orientada a objetos

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Aula. Renata Pontin de Mattos Fortes 2006

UNIVERSIDADE DO ESTADO DE SANTA CATARINA DCC Departamento de Ciência da Computação Joinville SC

Linguagem de Programação II Implementação


Programação Orientada a Objetos. SANTOS, Rafael (PLT) e Guia de Estudo SCJP. SIERRA, Kathy e BATES, Bert

A B Classe Genérica D A C. Classe Especializada. Classe Especializada. Características Herdadas

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Linguagem de Programação III

POO29004 Programação Orientada a Objetos

COMPORTAMENTOS - Observações

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Universidade Estadual de Santa Cruz

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

POO29004 Programação Orientada a Objetos

Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces

CONCEITOS BÁSICOS DE ORIENTAÇÃO A OBJETOS PROF. ME. HÉLIO ESPERIDIÃO

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Programação Orientada a Objetos JAVA - NETBEANS

DIRETORIA ACADÊMICA DE GESTÃO E TECNOLOGIA DA INFORMAÇÃO DIATINF TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TADS

ALGORITMOS. Professor: Diego Oliveira. Aula 06 - Tipos Primitivos de Dados

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

Análise de Programação

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Lição 11 Herança, polimorfismo e interfaces

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Programação Orientada a Objetos

Herança e Polimorfismo

Tema da aula Introdução ao paradigma de programação: Orientado a Objetos

LÓGICA DE PROGRAMAÇÃO (JAVA) HERANÇA. Professor Carlos Muniz

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Herança. Herança. Herança. Herança. Herança. Programação Orientada a Objetos

Polimorfismo e Ligação Dinâmica. Alcides Pamplona Polimorfismo e Ligação Dinâmica

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

final class UltimosDiasMeses{ static final int[] DIAS_DO_MES = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; }

Java First-Tier: Aplicações. Sobrecarga. Orientação a Objetos em Java (II) Sobrecarga de Construtores: Exemplo de Declaração

Genéricos. Profa. Thienne Johnson EACH/USP

Computação II Orientação a Objetos

Computação II - Java - Teste 1.2 Prof. Adriano Joaquim de Oliveira Cruz 2015/04/27

1. Por que não utilizar a notação de composição da UML para mostrar que um cachorro é composto de altura, peso, cor e data de nascimento?

Palavras Reservadas da Linguagem Java

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

Interfaces e Classes Internas

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli

Interfaces. Classes abstratas que possuem apenas métodos abstratos. Na Interface: Métodos são implicitamente. Campos são implicitamente

Como exemplo, vamos criar uma subclasse da classe Funcionario, vista nos capítulos anteriores.

Herança. Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman SISTEMAS DE INFORMAÇÃO 1

Programação Java. - Herança e Polimorfismo - Marco Fagundes Marco Fagundes -

Laboratório de Programação. Aula 2 Java 5COP088. Aula 2 Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente):

Computação II Orientação a Objetos

Herança e Polimorfismo - Parte II -

POO UML e Outros Conceitos. Prof. Vicente Paulo de Camargo

Linguagem de Programação III

Transcrição:

Aula 06-1/9 UNIVERSIDADE DO ESTADO DE SANTA CATARINA DCC Departamento de Ciência da Computação Joinville SC CURSO: Bacharelado em Ciência da Computação DISCIPLINA: POO0001 Programação Orientada a Objetos PROFESSOR: Diego Buchinger AULA 06 Classes Abstratas e Interface CLASSES ABSTRATAS O uso do conceito de herança, visto na última aula, pode ser muito útil para reaproveitamento de código mas, as vezes, ao criar uma superclasse para se reaproveitar código não queremos que esta possa ser instanciada. Por exemplo, se em um sistema criamos uma superclasse Cliente para agrupar atributos e métodos em comum entre clientes pessoa física e pessoa jurídica, pode ser indesejável que seja possível instanciar um objeto Cliente, que não seja nem pessoa física nem pessoa jurídica. É exatamente para estes tipos de situações que existem as classes abstratas! Uma classe abstrata pode incluir atributos e métodos como uma classe normal, contudo ela pode incluir também métodos abstratos e, principalmente, não pode ser instanciada. Os métodos abstratos mencionados são assinaturas de métodos que não podem ser implementadas nas classes abstratas, mas devem ser obrigatoriamente implementados nas classes derivadas (subclasses) sobrescrevendo-os com uma implementação. No Java, a palavra-chave abstract é utilizada para representar métodos e classes abstratas, devendo ser usada após o indicador de encapsulamento e antes do tipo de retorno. Para exemplificar o uso de classes abstratas considere a seguinte tentativa de representar diferentes tipos de animais: cachorro, vaca e tucano. Precisa-se saber o nome e a idade destes animais mas, além disso, para os cachorros é interessante saber ainda o seu gênero, para as vacas precisa-se saber o seu peso e o número total de litros de leite que elas já produziram no total, e para os tucanos é preciso saber a cor de sua plumagem. Para aproveitar os dados e métodos que estes animais possuem em comum elaborou-se uma classe abstrata genérica, e cada animal foi especializado em uma classe derivada. Uma implementação é proposta no próximo quadro. Na Figura 1 mostra-se o aviso de erro/alerta que a IDE Netbeans fornece quando definimos que a classe Dog herda da classe Animal, sendo que esta superclasse já está implementada e possui a definição de um método abstrato tostring(). A mensagem mostra que a classe Dog deve ser abstrata ou deve sobrescrever o método tostring(). FIGURA 1 Mensagem de erro/alerta quando há um método abstrato que não foi sobrescrito.

Aula 06-2/9 Arquivo: Animal.java 1 1 1 1 package abstrata; public abstract class Animal { public String name; private int age; public Animal(String name){ this.name = name; age = 0; public void anniversary(){ age += 1; public int getage(){ return age; public abstract String tostring(); Arquivo: Dog.java package abstrata; 1 1 1 1 1 1 1 1 20. enum Gender { Male, Female ; public class Dog extends Animal { private Gender gender; public Dog(String name, Gender gender){ super(name); this.gender = gender; public String tostring() { return "Este cachorro se chama: " + name; public Gender getgender(){ return gender; Arquivo: Cow.java package abstrata; 1 1 1 1 1 public class Cow extends Animal{ static float totalmilkproduced = 0; int weight; public Cow(String name, int weight){ super(name); this.weight = weight; public String tostring() { return "Isto é uma vaca e seu nome é: " + name + "\nela possui " + weight + " kg";

Aula 06-3/9 1 1 1 20. 2 public void producemilk(float producedmilk){ Cow.totalMilkProduced += producedmilk; Arquivo: Toucan.java package abstrata; 1 1 1 1 1 public class Toucan extends Animal { String plumagecolor; public Toucan(String name, String plumage){ super(name); plumagecolor = plumage; public String tostring() { return "Isto é uma Tucano chamado de " + name + "\nque possui plumagem " + plumagecolor; INTERFACE Outro recurso muito útil proveniente da orientação a objetos é o conceito de interface CUIDADO, não confundir com interface gráfica. Uma interface modela um comportamento esperado, mas não o implementa. Ela pode ser entendida como uma classe abstrata que contêm apenas constantes e métodos abstratos. Na linguagem de programação Java, as interfaces são identificadas pela palavra interface que substitui a palavra-chave class e podem ser utilizadas inclusive para viabilizar herança múltipla. Na interface só podem ser incluídas constantes estáticas e públicas, e métodos abstratos públicos; por esse motivo, não é necessário utilizar os especificadores public, static e final. Lembrese que constantes devem ter um valor atribuído na sua declaração. Conforme dito anteriormente, uma interface modela um comportamento esperado. Este comportamento é efetivamente especificado e realizado pelas classes que implementam a interface, ou seja, que implementam os métodos que foram definidos por ela. Para indicar que uma classe implementa uma interface em Java, utilizamos a palavra-chave implements. Como uma classe pode implementar mais de uma interface, devemos separar o nome das interfaces por vírgula, caso isso ocorra. Veja o exemplo mostrado no próximo quadro que define duas interfaces e uma classe que as implementa. CURIOSIDADE: No quadro apresentado a seguir perceba que o método tostring() foi marcado como reescrito () tanto na classe Point2D como em Rectangle, contudo eles não vem de nenhuma herança explícita. Então por que do uso da marcação de reescrita? Isto vem da herança implícita da classe Object, que possui um método tostring(). Inclusive, ao sobrescrever este método, é possível usar um objeto da classe nos métodos de impressão, os quais invocaram a função tostring(). Que lindo! =)

Aula 06-4/9 Arquivo: Movable.java public interface Movable { void movevertical(int units); void movehorizontal(int units); Arquivo: Relatable.java public interface Relatable { /** * this (object calling islargerthan) and other * must be instances of the same class * @param other the object to compare to * @return returns true if this is larger than other. */ boolean islargerthan(relatable other); Arquivo: Point2D.java 1 1 1 1 1 1 public class Point2D { public int x, y; public Point2D(){ x = y = 0; public Point2D(int x, int y){ this.x = x; this.y = y; public String tostring(){ return "x: " + x + " / y: " + y; Arquivo: Rectangle.java 1 1 1 1 public class Rectangle implements Movable, Relatable { Point2D center; int width, height; public Rectangle(int w, int h){ width = w; height = h; center = new Point2D(); public int getarea(){ return width * height;

Aula 06-5/9 1 1 1 1 20. 2 2 2 2 2 2 2 2 2 30. 3 3 3 3 3 3 3 3 3 40. 4 4 public String tostring(){ return "Retângulo Info:\nCentro: " + center + "\nlargura: " + width + " Altura: " + height; public void movevertical(int units) { center.y += units; public void movehorizontal(int units) { center.x += units; public boolean islargerthan(relatable other) { if(!(other instanceof Rectangle) ) return false; Rectangle aux = (Rectangle) other; if( this.getarea() > aux.getarea() ) return true; return false; Arquivo: Main.java 1 1 1 1 1 1 1 1 public class Main { public static void main(string[] args){ Rectangle myrectangle = new Rectangle(5,5); myrectangle.movevertical( 5 ); myrectangle.movehorizontal( -2 ); System.out.println( myrectangle ); Relatable rectangleb = new Rectangle( 4, 6 ); int area = ((Rectangle) rectangleb).getarea(); System.out.println("\nÁrea do novo retângulo: "+area); if( myrectangle.islargerthan( rectangleb ) ) System.out.println("Primeiro retângulo é maior!"); else System.out.println("Segundo retângulo é maior!"); Outro detalhe que merece ser destacado é a possibilidade de uso do conceito de polimorfismo usando interfaces. Assim como uma classe derivada pode receber upcasting para sua superclasse, uma classe que implementa uma interface também pode receber upcasting para a interface a qual implementa. Isto é, um objeto de uma classe que implementa uma interface, pode se passar pela interface através de upcasting se isto for vantajoso. O contrário, downcasting, também pode ocorrer, lembrando-se de ter o cuidado de verificar o tipo da instância.

Aula 06-6/9 No exemplo apresentado no quadro anterior, a propriedade de upcasting é usada em dois momentos. Primeiro na linha 10 da classe Main, quando o segundo retângulo é criado, definindo que é do tipo (interface) relacionável (Relatable), mas é instanciado como Retângulo (até porque não se pode criar uma instância de interface). Segundo, na linha 14 da classe Main, uma chamada do método islargerthan(relatable), que é definida na linha 34 da classe Rectangle. Note que ao passar um retângulo, ocorre upcasting e ele é recebido como um objeto relacionável (Relatable). De maneira semelhante, a propriedade de downcasting também é usada pelo menos em dois momentos no programa apresentado no quadro anterior. Primeiro na linha 11 da classe Main, de modo a identificar que o objeto é um retângulo e poder utilizar o método getarea() definido na classe Rectangle. Segundo, na linha 37 da classe Rectangle. Note que neste caso foi utilizada uma verificação da instância do objeto na linha 35 da mesma classe, evitando que se outro objeto que implementa a interface Relatable seja passado como parâmetro, este não gere um erro/exceção. 1 Principais diferenças entre interfaces e classes abstratas Interfaces e classes abstratas compartilham algumas características, mas possuem suas peculiaridades próprias. A seguir é apresentada uma lista das principais diferenças entre elas: As classes abstratas podem conter atributos usuais não estáticos, além de métodos ordinários com implementação. As interfaces, por outro lado, só podem ter constantes e métodos abstratos públicos, nos quais inclusive não é necessário utilizar os identificadores: final e abstract, respectivamente, sendo que estes são inferidos automaticamente; Classes abstratas geralmente são utilizadas para compartilhar e reaproveitar pedaços de código, ao passo que interfaces costumam ter o objetivo de determinar um comportamento mínimo esperado pelas classes que a implementam; Apesar de ser possível a criação de uma classe abstrata somente com constantes e métodos abstratos, esta seria mais bem especificada como uma interface.

Aula 06-7/9 Exercícios 1) Escreva uma classe abstrata Shape com as seguintes propriedades: um atributo shapename do tipo String, um método abstrato double area() e um método tostring() que retorna o nome da forma. Escreva três classes derivadas de Shape: Sphere, RectangularPrism, e Cylinder, sendo que a esfera possui um atributo raio, o prisma retangular possui altura, largura e comprimento, e o cilindro possui raio e altura. Implemente os métodos de área para cada um deles, lembrando que a área de superfície da esfera é dada pela fórmula: 4πr 2 (onde r é o raio), a área do prisma retangular é dada por: 2(ab) + 2(ac) + 2(bc) (onde a é a altura, b é a largura e c é o comprimento) e a área do cilindro é dada pela fórmula: 2πr 2 + 2πrh (onde r é o raio e h é a altura). Implemente ainda o método tostring() para as três formas, usando o método tostring() da superclasse [use: super.tostring()] e adicionando também os valores dos atributos. Veja abaixo um exemplo do construtor da esfera: public Sphere(double r){ super("sphere"); radius = r; A seguir (próxima página) é apresentada a classe Paint que representa um tipo de tinta. Corrija o método amount() de tal forma que a quantidade correta de tinta necessária seja retornada (OBS: utilize o atributo coverage que indica quantos cm² podem ser pintados com um galão/latão de tinta e, obviamente a área da forma que foi passada como parâmetro). Na próxima página também é apresentado a classe PaintThings que contem o programa principal que seria responsável por gerar as formas e computar a quantidade de tinta necessária. O programa já instancia um tipo de tinta; cabe a você completar o programa de modo a: (1) Instanciar três formas: um retângulo prismático de 20 x 35 x 10, uma grande esfera (bigball) com um raio de 15, e um tanque cilíndrico de raio 10 e altura 30; (2) Utilize os métodos apropriados para atribuir os valores de tintas necessários as variáveis corretas.

Aula 06-8/9 //****************************************************** // Paint.java // Representa o tipo de tinta que tem uma área de cobertura fixa // por galão/latão. As medidas são em cm². //****************************************************** public class Paint{ private double coverage; //número de cm² por galão/latão /** * Construtor: Monta o objeto de pintura. */ public Paint(double c){ coverage = c; /** * Retorna a quantidade de tinta (número de galões) * necessário para pintar a forma passada como parâmetro */ public double amount(shape s){ System.out.println ("Computing amount for " + s); return 0; //************************************************************ // PaintThings.java // Computa a quantidade de tinta necessária para pintar // várias coisas //*********************************************************** import java.text.decimalformat; public class PaintThings{ public static void main (String[] args){ final double COVERAGE = 350; Paint paint = new Paint(COVERAGE); double deckamt, ballamt, tankamt; // Instancia as três formas a serem pintadas //... // Computa a quantidade de tinta necessária para cada forma //... // Mostra a quantidade de tina necessária. DecimalFormat fmt = new DecimalFormat("0.#"); System.out.println ("\n# de latões necessários..."); System.out.println ("Deck: " + fmt.format(deckamt) ); System.out.println ("Big Ball: " + fmt.format(ballamt) ); System.out.println ("Tank: " + fmt.format(tankamt) );

Aula 06-9/9 2) Implemente um sistema de agenda que salva contatos seguindo a descrição abaixo: Crie uma classe denominada Contato com pelo menos os seguintes atributos: identificador, nome, endereço, telefone, whatsapp e email. Esta classe deve ter um método construtor que recebe alguns ou todos os atributos (pelo menos os mais importantes). Utilize getters e setters se necessário para garantir que: o identificador seja um número positivo maior que zero, o nome não pode ser alterado, o telefone tenha entre 9 e 10 dígitos (formato: xxxx-xxxx ou xxxxx-xxxx) e o email deve ser vazio ou conter um @ e um ponto (.). Implemente um método tostring() que mostra os dados do contato de maneira formatada. Também crie uma interface chamada Agenda com as seguintes assinaturas de métodos: boolean adicionarcontato(contato novocontato); boolean removercontato(int identificador); Contato consultarcontato(int identificador); boolean alterarcontato(contato contato); Agora, implemente uma classe AgendaMemória que implementa a interface Agenda. Essa classe armazenará os contatos usando apenas a memória do computador. Tal classe deve ter um construtor que recebe um valor inteiro simbolizando o tamanho da agenda crie um vetor do tamanho especificado pelo usuário. Se a adição de um novo contato ultrapassar o limite estabelecido inicialmente, o método deverá retornar apenas um valor falso. Adicionalmente, a classe AgendaMemória ainda deve ter um método: void limparcontatos() que exclui todos os contatos da lista, e um método: Contato consultarnome(string nome) que consulta e retorna um contato pelo nome passado como argumento. Implemente também uma outra classe, AgendaArquivo que também implementa a interface Agenda. Essa classe armazenará os contatos usando um arquivo. O construtor desta classe deve receber uma String indicando o nome do arquivo a ser criado, ou utilizado para armazenar os dados dos contatos. Adicionalmente, esta classe ainda deve oferecer o seguinte método: consultartelefone(string telefone) o qual consulta e retorna um contato pelo telefone passado como argumento. NOTA: se o contato procurado nas consulta não for encontrado, deve-se retornar null. Por fim, implemente ainda uma classe Main que faz uso das agendas criadas e de seus métodos. Não será exigido, mas seria interessante elaborar uma interface com o usuário (no console) com um menu, através do qual ele poderá realizar as operações disponíveis. A definição da Agenda a ser usada se é a AgendaMemória ou AgendaArquivo pode ser feita antes da compilação, mas o programa deverá prever as opções de funcionalidades adicionais para cada caso.