Linguagem Java - Conceitos e Técnicas

55.363 visualizações

Publicada em

Aprender a linguagem Java e conceitos de POO (Programação Orientada a Objetos)

Publicada em: Tecnologia
3 comentários
25 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
55.363
No SlideShare
0
A partir de incorporações
0
Número de incorporações
28
Ações
Compartilhamentos
0
Downloads
1.585
Comentários
3
Gostaram
25
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Linguagem Java - Conceitos e Técnicas

  1. 1. Java PUC-MG Prof.ª Kecia Aline Marques Ferreira
  2. 2. Conceitos e Técnicas Obtendo Java Conceitos Fundamentais Pacotes Operadores e Estruturas de Controle Tipos Básicos Modificadores Semântica de Referência Arranjos Composição de Objetos Passagem de Parâmetros Herança Classes Abstratas Interfaces Polimorfismo Tratamento de Exceções Kecia Marques 2
  3. 3. Obtendo JAVA Kecia Marques 3
  4. 4. Sun Microsystems Java é uma linguagem de programação orientada por objetos amplamente difundida. Foi desenvolvida pela Sun Microsystems por James Gosling. Na linguagem Java, é gerado um código intermediário, denominado bytecode, a ser interpretado e executado pela JVM (Java Virtual Machine). A vantagem disso é o alto grau de portabilidade dos programas. .java são os arquivos de código fonte .class são os arquivos compilados, os bytecodes. Kecia Marques 4
  5. 5. Para utilizar Java Site oficial de Java: http://java.sun.com/ Para utilizar Java é preciso: Baixar e instalar o JDK: Java SE Development Kit Preferencialmente baixar e instalar uma ferramenta IDE. Exemplos de IDE free: Eclipse: www.eclipse.org NetBeans: da Sun, disponível em http://java.sun.com/ Kecia Marques 5
  6. 6. Para saber mais sobre Java Tutorial da Sun: http://java.sun.com/developer/onlineTraining/ Deitel, H. M.; Deitel, P. J. Java - Como Programar. 6. ed. Prentice-Hall, 2005. Kecia Marques 6
  7. 7. Conceitos Fundamentais Kecia Marques 7
  8. 8. Classe “Uma classe é um conceito OO que encapsula as abstrações de dados e procedimentos necessários para descrever o conteúdo e o comportamento de alguma entidade do mundo real”. Pressman, 2002. Uma classe é a implementação do objeto, seus serviços e propriedades destes serviços. Uma classe corresponde a um TAD (tipo abstrato de dados) Kecia Marques 8
  9. 9. TAD TAD (Tipo abstrato de dados) é a representação encapsulada de um tipo definido pelas suas operações TAD e “uma estrutura de programação na qual uma determinada estrutura de dados é conhecida somente via as operações realizadas sobre os seus elementos de dados, sem que se identifique como a estrutura é codificada” Staa, 2000 A programação orientada por objetos é o resultado do uso da abstração de dados no desenvolvimento de softwares Kecia Marques 9
  10. 10. Objeto Uma classe descreve uma categoria genérica. Um objeto é uma instância de uma classe. Uma instância de uma classe é uma estrutura de dados que representa um membro específico da categoria. Exemplo: classe: Aluno são objetos da classes Aluno: João, Paulo, Sílvia, Marina, Jurema, Felício. Objeto é uma estrutura computacional que representa um objeto do mundo real. Kecia Marques 10
  11. 11. Membros de uma classe Uma classe possui: Atributos: também denominados membros de dados ou campos. Representam as características que os objetos da classe possuem. Métodos: também denominados membros de função ou operações. Representam o comportamento que os objetos da classe possuem. Kecia Marques 11
  12. 12. Um exemplo simples – Conta Corrente Seja o contexto de automação bancária. Identificam-se as seguintes classes neste contexto: cliente, agência, conta, conta corrente, conta poupança, dentre outras. A figura a seguir mostra a estrutura da classe ContaCorrente. Kecia Marques 12
  13. 13. Um exemplo simples – Conta Corrente Atributos: numero, agência e saldo. Métodos: depositar, sacar, consultar saldo. Kecia Marques 13
  14. 14. Um exemplo simples – Conta Corrente O código a seguir mostra uma implementação possível para esta classe em Java. public class ContaCorrente { private long numero; private int agencia; private double saldo; public ContaCorrente(long n, int ag) { numero = n; agencia = ag; saldo = 0.0; } Kecia Marques 14
  15. 15. Um exemplo simples – Conta Corrente public void sacar(double valor){ if (valor > 0) saldo = saldo - valor; } public void depositar(double valor){ if (valor > 0) saldo = saldo + valor; } public double consultarSaldo(){ return (saldo); } } Kecia Marques 15
  16. 16. Um exemplo simples – Conta Corrente No exemplo, o método ContaCorrente (de mesmo nome da classe) é denominado construtor. Um método construtor é utilizado para determinar o estado inicial do objeto. Em Java, objetos são criados utilizando-se a palavra reservada new. Kecia Marques 16
  17. 17. Criação de Objetos 1 ContaCorrente minhaConta; 2 minhaConta = new ContaCorrente(12345, 236); A linha 1 cria uma área na memória que é uma referência para um objeto da classe ContaCorrente. minhaConta Kecia Marques 17
  18. 18. Criação de Objetos 1 ContaCorrente minhaConta; 2 minhaConta = new ContaCorrente(12345, 236); A linha 2 cria cria um objeto da classe ContaCorrente e o atribui a minhaConta; Numero = 12345 minhaConta Agencia = 236 Saldo = 0 Kecia Marques 18
  19. 19. Comunicação entre Objetos Programas orientados por objetos são constituídos por objetos que trocam mensagens entre si. O envio de uma mensagem a um objeto corresponde a invocar um método de tal objeto. Kecia Marques 19
  20. 20. Comunicação entre Objetos Em minhaConta.depositar(350.00); O método depositar do objeto minhaConta é invocado. Em outras palavras, é enviada uma mensagem para o objeto minhaConta para que este realize a operação depositar. Kecia Marques 20
  21. 21. Interface de Classe Uma classe é conhecida externamente por sua interface, que descreve os serviços que ela fornece e como eles podem ser utilizados, ocultando a sua implementação. Os membros públicos de uma classe constituem a sua interface. Informações que fazem parte da interface da classe: nome da classe; assinatura dos construtores e métodos públicos da classe; atributos públicos da classe. Kecia Marques 21
  22. 22. Exercício Para o exemplo de automação bancária citado anteriormente: a) Identifique os atributos e os métodos das classes Cliente e Conta Poupança. b) Implemente a classe Cliente em Java. Kecia Marques 22
  23. 23. Pacotes Kecia Marques 23
  24. 24. Organização de Classes Em Java classes são organizadas em pacotes. Um pacote é um conjunto de classes relacionadas. A palavra package indica o pacote ao qual a classe pertence. Kecia Marques 24
  25. 25. Organização de Classes Exemplo: package rh; public class Funcionario { //corpo da classe funcionario } (A classe Funcionario está dentro de um pacote chamado rh. No Windows, um pacote corresponde a uma pasta onde ficam armazenadas as suas classes). Kecia Marques 25
  26. 26. Organização de Classes Exemplo: o JUnit (uma biblioteca open source para realizar testes em software Java) possui os pacotes extensions, framework, runner e textui. Kecia Marques 26
  27. 27. Organização de Classes Quando uma classe necessita utilizar uma outra classe que não esteja em seu pacote é necessário importar o pacote da classe a ser utilizada. Isso é feito incluindo um comando import no início do código do arquivo .java. Exemplo: se quisermos utilizar a classe Date da API de Java, temos que importar o seu pacote. import java.util.*; Kecia Marques 27
  28. 28. Organização de Classes Cada ferramenta IDE tem uma estrutura particular para armazenar os arquivos de um projeto. Por exemplo, o Net Beans organiza os arquivos de acordo com a estrutura a seguir: build: contém os arquivos bytecodes compilados (.class) organizados em pacotes dist: contém o arquivo .jar gerado nbprojetc: contém arquivos de configuração gerados pelo Net Beans. src: onde ficam os arquivos fontes (.java) organizados em pacotes Kecia Marques 28
  29. 29. Organização de Classes Kecia Marques 29
  30. 30. Operadores e Estruturas de Controle Kecia Marques 30
  31. 31. Operadores Algumas estruturas utilizadas em Java são muito semelhantes às de C/C++ Início de fim de blocos são marcados com { } Os operadores utilizados em Java são basicamente os mesmos utilizados em C/C++: Aritméticos: + - / * % ++ -- Relacionais: == != >= <= Atribuição: = Lógicos: && || ! Kecia Marques 31
  32. 32. Estruturas de controle Estruturas de controle Condicional: if (condição){ comandos; } if (condição){ comandos; } else{ comandos; } Kecia Marques 32
  33. 33. Estruturas de controle Escolha: switch (expressão){ case constante1: comandos; break; case constante2: comandos; break; ... default: comandos; } Kecia Marques 33
  34. 34. Estruturas de controle Repetição: while (condição){ comandos; } do{ comandos; } while (condição); for (inicialização; condição; passo){ comandos; } Kecia Marques 34
  35. 35. Tipos Básicos Kecia Marques 35
  36. 36. Tipos Básicos Tipos básicos de Java: boolean: true ou false byte: inteiro de oito bits com sinal. short: inteiro de 16 bits com sinal. char: caracter de 16 bits int: inteiro de 32 bits com sinal. long: inteiro de 64 bits com sinal. float: valor em ponto flutuante de 32 bits double: valor em ponto flutuante de 64 bits Kecia Marques 36
  37. 37. Wrappers (Empacotadoras) Empacotadoras: há uma classe empacotadora para cada tipo primitivo em Java boolean: Boolean byte: Byte short: Short char: Character int: Integer long: Long float: Float double: Double Kecia Marques 37
  38. 38. Wrappers (Empacotadoras) Serviços das classes empacotadoras: Contrutor: public Integer(int value) Integer numero = new Integer(5); Contrutor: public Integer(String s) Integer numero = new Integer(“5”); Se o valor passado estiver no formato incorreto, por exemplo uma letra, é lançada uma exceção NumberFormatException. Kecia Marques 38
  39. 39. Wrappers (Empacotadoras) public static Integer valueOf(String s) Método que retorna um objeto Integer que empacota um inteiro cujo valor é dado por s. obj.intValue() Retorna um valor do tipo primitivo int empacotado pelo objeto obj, que é do tipo Integer. public static int parseInt("5") Retorna um valor do tipo primitivo int que corresponde à String passada. É lançada uma exceção NumberFormatException se a String passada não for do formato de um número. Kecia Marques 39
  40. 40. Wrappers (Empacotadoras) public void testaWrapper(){ boolean b = true; byte bt = 5; char c = 'k'; short s = 10; long l = 50; int i = 20; float f = 3.4f; double d = 5.8; Boolean B = new Boolean(b); Byte BT = new Byte(bt); Character C = new Character(c); Short S = new Short(s); Long L = new Long(l); Integer I = new Integer(i); Float F = new Float(f); Double D = new Double(d); Kecia Marques 40
  41. 41. Wrappers (Empacotadoras) //imprime o valor inteiro armazenado em I System.out.println("Valor inteiro de I: " + I.intValue()); //imprime o valor inteiro armazenado em I2 Integer I2 = Integer.valueOf("700"); System.out.println("Valor inteiro de I2: " + I2.intValue()); //imprime o valor de i3 int i3 = Integer.parseInt("500"); System.out.println("Valor de i3: " + i3); try{ int i4 = Integer.parseInt("cinco"); System.out.println("Valor de i4: " + i4); } catch (NumberFormatException e){ System.out.println("Formato numérico inválido"); } } Kecia Marques 41
  42. 42. Modificadores Kecia Marques 42
  43. 43. Modificadores de Métodos Modificadores de Métodos abstract: método abstrato, sem corpo. final: método não pode ser redefinido. public: método pode ser acessado por outras classes. private: método só pode ser acessado pela própria classe. protected: método pode ser acessado por classes dentro do mesmo pacote ou pelas subclasses. static: método compartilhado por todos os objetos da classe, com acesso a apenas campos estáticos. Kecia Marques 43
  44. 44. Modificadores de Atributos Modificadores de Atributos final: atributo é uma constante. public: atributo pode ser acessado por outras classes. private: atributo só pode ser acessado pela própria classe. protected: atributo pode ser acessado por classes dentro do mesmo pacote ou pelas subclasses. static: atributo compartilhado por todos os objetos da classe. Kecia Marques 44
  45. 45. Semântica de Referência Kecia Marques 45
  46. 46. Semântica de Referência Em Java não há ponteiros. Java implementa semântica de referência. A declaração de um objeto de uma classe C cria uma referência para um objeto da classe C. C obj; Um objeto criado deve ser associado a uma referência. obj = new C(); Kecia Marques 46
  47. 47. Semântica de Referência A atribuição de uma referência b a outra a, resulta em a e b referenciando o mesmo objeto. a = new C(); b = new C(); a = b; a a após executar a=b b b Kecia Marques 47
  48. 48. Semântica de Referência O que ocorre com o objeto para o qual não há mais referência? Java possui o Coletor de Lixo (Garbage Collector) que elimina objetos pendentes na memória de tempos em tempos. Kecia Marques 48
  49. 49. Exercício Analise o programa a seguir, escrito em Java e formado pelas classes Principal e ClasseMaluca. O que ele imprime? Kecia Marques 49
  50. 50. Exercício public class ClasseMaluca { private int dado1; private int dado2; public ClasseMaluca(int d1, int d2) { dado1 = d1; dado2 = d2; } public int getDado1(){ return (dado1); } public int getDado2(){ return (dado2); } } Kecia Marques 50
  51. 51. Exercício public class Principal { public static void main (String[] args) { ClasseMaluca objA, objB; objA = new ClasseMaluca(10,20); objB = new ClasseMaluca(50,100); System.out.println(objA.getDado1() + " " + objA.getDado2()); System.out.println(objB.getDado1() + " " + objB.getDado2()); objA = new ClasseMaluca(30,60); System.out.println(objA.getDado1() + " " + objA.getDado2()); objB = objA; System.out.println(objB.getDado1() + " " + objB.getDado2()); } } Kecia Marques 51
  52. 52. Arranjos Kecia Marques 52
  53. 53. Arranjos Declaração de arranjos: [] junto ao tipo indica que todos os elementos declarados são arranjos. int[] a, b; // a e b são arranjos [] junto da variável indica que ela é um arranjo int a[], b; // a é arranjo, mas b não Kecia Marques 53
  54. 54. Arranjos Criação de arranjos: Arranjos devem ser criados: a = new int[4]; a 0 1 2 3 Kecia Marques 54
  55. 55. Arranjos No caso de arranjo de objetos, cada posição do arranjo deve ser criada para ser então utilizada. a = new A[4]; a[0] = new A(5,9,8); a[3] = new A(11,23,5); a 0 1 2 3 Kecia Marques 55
  56. 56. Arranjos public static void exemploArranjo(){ int[] a = new int[10], b; int c[], d; b = new int[10]; c = new int[5]; // d = new int[3]; Este comando dá erro de compilação // porque d não é arranjo a[0] = 10; a[9] = 20; // a[10] = 5; Este comando gera a exceção // ArrayIndexOutOfBoundsException for (int i=0; i < a.length; i++) System.out.print(a[i] + " - "); Kecia Marques 56
  57. 57. Arranjos A[] vetorObjetos = new A[5]; vetorObjetos[1] = new A(1,2,3); vetorObjetos[1].ImprimeValores(); // vetorObjetos[2].ImprimeValores(); // Este comando gera a exceção NullPointerException } Kecia Marques 57
  58. 58. Composição de Objetos Kecia Marques 58
  59. 59. Composição de Objetos Uma classe pode possuir um membro de dado que seja um objeto de outra classe. Esse tipo de relacionamento é chamado composição. Exemplos: Um Círculo possui um Ponto como centro. Uma Conta Corrente é de um Cliente. Uma Turma tem um Professor. Uma Turma tem muitos Alunos. Kecia Marques 59
  60. 60. Classe Ponto public class Ponto { private float x, y; public Ponto(float x, float y){ this.x = x; this.y = y; } public void alterarX(float x){ this.x = x; } public void alterarY(float y){ this.y = y; } public float obterX(){ return x; } public float obterY(){ return y; } } Kecia Marques 60
  61. 61. Classe Circulo public class Circulo { private float raio; private Ponto centro; public Circulo(float x, float y, float r){ raio = r; centro = new Ponto(x,y); } public void alterarCentro(float x, float y){ centro.alterarX(x); centro.alterarY(y); } public void alterarRaio(float r){ raio = r; } public float obterCentroX(){ return centro.obterX(); } Kecia Marques 61
  62. 62. Classe Circulo public float obterCentroY(){ return centro.obterY(); } public float obterRaio(){ return raio; } } Kecia Marques 62
  63. 63. Classe Aplicacao import java.util.Scanner; public class Aplicacao { public static void main(String[] args){ float x, y, raio; Circulo circ; Scanner in = new Scanner (System.in); System.out.println("Digite as coordenadas do centro: "); x = in.nextFloat(); y = in.nextFloat(); System.out.println("Digite o raio: "); raio = in.nextFloat(); circ = new Circulo (x, y, raio); System.out.println("Circulo criado: "); System.out.println("Raio: " + circ.obterRaio()); System.out.println("Centro: (" + circ.obterCentroX() + ", " + circ.obterCentroY() + ")."); System.out.println(""); } } Kecia Marques 63
  64. 64. Passagem de Parâmetros Kecia Marques 64
  65. 65. Passagem de parâmetros Em Java a passagem de parâmetros para métodos se dá sempre por valor. Não existe passagem de parâmetro por referência em Java. O que ocorre quando um objeto é passado por parâmetro? Kecia Marques 65
  66. 66. Passagem de parâmetros Quando um objeto é passado por parâmetro, na verdade a sua referência está sendo passada por parâmetro. Alterações realizadas no objeto dentro do método tem impacto no argumento passado para o método. Por exemplo, se o objeto a for passado como parâmetro para um método m(A x) e em m ocorrer alguma alteração em x (enquanto este estiver referenciando o mesmo objeto que a), após a execução de m, a estará com as alterações sofridas por x. Kecia Marques 66
  67. 67. Passagem de parâmetros Exemplo: considerando as classes Ponto e Circulo mostradas anteriormente, o que a classe Aplicação a seguir gera como saída para entradas 1, 1 e 2? Kecia Marques 67
  68. 68. Classe Aplicação public class Aplicacao { public static void alteraCirculo(Circulo c){ c.alterarCentro(10, 20); c.alterarRaio(5); System.out.println("nn**Dados do circulo dentro do método: **"); System.out.println("Raio: " + c.obterRaio()); System.out.println("Centro: (" + c.obterCentroX() + ", " + c.obterCentroY() + ")."); c = new Circulo(3,3,9); System.out.println("nn**Dados do novo circulo dentro do método: **"); System.out.println("Raio: " + c.obterRaio()); System.out.println("Centro: (" + c.obterCentroX() + ", " + c.obterCentroY() + ")."); } Kecia Marques 68
  69. 69. Classe Aplicação public static void main(String[] args){ float x, y, raio; Circulo circ; Scanner in = new Scanner (System.in); System.out.println("Digite as coordenadas do centro: "); x = in.nextFloat(); y = in.nextFloat(); System.out.println("Digite o raio: "); raio = in.nextFloat(); circ = new Circulo (x, y, raio); System.out.println("Circulo criado: "); System.out.println("Raio: " + circ.obterRaio()); System.out.println("Centro: (" + circ.obterCentroX() + ", " + circ.obterCentroY() + ")."); //Passando objeto circ como parâmetro alteraCirculo(circ); Kecia Marques 69
  70. 70. Classe Aplicação System.out.println("n**Circulo após execução do método: **"); System.out.println("Raio: " + circ.obterRaio()); System.out.println("Centro: (" + circ.obterCentroX() + ", " + circ.obterCentroY() + ")."); System.out.println(""); } } Circulo criado: Raio: 2.0 Centro: (1.0, 1.0). **Dados do circulo dentro do método: ** Raio: 5.0 Centro: (10.0, 20.0). **Dados do novo circulo dentro do método: ** Raio: 9.0 Centro: (3.0, 3.0). **Circulo após execução do método: ** Raio: 5.0 Centro: (10.0, 20.0). Kecia Marques 70
  71. 71. Passagem de Arranjos como Parâmetros Para passar um arranjo como parâmetro, deve-se indicar o nome do arranjo sem colchetes na chamada do método. metodo(arranjo); O método que recebe o arranjo como parâmetro deve indicar isso na sua lista de parâmetros. void metodo(int b[]) Kecia Marques 71
  72. 72. Passagem de Arranjos como Parâmetros Quando um arranjo é passado como parâmetro, o que o método recebe é uma cópia da sua referência. Desta forma, alterações sofridas pelo arranjo no método refletem no arranjo que foi passado como parâmetro. Kecia Marques 72
  73. 73. Classe Aplicação public class TesteArranjo { public static void alteraArranjo(int b[]){ for(int i=0; i<b.length; i++){ b[i] = i*2; } System.out.println(“n**Arranjo b**"); for (int valor : b) System.out.print(valor + " - "); b = new int[3]; System.out.println("n**Novo arranjo b**"); for (int valor : b) System.out.print(valor + " - "); } Kecia Marques 73
  74. 74. Classe Aplicação public static void main(String[] args){ int[] a = {1,2,3,4,5}; System.out.println("n**Arranjo a antes da chamada do método**"); for (int valor : a) System.out.print(valor + " - "); alteraArranjo(a); System.out.println("n**Arranjo a após a chamada do método**"); for (int valor : a) System.out.print(valor + " - "); } } Kecia Marques 74
  75. 75. Classe Aplicação **Arranjo a antes da chamada do método** 1-2-3-4-5– **Arranjo b** 0-2-4-6-8- **Novo arranjo b** 0-0-0- **Arranjo a após a chamada do método** 0-2-4-6-8- Kecia Marques 75
  76. 76. Herança Kecia Marques 76
  77. 77. Herança Herança é um recurso que permite que novas classes sejam definidas a partir de classes já definidas. Na hierarquia de classes: Super classes (ou ascendente): são as ascendentes de um classe. Sub classes (ou descendente): são as descendentes de um classe Classe mãe: é a ascendente direta de um classe Classe filha: é a descendente direta de uma classe. Kecia Marques 77
  78. 78. Herança No exemplo: Filha é descendente ou subclasse de Mãe e Avó. Mãe e Avó são ascendentes ou superclasses de Filha Mãe é descendente ou subclasse de Avó. Mãe é filha de Avó. Significa que: Mãe herda características e comportamentos de Avó. Filha herda características e comportamentos de Mãe e de Avó. Kecia Marques 78
  79. 79. Herança No exemplo: Conta é superclasse de Conta Corrente e de Conta Poupança. Conta Corrente e Conta Poupança são subclasses de Conta. Kecia Marques 79
  80. 80. Herança Significa que: Conta Corrente herda características e comportamentos de Conta. Conta Poupança herda características e comportamentos de Conta. Kecia Marques 80
  81. 81. Herança Kecia Marques 81
  82. 82. Herança No exemplo: Conta Corrente possui como atributos: número, saldo e limite, pois herda os dois primeiros da classe Conta. Conta Corrente possui como métodos: criar, depositar, sacar, consultarSaldo, obterNumero, e consultarSaldoTotal, consultarLimite e alterarLimite, sendo que os cinco primeiros são herdados de Conta. Kecia Marques 82
  83. 83. Herança No exemplo: Conta Poupança possui como atributos: número, saldo e rendimento, pois herda os dois primeiros da classe Conta. Conta Poupança possui como métodos: criar, depositar, sacar, consultarSaldo , obterNumero e atualizarRendimentos , sendo que, os cinco primeiros são herdados de Conta. Kecia Marques 83
  84. 84. Herança Exemplo de implementação de herança em Java A palavra chave extends indica herança em Java. public class A extends B Indica que a classe A herda da classe B Kecia Marques 84
  85. 85. Herança public class A { protected int x, y; private int z; public A(int a, int b, int c) { x = a; y = b; z = c; } public int obterX(){ return (x); } public int obterY(){ return (y); } Kecia Marques 85
  86. 86. Herança public int obterZ(){ return (z); } public void alterarX(int a){ x = a; } public void alterarY(int a){ y = a; } public void alterarZ(int a){ z = a; } Kecia Marques 86
  87. 87. Herança public void ImprimeValores(){ System.out.println("O valor de X é: " + x); System.out.println("O valor de Y é: " + y); System.out.println("O valor de Z é: " + z); } } public class B extends A{ private int k; public B(int a, int b, int c, int d){ super (a,b,c); k = d; } Kecia Marques 87
  88. 88. Herança public void ImprimeValores(){ System.out.println("O valor de X é: " + x); System.out.println("O valor de Y é: " + y); System.out.println("O valor de K é: " + k); System.out.println("Z não pertence a esta classe"); System.out.println("O valor de Z da superclasse é: " + obterZ()); } } Kecia Marques 88
  89. 89. Herança public class TesteHeranca { public static void main (String[] args){ B obj1 = new B(10,20,30,40); obj1.ImprimeValores(); obj1.alterarY(100); obj1.ImprimeValores(); } } Kecia Marques 89
  90. 90. Herança O exemplo de código a seguir mostra a implementação das classes Conta e ContaCorrente em Java. É mostrada também uma classe MainBanco para exemplificar o uso das classes criadas. Kecia Marques 90
  91. 91. Herança public class Conta { long numero; double saldo; public Conta(long n) { numero = n; saldo = 0; } public void depositar(double v){ if (v > 0) saldo = saldo + v; } Kecia Marques 91
  92. 92. Herança public boolean sacar(double v){ if ( (v > 0) && (saldo-v) >= 0){ saldo = saldo - v; return true; } else return false; } public double consultarSaldo(){ return(saldo); } Kecia Marques 92
  93. 93. Herança public long obterNumero(){ return(numero); } } // Fim da classe Conta public class ContaCorrente extends Conta{ double limite; public ContaCorrente(long n, double l) { super(n); limite = l; } Kecia Marques 93
  94. 94. Herança public void alterarLimite(double l){ if (l > 0) limite = l; } public double consultarLimite(){ return limite; } Kecia Marques 94
  95. 95. Herança public boolean sacar(double v){ if ((v > 0) && (saldo + limite - v ) >= 0){ saldo = saldo - v; return true; } else return false; } public double consultarSaldoTotal(){ return(saldo + limite); } } // Fim da classe Conta Corrente. Kecia Marques 95
  96. 96. Herança public class MainBanco { public static void main (String[] args){ ContaCorrente minhaConta; minhaConta = new ContaCorrente(12345, 300); System.out.println("Numero da Conta: " + minhaConta.obterNumero()); System.out.println("Saldo: " + minhaConta.consultarSaldo()); Kecia Marques 96
  97. 97. Herança minhaConta.alterarLimite(200); System.out.println("Limite: " + minhaConta.consultarLimite()); System.out.println("Saldo Total: " + minhaConta.consultarSaldoTotal()); minhaConta.depositar(300); System.out.println("Saldo após depósito: " + minhaConta.consultarSaldo()); System.out.println("Saldo total após depósito: " + minhaConta.consultarSaldoTotal()); Kecia Marques 97
  98. 98. Herança if (minhaConta.sacar(200)) { System.out.println("Saldo após saque: " + minhaConta.consultarSaldo()); System.out.println("Saldo total após saque: " + minhaConta.consultarSaldoTotal()); } else System.out.println("Não foi possível realizar operação. Saldo total disponível é de " + minhaConta.consultarSaldoTotal()); Kecia Marques 98
  99. 99. Herança if (minhaConta.sacar(700)) { System.out.println("Saldo total após saque: " + minhaConta.consultarSaldoTotal()); } else System.out.println("Não foi possível realizar operação. Saldo total disponível é de " + minhaConta.consultarSaldoTotal()); } }//Fim da classe MainBanco Kecia Marques 99
  100. 100. Herança Herança provê reuso de classes já construídas. Alguns benefícios do uso de herança: evitar duplicação de código; reúso de código; manutenção mais fácil (desde que não haja abuso do recurso); extensibilidade. Kecia Marques 100
  101. 101. Herança Exercício: Implemente a classe ContaPoupança. Altere a classe MainBanco para criar e realizar operações sobre a classe ContaPoupança que você criou. Pesquise: para que servem as seguintes palavras reservadas de Java: protected, public, private, static, final. Kecia Marques 101
  102. 102. Classes Abstratas Kecia Marques 102
  103. 103. Classes Abstratas A linguagem Java possui o recurso de criação de classes abstratas. Características de uma classe abstrata: é designada pela palavra chave abstract. abstract class FiguraGeometrica{...} podem possuir métodos sem definição de corpo (método abstrato). public abstract void CalculaArea(); objetos de classes abstratas não podem ser criados. pode haver hierarquias de classes abstratas. Kecia Marques 103
  104. 104. Classes Abstratas Propósito de uso de classes abstratas: fornecer uma superclasse apropriada da qual outras classes possam herdar interface e/ou implementação. As classes herdeiras de uma classe abstrata são denominadas classes concretas. Kecia Marques 104
  105. 105. Interface Kecia Marques 105
  106. 106. Interface Interface de Java é um recurso que permite especificar os serviços de uma classe. interface Forma {...} Uma interface declara: métodos públicos sem definição de corpo (métodos não podem ser estáticos); campos públicos, estáticos e finais. Objetos não podem ser criados diretamente a partir de uma interface. Kecia Marques 106
  107. 107. Exemplo Classes que implementam uma interface devem implementar todos os métodos daquela interface e todos eles devem ser públicos. class Circulo implements Forma {...} Uma interface pode ser implementada por várias classes. Uma classe pode implementar várias interfaces. Interface é um caso especial de classe abstrata. Kecia Marques 107
  108. 108. Polimorfismo Kecia Marques 108
  109. 109. Polimorfismo Verificação de Tipos: “atividade que garante que os operandos utilizados com um operador sejam de tipos compatíveis.” Tipo Compatível: “é um tipo cujos valores são adequados para a realização da operação designada pelo operador ou que pode ser convertido implicitamente em um tipo cujos valores sejam adequados.” Varejão, 2004. Kecia Marques 109
  110. 110. Polimorfismo LP fracamente tipada: somente parte dos erros de tipos são verificados. Ex.: C. Em C, um ponteiro para float pode acessar um posição de memória ocupada por um char, por exemplo. LP fortemente tipada: realizam uma verificação extremamente ampla de tipos. Ex.: Java Kecia Marques 110
  111. 111. Polimorfismo Polimorfismo é a característica que possibilita a criação de código capaz de operar sobre valores distintos. Por exemplo, onde se espera um dado de um tipo de X, é possível receber um dado de um tipo Y. Polimorfismo = “muitas formas” Kecia Marques 111
  112. 112. Polimorfismo Coersão: é a conversão implícita de tipos. Quando um operação é realizada sobre um operando de tipo diferente do esperado, o compilador verifica se é possível realizar a conversão. Por exemplo, em C, um valor char pode ser convertido implicitamente para um valor int. int a; char c = ‘k’; a = c; Kecia Marques 112
  113. 113. Polimorfismo Sobrecarga (ou Overloading): um identificador ou operador é sobrecarregado quando pode ser utilizado para designar duas ou mais operações distintas. Ex.: O operador + em Java. int a, b; a = 10; b = a + 20; System.out.println(“Resutaldo = ” + b ); + é utilizado para realizar a operação de soma entre valores numéricos e para realizar concatenação de strings. Kecia Marques 113
  114. 114. Polimorfismo Inclusão: é o polimorfismo decorrente de herança. “Um subtipo S de um tipo T é formado por um subconjunto dos valores de T. Assim, todo valor de S deve ser também um valor de T.” Kecia Marques 114
  115. 115. Polimorfismo Ex.: Considere as classes A e B do exemplo de herança dado anteriormente. A classe a seguir exemplifica uma situação polimórfica. Kecia Marques 115
  116. 116. Polimorfismo Exemplo 1) public class TesteHeranca { public static void main (String[] args){ B obj1 = new B(10,20,30,40); A obj2 = new A (200, 300, 400); testePolimorfismo(obj2); testePolimorfismo(obj1); } public static void testePolimorfismo(A obj){ obj.ImprimeValores(); } } Kecia Marques 116
  117. 117. Polimorfismo O programa anterior imprime: O valor de X é: 200 O valor de Y é: 300 O valor de Z é: 400 O valor de X é: 10 O valor de Y é: 20 O valor de K é: 40 Z não pertence a esta classe O valor de Z da superclasse é: 30 Kecia Marques 117
  118. 118. Tratamento de Exceções Kecia Marques 118
  119. 119. Tratamento de Exceções Conceito Ausência de mecanismos para exceções em LP Mecanismos para exceções em LP Lançamento de Exceções Tratamento de Exceções Propagação de Exceções Relançamento de Exceções Continuação após o Tratamento de Exceções Kecia Marques 119
  120. 120. Conceito Robustez: é a capacidade de um software continuar em operação corretamente mesmo em condições anormais. Problemas: Como prevenir-se de erros em tempo de execução? Como contornar situações anormais? Exemplos de situações anormais: divisão por zero, fim de arquivo, overflow, utilização de um objeto não inicializado, acesso a um índice inválido de um vetor. Kecia Marques 120
  121. 121. Conceito Exceção: “é um evento ocorrido durante a execução de um programa que desvia o fluxo normal de instruções. ” “É uma condição provocada por uma situação excepcional que requer uma ação específica imediata.” Varejão, 2004. Kecia Marques 121
  122. 122. Ausência de Mecanismos para Exceções Quando a LP utilizada não fornece mecanismos para exceções, o programador usa recursos como: Abortar o programa. Utilizar códigos de erro. Ex.: uma função para ler dados de entrada. Caso algum dos dados seja inválido, a função retorna –1. Kecia Marques 122
  123. 123. Ausência de Mecanismos para Exceções Testar a condição anormal antes que ela ocorra. Ex.: if (x!=0) div = y/x; else cout << “Divisão por zero”; Conseqüências: Programas menos confiáveis. Programas com legibilidade prejudicada. Exemplos de LP sem mecanismos para exceções: C e Pascal. Kecia Marques 123
  124. 124. LP com Mecanismos para Exceções Promovem os seguintes benefícios: A diminuição da sobrecarga do texto do programa. Desta forma, os programas têm melhor legibilidade. Os programas obtidos são mais confiáveis. Isso ocorre por que fica mais fácil tratar as condições anormais. Exemplos de LP com esses mecanismos: ADA, Java e Eiffel. Kecia Marques 124
  125. 125. LP com Mecanismos para Exceções Exceções predefinidas: são parte da própria linguagem ou de sua biblioteca padrão. Exceções criadas pelo programador: são aquelas definidas pelo programador para um aplicação ou uma biblioteca. Kecia Marques 125
  126. 126. LP com Mecanismos para Exceções Exemplos de exceções em Java: NullPointerException: ocorre quando a operação realizada gera um acesso a uma área não definida (nula). IndexOutOfBoundsException: ocorre quando é realizado um acesso a um vetor por índice que está fora dos seus limites. Kecia Marques 126
  127. 127. Lançamento de Exceções O lançamento (ou sinalização) de exceções pode ser realizado: Automaticamente: o próprio mecanismo de exceção é o responsável pelo lançamento da exceção. Esta situação pode surgir em qualquer ponto do programa passível de ocorrência de situação anormal. Kecia Marques 127
  128. 128. Lançamento de Exceções Explicitamente: o programador realiza o lançamento de uma exceção. O exemplo a seguir mostra um lançamento explícito de exceção em Java. Para tal, emprega- se a palavra reservada throw. try{ throw new Exception(); } Kecia Marques 128
  129. 129. Tratamento de Exceções Tratadores de exceções são trechos de códigos responsáveis por tomar atitudes em resposta à ocorrência de uma exceção. Em Java: os comandos do bloco try são os tratados; os comandos das cláusulas catch correspondem ao tratamento das exceções ocorridas no bloco try correspondente; Kecia Marques 129
  130. 130. Tratamento de Exceções podem ser incluídas várias cláusulas catch após o try; a cada catch corresponde um classe de exceções. Kecia Marques 130
  131. 131. Tratamento de Exceções Ex.: ... String n, d; ... try{ int num = Integer.valueOf(n).intValue(); int den = Integer.valueOf(d).intValue(); int div = num / den; } catch(NumberFormatException x){ System.out.println(“Erro na formatação.”); } Kecia Marques 131
  132. 132. Tratamento de Exceções catch(ArithmeticException y){ System.out.println(“Divisão por zero”); } catch(Exception z){ System.out.println(“Ocorreu um erro durante a operação”); } No exemplo: a cláusula catch(NumberFormatException x) captura exceções de formato de números. O comando dentro do bloco deste catch é o tratamento dado a este tipo de exceção. Kecia Marques 132
  133. 133. Tratamento de Exceções a cláusula catch(ArithmeticException y) captura exceções de ocorridas em operações aritméticas. Neste caso, serve para tratar divisões por zero. O comando dentro do bloco deste catch é o tratamento dado a este tipo de exceção. a cláusula catch(Exception z) captura qualquer tipo de exceções de ocorridas dentro do bloco try. O comando dentro do bloco deste catch é o tratamento genérico dado a qualquer outra exceção que ocorra dentro do bloco try, que não sejam dos tipos ArithmeticException ou NumberFormatException. Kecia Marques 133
  134. 134. Propagação de Exceções Quando um exceção ocorre, busca-se pela cláusula catch associada ao seu tipo. A sequência para realizar esta busca é a que aparece no código. Quando um exceção não é tratada no bloco em que ocorreu, ela é retornada para o bloco mais externo. No caso de chamadas de métodos, é retornada para o método chamador. Kecia Marques 134
  135. 135. Propagação de Exceções Se o bloco ou método para o qual a exceção foi retornada não fizer o seu tratamento, ela é retornada para o bloco (ou método chamador) mais externo a este. Se a exceção chegar ao método principal sem que seja tratada, o programa é abortado. Kecia Marques 135
  136. 136. Relançamento de Exceções Em algumas situações, pode ser necessário que o local onde ocorreu a exceção a trate de maneira parcial, deixando o restante de seu tratamento para um dos blocos mais externo (ou para um dos métodos na seqüência de chamada). Neste caso, utiliza-se o recurso de relançamento de exceções. Kecia Marques 136
  137. 137. Relançamento de Exceções Ex.: ... try{ try{ ... throw new IOException(); ... } catch(IOException e){ ... //tratamento parcial da exceção e throw e; //relançamento da exceção e } } catch(IOException e){ ...// restante do tratamento da exceção. } Kecia Marques 137
  138. 138. Continuação após o Tratamento de Exceções A execução de um programa sem a ocorrência de exceções segue o fluxo normal determinado no programa. O que ocorre na presença de um exceção? Qual será o fluxo do programa nesta situação? Kecia Marques 138
  139. 139. Continuação após o Tratamento de Exceções Em geral, as LP adotam a abordagem de terminação. Terminação: quando ocorre um exceção, o erro é considerado como crítico e a execução não retorna ao ponto no qual foi gerada. A execução é desviada para um ponto externo e são encerradas as unidades na pilha de execução, a partir do ponto onde ocorreu a exceção até a unidade anterior a que o tratador de exceção foi executado. A execução continua na unidade na qual o tratador foi encontrado. Kecia Marques 139
  140. 140. Continuação após o Tratamento de Exceções A cláusula finally de Java: Em algumas situações, pode ser necessária a execução de um conjunto de comandos, independente do tipo de exceção ocorrida. A cláusula finally de Java provê este recurso. Em geral, este recurso é utilizado quando deseja-se restabelecer o estado de algum objeto de forma independente da ocorrência e da propagação de exceções. Por exemplo, quando deseja-se encerrar conexões com banco de dados ou fechar arquivos quando ocorrer uma exceção qualquer. Kecia Marques 140
  141. 141. Continuação após o Tratamento de Exceções O bloco finally de Java executa quando: uma exceção for lançada no bloco try correspondente ou em um de seus blocos catch; o seu bloco try fechar utilizando return, break ou continue. Kecia Marques 141
  142. 142. Continuação após o Tratamento de Exceções É possível a existência de bloco try sem a associação de uma cláusula catch. Mas, não é possível a existência de um bloco try sem pelo menos um cláusula catch ou finally. Em outras palavras, um bloco try pode não possuir cláusulas catch, mas, neste caso, deve possuir então uma cláusula finally. Kecia Marques 142
  143. 143. Continuação após o Tratamento de Exceções Exemplo: ... try { System.out.println(“Primeiro try”); try{ System.out.println(“Segundo try”); ... //aqui ocorreu uma exceção qualquer } finally{ System.out.println(Finally do segundo try); } } Kecia Marques 143
  144. 144. Continuação após o Tratamento de Exceções catch(Exception p){ System.out.println(“Tratamento para a exceção no primeiro try”); } finally{ System.out.println(“Finally do primeiro try”); } No exemplo, os comandos das duas cláusulas finally serão executadas, assim como os comandos da cláusula catch. Kecia Marques 144
  145. 145. Bibliografia Barnes, David e Kölling, M. Programação Orientada a Objetos com Java. São Paulo: Pearson Prentice Hall, 2004. Bigonha, R. S. e Bigonha, M. A. S. Programação Modular. Apostila. Belo Horizonte: DCC-UFMG, 2001. Deitel, H. M.; Deitel, P. J. Java - Como Programar. 6. ed. Prentice- Hall, 2005. HORSTMANN,CAY. Big Java. Bookman, 2004. HORSTMANN, C.; Cornell, G. Core Java 2: Fundamentos - vol. 1 . 7.ed. Alta Books. 2005. Kecia Marques 145

×