programa o orientada a objetos em...

66
31-Aug-11 Leandro Tonietto Programação Orientada a Objetos em Java Leandro Tonietto Programaçao I Cursos de Informática da Unisinos [email protected] http://www.inf.unisinos.br/~ltonietto/inf/pg1/ProgramacaoOO_Java.pdf 08-11 segunda-feira, 5 de março de 12

Upload: doankhue

Post on 09-Nov-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

31-Aug-11 Leandro Tonietto

Programação Orientada a Objetos em Java

Leandro ToniettoProgramaçao ICursos de Informática da [email protected]://www.inf.unisinos.br/~ltonietto/inf/pg1/ProgramacaoOO_Java.pdf08-11

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 2

Sumário

Resumo/revisão sobre OOClasses simplesHerançaPolimorfismoClasses abstratas

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 3

Resumo sobre Orientação a objetos

Perceber o mundo como objetos. Tudo no mundo são objetos:

o aluno Fulano de Tal é um objeto, o aluno Beltrano também um objeto. O veículo de placas ABC-1234 é um objeto, assim como o veículo XYZ-6789.Classes são a descrição de um (ou tipo para) grupo de objetos com as mesmas propriedades e comportamentos.

Elas descrevem o que os objetos contém de atributos e como é o comportamento dos mesmosExemplos: aluno, veículo, professor, funcionário, disciplina, ...

Objetos são ocorrências especificas de uma determinada classe de objetos; assim como o aluno Fulano de Tal ou o veículo ABC-1234.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 4

Resumo sobre Orientação a objetos

Importante: classes descrevem quais (e de que tipo) são os atributos (campos, propriedades ou características) de tipo de objeto. Já o objeto mantém (possui e da manutenção) sobre os seus próprios dados.Todos alunos possuem a propriedade, porém cada um tem o seu. Então se diz que a classe declarou ou descreveu o atributo nome e cada objeto (ocorrência) da classe guarda um nome em memória.Todo objeto é responsável por encapsular os seus dados. Portanto, apenas ele pode interferir no estado das suas variáveis. Mais uma vez: a classe descreve como os objetos devem fazer a manutenção e cada objeto faz a manutenção (em tempo de execução) sobre os seus atributos ou dados.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 5

Resumo sobre Orientação a objetos

Sistemas orientados a objetos:Objetos não existem sozinhos, eles interagem com outros objetos, formando um sistema.A interação entre objetos é feita através da invocação (chamada) de métodos de um objeto por outro.

Em outras palavras, um objeto que necessite interagir com outro precisa referenciar o outro objeto e invocar os seus métodos para que estes realizem algum processamento e/ou retornem alguma informação.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 6

Resumo sobre Orientação a objetos

Exemplo de classes:

Pessoanome

idade

endereço

peso

andar(distância)

falar()

comer(comida)

Classe

métodos

atributos

Disciplinanome

Professor

Horário

Curso

definirProf(prof)

definirHorario(h)

encerrar()

iniciarAtivid()

Classe

métodos

atributos

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 7

Resumo sobre Orientação a objetos

Exemplo de interação entre objetos (sistema):

SistemaTurmadisciplinas

alunosmain()

Disciplinanome

Professor

Horário

Curso

definirProf(prof)

definirHorario(h)

encerrar()

iniciarAtivid()

main(){ Disciplina d = new Disciplina(); //... int horario = lerHorario(); d.definirHorario(horario); //...}

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 8

Codificando classes em Java

Para cada definição de classe (modelagem), criamos uma classe em Java.Cada classe em um arquivo separado.O arquivo-fonte Java é um arquivo texto com extensão .javaPara cada classe compilada, é gerado um arquivo com extensão .classO nome do arquivo deve ter exatamente o mesmo nome da classe pública.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 9

Codificando classes em JavaSintaxe para escrever uma classe:package exemplo; // veremos mais sobre pacotes no final!import java.util.Date; // importação ou uso de bibliotecaspublic class NomeDaClasse [extends Base] [implements Base]{ // atributos da classe private Tipo atributo;

// construtor(es) da classe. // O “padrão” não recebe parâmetros public NomeDaClasse(){...}

// declaração de métodos sem retorno public void nomeDoMetodo([parâmetros]){...}

// declaração de métodos com retorno public Tipo nomeDoMetodo([parâmetros]){ ... return algumaCoisa; //obrigatório!! }

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 9

Codificando classes em JavaSintaxe para escrever uma classe:package exemplo; // veremos mais sobre pacotes no final!import java.util.Date; // importação ou uso de bibliotecaspublic class NomeDaClasse [extends Base] [implements Base]{ // atributos da classe private Tipo atributo;

// construtor(es) da classe. // O “padrão” não recebe parâmetros public NomeDaClasse(){...}

// declaração de métodos sem retorno public void nomeDoMetodo([parâmetros]){...}

// declaração de métodos com retorno public Tipo nomeDoMetodo([parâmetros]){ ... return algumaCoisa; //obrigatório!! }

Conceito de interface será visto mais adiante na disciplina

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 10

Codificando classes em Java

Exemplo:Pessoa

# nome# dataNascimento# cpf

+Pessoa(nome)+setNome(nome)+setDataNascimento(data)+setCPF(cpf)+getNome()+getDataNascimento()+getCPF()

Aluno

- matrícula

+Aluno(nome, matrícula)+setMatricula(matricula)+getMatricula()

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 10

Codificando classes em Java

Exemplo:Pessoa

# nome# dataNascimento# cpf

+Pessoa(nome)+setNome(nome)+setDataNascimento(data)+setCPF(cpf)+getNome()+getDataNascimento()+getCPF()

Aluno

- matrícula

+Aluno(nome, matrícula)+setMatricula(matricula)+getMatricula()

Quantos arquivos .java codificaremos?

Segundo o padrão, qual deve ser o nome de cada arquivo?

Por arquivo devemos começar?

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 10

Codificando classes em Java

Exemplo:Pessoa

# nome# dataNascimento# cpf

+Pessoa(nome)+setNome(nome)+setDataNascimento(data)+setCPF(cpf)+getNome()+getDataNascimento()+getCPF()

Aluno

- matrícula

+Aluno(nome, matrícula)+setMatricula(matricula)+getMatricula()

Quantos arquivos .java codificaremos?

Segundo o padrão, qual deve ser o nome de cada arquivo?

Por arquivo devemos começar?

Respostas: Dois, um para cada classe Pessoa.java e Aluno.java Pela classe Pessoa, pois

Aluno depende de Pessoa para existir!

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 11

Codificando classes em Java

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 11

Codificando classes em JavaSintaxe para escrever a classe Pessoa (arquivo Pessoa.java):package exemplo; // pacote da classeimport java.util.Date; // importação de bibliotecaspublic class Pessoa { // atributos da classe protected String nome; // classe Date implementa objeto de data

protected Date dataNascimento; protected long cpf;

// construtor(es) da classe public Pessoa(String n){ nome = n; cpf = 0; dataNascimento = null; }

public void setNome(String n){ nome = n;} public String getNome(){ return nome; } public void setDataNascimento(Date d){ dataNascimento = d; } public Date getDataNascimento(){ return dataNascimeneto; } public void setCPF(long c){ cpf = c; } public long getCPF() { return cpf; }

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 11

Codificando classes em JavaSintaxe para escrever a classe Pessoa (arquivo Pessoa.java):package exemplo; // pacote da classeimport java.util.Date; // importação de bibliotecaspublic class Pessoa { // atributos da classe protected String nome; // classe Date implementa objeto de data

protected Date dataNascimento; protected long cpf;

// construtor(es) da classe public Pessoa(String n){ nome = n; cpf = 0; dataNascimento = null; }

public void setNome(String n){ nome = n;} public String getNome(){ return nome; } public void setDataNascimento(Date d){ dataNascimento = d; } public Date getDataNascimento(){ return dataNascimeneto; } public void setCPF(long c){ cpf = c; } public long getCPF() { return cpf; }

Pessoa

# nome# dataNascimento# cpf

+Pessoa(nome)+setNome(nome)+setDataNascimento(data)+setCPF(cpf)+getNome()+getDataNascimento()+getCPF()

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 11

Codificando classes em JavaSintaxe para escrever a classe Pessoa (arquivo Pessoa.java):package exemplo; // pacote da classeimport java.util.Date; // importação de bibliotecaspublic class Pessoa { // atributos da classe protected String nome; // classe Date implementa objeto de data

protected Date dataNascimento; protected long cpf;

// construtor(es) da classe public Pessoa(String n){ nome = n; cpf = 0; dataNascimento = null; }

public void setNome(String n){ nome = n;} public String getNome(){ return nome; } public void setDataNascimento(Date d){ dataNascimento = d; } public Date getDataNascimento(){ return dataNascimeneto; } public void setCPF(long c){ cpf = c; } public long getCPF() { return cpf; }

O que significa declarar um atributo com modificador protected?

Pessoa

# nome# dataNascimento# cpf

+Pessoa(nome)+setNome(nome)+setDataNascimento(data)+setCPF(cpf)+getNome()+getDataNascimento()+getCPF()

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 12

Codificando classes em Java

Considerações sobre a classe PessoaAtributos protected são privados ao meio externo, com exceção das classes-derivadas (ou subclasses)Normalmente, se um atributo é privado ou protegido, deve-se ter alguma forma defini-lo (set) ou obtê-lo (get) de visibilidade pública.Métodos GET e SET são uma conveção ou padrão para programação. A maioria das bibliotecas e programas utilizam estes prefixos nos nomes dos métodos para, respectivamente, obter e definir o valor de um atributo.Construtor tem a mesma grafia que a classe.Objeto do tipo Date permite encapsulamento de um dado como uma data. Datas, apesar de serem tipos de dados comuns, não são um tipo de dado primitivo; há um classe que encapsula seu comportamento e atributos em java: java.util.Date.A classe Pessoa contém apenas os dados e atributos relativos a uma pessoa, apenas isso. Não é um sistema orientado a objetos, apenas um componente de um sistema.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 13

Codificando classes em Java

Herança:Na programação OO, quando falamos em herança, dizemos que uma classe herda de outra e estende as suas funcionalidades.Em Java, para indicar que uma classe estende outra, usamos o “comando”: extends.Quando uma classe B estende uma classe A, significa que B possui os mesmos comportamentos e atributos de A e ainda define os próprios.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 14

Codificando classes em JavaHerança em Java (arquivo Aluno.java):package exemplo; // pacote da classepublic class Aluno extends Pessoa { // atributos da classe private int matricula; // construtor(es) da classe. // Se o da classe Pessoa possui algum atributo, // o da classe Aluno deve contemplá-lo. public Aluno (String n, int m){ // invoca algum construtor da classe-base super(n); matricula = m; }

public void setMatricula(int m){ matricula = m;} public int getMatricula(){ return matricula; } public void imprimir(){ super.imprimir(); System.out.println(“Matricula: ”+matricula); }

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 14

Codificando classes em JavaHerança em Java (arquivo Aluno.java):package exemplo; // pacote da classepublic class Aluno extends Pessoa { // atributos da classe private int matricula; // construtor(es) da classe. // Se o da classe Pessoa possui algum atributo, // o da classe Aluno deve contemplá-lo. public Aluno (String n, int m){ // invoca algum construtor da classe-base super(n); matricula = m; }

public void setMatricula(int m){ matricula = m;} public int getMatricula(){ return matricula; } public void imprimir(){ super.imprimir(); System.out.println(“Matricula: ”+matricula); }

Aluno possui nome? E os métodos getNome e setNome? Porque?

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 14

Codificando classes em JavaHerança em Java (arquivo Aluno.java):package exemplo; // pacote da classepublic class Aluno extends Pessoa { // atributos da classe private int matricula; // construtor(es) da classe. // Se o da classe Pessoa possui algum atributo, // o da classe Aluno deve contemplá-lo. public Aluno (String n, int m){ // invoca algum construtor da classe-base super(n); matricula = m; }

public void setMatricula(int m){ matricula = m;} public int getMatricula(){ return matricula; } public void imprimir(){ super.imprimir(); System.out.println(“Matricula: ”+matricula); }

Aluno

- matrícula

+Aluno(nome, matrícula)+setMatricula(matricula)+getMatricula()

Aluno possui nome? E os métodos getNome e setNome? Porque?

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 15

Codificando classes em Java

Classe Aluno:Deve declarar e implementar os seus atributos e métodos.Possui todos os atributos e métodos de Pessoa. Aluno é uma Pessoa.Para indicar herança, usar comando extendsA classe e os objetos Aluno não tem acesso direto aos atributos private de Pessoa. Ela tem acesso apenas aos públicos e protegidos.Objeto super se refere a classe-base. Comando super() se refere ao construtor da classe-base.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 16

Codificando classes em Java

Criando objetos e fazendo o sistema funcionar:Para se utilizar um objeto da classe é necessário criar uma instância (alocar memória). Utilizando o operador new:

Aluno a; // declaração do objetoa = new Aluno(“Fulano”, 1233); // instanciação

Classe principal:É aquela que possui o método:

public static void main(String args[])

Todos os objetos e métodos utilizados neste arquivo / classe devem ser estáticos, pois o método main é estático.Objetos podem ser criados dentro do main.

É a classe por onde a JVM começa a execução de um sistema Java.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 17

Codificando classes em Java

Instanciação de objetos//em algum lugar do main...

// apenas declaração

Pessoa p;

// apenas declaração

Aluno a;

// instanciação/alocação

p = new Pessoa(“Beltrano”);

// instanciação/alocação

a = new Aluno(“Fulano”, 123);

Pessoa p

Aluno a

new Pessoa:nome=Beltrano

new Aluno:

matricula=123

new Pessoa alocada pelo new Aluno:nome = Fulano

Memória

Repare que a instanciação de Pessoa aloca uma área de memória de tamanho X. Já a alocação de Aluno, aloca uma quantidade X + Y; onde X é a área ocupada por um objeto Pessoa e Y é a área necessária para armazenar informação específicas de Aluno. Lembre-se: O Aluno É uma Pessoa, portanto carrega todas as propriedades de Pessoa também.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 18

Codificando classes em Java

Classe principal:package exemplo;public class Programa { public static void main(String args[]){ // objeto apenas declarado Aluno a; // objeto sendo instanciado. // neste momento o construtor é invocado a = new Aluno(“Fulano”, 1233); System.out.println(“Nome: “+a.getNome()); }}

O que faz este programa?

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 19

Codificando classes em Java

Exercício 1 – Modelar e programar:Fazer uma calculadora que executa as operações aritméticas básicas: adição, subtração, multiplicação, divisão e módulo.As operações devem ser realizadas sobre número do tipo float.O programa deve criar uma calculadora, mostrar um menu das opções de operação, ler uma opção, solicitar o cálculo para objeto calculadora e imprimir o resultado.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 20

Codificando classes em JavaExercício 2 – Modelar e programar

Agenda de contatos. O sistema de agenda deve manter uma lista de contatos. Um contato padrão tem: nome, e-mail, telefone, endereço e data do aniversário. Porém o contato pode ser enquadrado como de algum tipo específico: geral, cliente ou fornecedor. Para fornecedor, é interessante manter-se um índice de qualidade, pois pode ser necessário ter de escolher 1 entre vários fornecedores de um mesmo produto. Já para o cliente, deve-se atribuir uma data da última compra e uma classificação de fidelidade (ou valores possíveis são: fiel, freqüente, pouco freqüente e apenas uma vez). Por fim, da categoria geral, não é necessário guardar mais nenhum dado além dos do contato.O programa da agenda deve manter um menu de opções do programa: incluir contato (acrescenta no array), excluir contato (retirar do array), listar contatos, consulta dados de um contato e sair.OBS:

repare que a remoção de um contato do início ou “meio” array implica em mover os posteriores para a frente.A inclusão de contatos ocorrente sempre no final do array.Dica: manter um apontador para o último índice utilizado. Por exemplo, supondo que o array tem capacidade para 20 elementos e apenas cinco contatos foram incluídos, então esta variável deveria estar com valor 4 (array começa com zero...)

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 21

Codificando classes em Java

PolimorfismoPolimorfismo é a capacidade de assumir formas diferentes.Em termos de orientação a objetos, significa que uma mesma operação pode ser definida por diversas classes, cada uma implementando a operação de uma maneira própria.Polimorfismo permite que o programador acesse um método de um objeto sem saber exatamente de qual classe específica o método esta sendo acessado

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 22

Codificando classes em Java

Sobreposição (overwriting)Métodos com a mesma assinatura que são sobrescritos (substituídos). Por exemplo, um método declarado na superclasse, se redefinido na subclasse, é substituído por este em tempo de execução.

Sobrecarga (overloading)Métodos com mesmo nome em uma classe podem executar operações de maneiras distintas. Isso é permitido pela diferenciação na passagem de parâmetros.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 23

Codificando classes em Java

Polimorfismo (exemplo de sobrescrita):A classe Pessoa possui método imprimir() que imprime o nome e o código da pessoa.A classe Aluno estende a classe Pessoa e também possui o método imprimir(). Um objeto é declarado como da classe Pessoa, porém é instanciado como Aluno.Pessoa p = new Aluno(“Fulano”, 1233);

p.imprimir();

Quando o método imprimir() for invocado deste objeto, o interpretador chamará o método da classe Aluno. Se diz que o método foi sobrescrito.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 24

Codificando classes em Java

Polimorfismo (exemplo de sobrecarga):Considere uma classe FuncoesMatematicas que possui os métodos menor, maior, arredondar e absoluto.Eles possuem variações das suas assinaturas para parâmetros diferentes. Por exemplo, o método menor pode retornar o menor valor entre dois dados do tipo float, double, int ou long. O mesmo vale para as outras funções/métodos.Conforme o tipo de parâmetro passado para classe no momento de invocar o método, o interpretador sabe qual é o método mais adequado a ser utilizado.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 25

Codificando classes em Java

Ainda sobre sobrecarga, considere o código:Retangulo r = new Retangulo();r.setLargura(100, 200);r.setLargura(0.5f, 0.7f);

Os métodos setLargura definem a largura do retângulo.Os dois tem o mesmo nome, mas cada um solicita um tipo de parâmetro, respectivamente, int e float.O compilador sabe qual método invocar pelo tipo de dado passado por parâmetro: isto é sobrecarga.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 26

Codificando classes em Java

A classe ObjectPode-se considerar a classe “mãe-de-todas”.É a classe base para qualquer outra em Java. Não necessita da instrução extends; é automática.Sendo assim, todo objeto instanciado como de uma classe X é um subtipo de Object. Portanto, todos os objetos são instâncias de Object.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 27

Codificando classes em Java

A classe Object. Métodos herdados:public String toString(){...}

Retorna uma representação de String do objetoPor padrão, retorna:

getClass().getName()+'@'+Integer.toHexString(hashCode())

Pode ser sobrescrito para imprimir alguma informação do objeto:System.out.println(funcionario);

Pode imprimir os dados do funcionário: nome + “ salário: ”+salario;

public boolean equals(Object outroObjeto){...} Testa se o objeto é igual a outroObjetoDeve ser sobrescrito para indicar quando um objeto é igual a outro do mesmo tipo, por exemplo, dois funcionários são iguais quando tem o mesmo nome apenas.

public Object clone() {...}Retorna uma instância nova de um objeto com os dados do objeto; áreas de memória diferente, mas com os mesmos dados.É diferente de um = outro.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 28

Exemplo/Exercício:Classe Funcionário com os atributos matricula, nome e salário. Tem também a implementação (sobrescrita) dos métodos equals(), toString() e clone().Classe Departamento com os atributos nome e código. Sem a sobrescrita dos métodos equals(), toString() e clone().Classe main ...

Codificando classes em Java

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 29

Exemplo/Exercício:Funcionario f1 = new Funcionario(1, "Fulano", 1000.0);Funcionario f2 = new Funcionario(1, "Fulano", 1000.0);Departamento d1 = new Departamento(1, "Informática");Departamento d2 = new Departamento(1, "Informática");System.out.println("d1="+d1);System.out.println("d2="+d2);System.out.println("f1="+f1);System.out.println("f2="+f2);System.out.println("f1 == f2? "+(f1==f2));System.out.println("d1 == d2? "+(d1==d2));System.out.println("f1.equals(f2)? "+(f1.equals(f2)));System.out.println("d1.equals(d2)? "+(d1.equals(d2)));Funcionario f3 = (Funcionario)f1.clone();System.out.println("f3="+f3);System.out.println("f1==f3? "+(f1==f3));System.out.println("f1.equals(f3)? "+(f1.equals(f3)));

Codificando classes em Java

?

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 30

Codificando classes em Java

Conversão de tipo (Type casting):Cast implícito (tipos primitivos apenas):

Quanto ocorre um down casting por exemplo: long para double, int para double, short para float ou double, byte para float ou double

double = float = long = int = short = byte;

Entre objetos também ocorre: Pessoa p = professor;

Isto é possível porque o Professor é uma Pessoa (herança); caso contrário, da erro;

Cast explícito:Situações aonde não é possível o implícito . Conversão de objetos de classes diferentes. Por exemplo, um objeto Pessoa para Professor. Só é possível para objetos que pertençam a uma mesma hierarquia.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 31

Codificando classes em Java

Continuação do exemplo:Importante: o imprimir de Aluno pode reaproveitar o imprimir da pessoa. Reescrevendo o método:public void imprimir(){ // imprime nome: imprimir da super-classe super.imprimir(); System.out.println(“Matrícula: ”+matricula);}

Ao executar, considerando os dados fictícios abaixo, será:nome: Fulano de Tal

matrícula: 123456

imprimir() da classe Pessoaimprimir() da classe Aluno

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 32

Codificando classes em Java

Classes abstratasSão classes que não possuem implementação em alguns métodosUma classe abstrata obriga que alguma classe filha implemente os seus métodos abstratos.Recurso utilizado quando a classe base não sabe ou não pode implementar um determinada ação, mas é obrigatório que as filhas implementem. Isto é possível porque a classe base (abstrata) sinaliza os métodos que devem ser implementados.A palavra é: Polimorfismo!!

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 33

Codificando classes em Java

Classes abstratasExemplo:

Uma classe FormaGeometrica é utilizada para descrever propriedades comuns a todas as classes de formas geométricas (elipses, retângulos, polígonos, triângulos, ...)A classe FormaGeometrica não sabe calcular a área de uma forma geométrica desconhecidaEntretanto, cada das classes das formas geométricas específicas, sabe como é o próprio cálculo de área.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 34

Codificando classes em Java

Classes abstratasExemplo:

Elipse Retangulo

FormaGeometrica

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 35

Codificando classes em Java

Classes abstratasExemplo:

FormaGeometricaint x, yabstract int calcArea()

Elipse:FormaGeometriaint ladoA, ladoBint calcArea()

Retangulo:FormaGeometricaint larg, altint calcArea()

Um método abstract não é implementado, contém apenas a assinatura

Classes derivadas (ou filhas) devem implementar os métodos abstratos da

classe base

Código ExemploAbstratas para visualizar os exemplos de classe abstrata (método abstract)

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 36

Codificando classes em Java

Considere o código:FormaGeometrica fg = new Retangulo();fg.setLargAlt(0.1f,0.2f);System.out.println(“Área: ” + fg.calcArea());

Mesmo variável sendo do tipo FormaGeometrica é invocado o calcula área da classe Retangulo. Isto porque fg é um ponteiro declarado como FormaGeometrica, mas a instância (memória alocada) é da classe Retangulo. Portanto, os métodos (sobrescritos) utilizados são os da classe Retangulo. Isto ocorre também, porque o método calcArea() é abstrato, portanto, não há implementação nele na classe-base, que é abstrata.Porém, repare que os métodos da classe Retangulo que não são sobrescritos devem ser acessados através de um cast (conversão explicita de tipos) para (Retangulo). No exemplo, setLargAlt só existe na classe Retangulo e não na FormaGeometrica.Este tipo de uso de objetos com herança, onde um objeto (ou variável) é declarado como da classe base e instanciado como da classe filha, o inverso não é possível.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 37

Codificando classes em Java

Analisando a relação com a classe Elipse. Código-fonte classe FormaGeometrica: public abstract class FormaGeometrica { // posição do objeto protected float x, y; // gets e sets... // métodos abstratos public abstract float calcArea(); public abstract void desenha();}

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 38

Codificando classes em Java

Analisando a relação com a classe Elipse. Código-fonte classe Elipse:public class Elipse extends FormaGeometrica{ private float a, b; public float calcArea(){ return a * b * Math.PI; } public void desenha(){ // desenha um círculo }}

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 39

Codificando classes em Java

Pacotes:São como diretórios do sistema operacionalAgrupam as classes por funcionalidades:

Por exemplo, as classes da biblioteca do Java (API) que manipulam banco de dados, estão sob o pacote java.sqlJá as classes que manipulam entrada e saída de dados, estão no pacote java.io

No código-fonte Java, a primeira instrução deve ser o pacote ao qual a classe faz parte. Deve-se usar a palavra reservada package. Exemplo:package br.unisinos.prog1.exemplos.exemplo1;

O caractere “.” indica a separação dos subpacotes.Quando compilador traduz um código-fonte para código de máquina, ele cria os diretórios do pacote informado na instrução package do código-fonte.No momento de utilizar uma classe, ela deve ser referenciada pelo seu pacote ou o mesmo deve estar na instrução import:import br.unisinos.prog1.exemplos.exemplo1.Elipse;

No momento de executar uma aplicação, ela deve ser referenciada pelo seu pacote:java br.unisinos.prog1.exemplos.exemplo1.Main

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 40

Codificando classes em Java

Modificador de visibilidade package-friendlyMinimiza o encapsulamentoTorna os atributos e métodos públicos apenas para as classes do mesmo pacote e determina acesso privado a todas as demais classes.Para usar este tipo de visibilidade basta não declarar nenhuma visibilidade para os atributos e métodos.Veja exemplo sobre package-friendly.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 41

Codificando classes em Java

Exercício 3 - Modelar e implementar:Criar uma classe criptografia que contenha métodos para criptografar e descriptografar uma mensagem de texto. O algoritmo de criptografia é de livre escolha para o programador. É sugerido o algoritmo de substituição por deslocamento. Por exemplo, para o deslocamento 2, uma letra ‘A’ é cifrada como ‘C’, a ‘L’ como ‘N’, a ‘Z’ como ‘B’, ... Para decifrar, basta diminuir o deslocamento: um ‘C’ volta para ‘A’, ‘B’ volta para ‘Z’,... No programa principal ler uma mensagem do usuário e imprimir os resultados das operações de cifrar e decifrar uma mensagem.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 42

Codificando classes em Java

Exercício 4 - Modelar e implementarSistema de cálculo e impressão de informações de objetos geométricos. O sistema deve permitir a impressão de uma forma geométrica qualquer sem a necessidade de saber antecipadamente de qual tipo específico a forma é. Entretanto, o sistema deve suportar apenas as seguintes formas: retângulo, elipse e triângulo. Todas são formas geométricas, portanto, possuem método de cálculo de área, cálculo do perímetro e impressão dos dados. Dica: aqui deve ser usado o conceito de classe abstrata na modelagem e, em caso de construção deste sistema, use sobrecarga de operadores para impressão dos dados e área das formas geométricas.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 43

Interface

Interface é um tipo de classe do JavaToda interface contém apenas atributos estáticos e assinatura de métodos públicosA interface fornece um tipo para uma classe.Se diz que uma classe implementa uma interface (equivalente a estender na herança de classes)Palavra reservada interface para criar uma interface.Palavra reservada implements para implementar uma interface numa classe.

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 44

Interface

A grande utilidade do uso de interfaces é fornecer um subtipo para classes para sejam utilizadas por outras que as “desconhecem”.Outra vantagem é que uma classe pode implementar tantas interfaces quantas forem necessárias, permitindo uma herança múltipla. O que não é possível com herança simples (extends).

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 45

Interface

Exemplo:Digamos que seja necessário criar uma classe que imprima qualquer classe que seja imprimível. Podemos chamar esta classe de Impressora.Para determinar quem é imprimível de Imprimivel.Sendo assim, todas as classes que são subtipo (filhas) de Imprimivel podem ser impressas.Existem duas possibilidades para se resolver este problema:

1. Fazer uma herança simples: todas as classes que estenderem uma classe Imprimivel serão objeto deste tipo, portanto podem ser utilizadas na classe Impressora.

2. Fazer uma herança através de interface: todas as classes que implementarem a interface Imprimivel, poderão serem utilizadas pela classe Impressora. (Melhor solução)

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 46

Interface

Exemplo:public class Impressora { public void imprimir(Imprimivel o){ // ... Algum código o.getBytes(); }}

public interface Imprimivel { public byte[] getBytes();}

segunda-feira, 5 de março de 12

31-Aug-11 Leandro Tonietto 47

Interface

Exemplo:public class Teste implements Imprimivel {

public byte[] getBytes(){

return “Teste”.getBytes();

}

}

public class Teste2 implements Imprimivel {

public byte[] getBytes(){

return “Teste 2 – outra classe”.getBytes();

}

}

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 24

Interfaces

• Uma interface não pode possuir nenhuma implementação;

• Todos os métodos são abstratos, mesmo que o programador omita o modificador abstract;

• Todos os métodos são públicos, mesmo que o modificador public seja omitido;

• Todas as variáveis em uma interface são constantes, mesmo que não sejam declaradas como static final;

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 25

Interfaces

interface MinhaInterface { int getSize ( ); void setSize (int param);}

class MinhaClasse implements MinhaInterface{ int size; public int getSize ( ) { return size; } public void setSize (int tam) { size = tam; }}

Não é possível criar uma instância de uma interface.

Para criar uma instância é preciso implementar a

interface.

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 26

Interfaces

• Java não permite herança múltipla, por isso uma classe pode ser subclasse(extends) apenas de uma superclasse, mas implementar (implements) várias interfaces.

• Podemos declarar classe abstrata Shape como interface:– retirar implementação do método Type();– as classes que implementam Shape podem herdar

propriedades de outra classes.

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 27

Inner Class

• Inner class, ou nested class, é um conceito que surgiu a partir da versão JDK 1.1. Nas versões anteriores do JDK eram permitidas apenas classes top-level que pertenciam a pacotes.

• A partir da versão JDK 1.1, o Java suporta classes que são membros de outras classes, ou seja, classes que são definidas dentro do escopo de uma outra classe ou são anônimas, definidas dentro de uma expressão.

• Inner classes são um fenômeno do compilador e não do interpretador. Ou seja, o compilador gera o código necessário para que a inner class acesse os dados da enclosing class.

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 28

• As inner classes tem as seguintes propriedades:– O nome da inner class tem que ser diferente do nome da

enclosing classe (classe o qual está dentro).– A inner classe pode usar variáveis e métodos da enclosing

classe.– A inner classe pode ser definida como abstract.– A inner classe pode ser uma interface implementada por

outra inner classe.– Inner classes podem ser declaradas private ou protected.

Os modificadores de proteção não previnem a inner classe de acessar variáveis membros de outras classes e da enclosing class.

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 29

– Outras classes, que não a enclosing classe, não enxergam a inner classe.

– Inner classes podem acessar variáveis private da enclosing class.

– Se uma inner classe for declarada como static, ela se torna uma top-level classe e perde a capacidade de acessar variáveis da enclosing class.

– Inner classes não podem possuir variáveis membros static. Se a inner classe precisa usar uma variável static, essa variável deve ser declarada na enclosing class.

– A enclosing class pode acessar livremente os dados da inner class, mesmo os privados (private).

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 30

import java.awt.*; import java.awt.event.*; public class TestaInnerClass { private Frame f; private TextField tf; public static void main (String args []) { TestaInnerClass inner = new TestaInnerClass (); inner.inicio(); } public void inicio () { f = new Frame ("Exemplo de Inner Class"); f.add (new Label ("Clique e arraste o mouse aqui."),

BorderLayout.NORTH);

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 31

tf = new TextField (30); f.add (tf, BorderLayout.SOUTH); f.addMouseMotionListener (new Tratador1()); f.addMouseListener (new Tratador2()); f.setSize(300, 200); f.setVisible(true); } // A classe Tratador1 é uma inner classe public class Tratador1 extends MouseMotionAdapter { public void mouseDragged (MouseEvent e) { String s = "Mouse Dragging: X = " + e.getX() + " Y = " +

e.getY(); tf.setText (s); } } // da inner class Tratador1

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 32

public class Tratador2 extends MouseAdapter { public void mouseEntered (MouseEvent e) { String s = "Mouse entrou"; tf.setText (s); } public void mouseExited (MouseEvent e) { String s = "Mouse saiu"; tf.setText (s); } } // da inner class Tratador2 } // da enclosing class TestaInnerClass

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 33

Classes Anônimas (Anonymous Class) f.addMouseMotionListener (new MouseMotionAdapter ( )

{

public void mouseDragged (MouseEvent e) {

String s = "Mouse Dragging: X = " + e.getX( ) + " Y = " + e.getY( ); tf.setText (s);

}

}

);

• Classes Anônimas não possuem métodos construtores. Os parâmetros são repassados ao construtor da classe pai.

segunda-feira, 5 de março de 12

Profa. Patrícia A. Jaques 34

Garbage Collection

String str = “Primeiro espaço”; System.out.println (“Usando memória original: “+str); str = “Outro espaço”; System.out.println (“Usando outro espaço de memória:

“+str);

10 100str

Primeiro espaço

Outro espaço

10

100

Área de memória liberada pelo Garbage

Collection

segunda-feira, 5 de março de 12