Linguagem Java - Conceitos e Técnicas
-
Upload
breno-vitorino -
Category
Technology
-
view
50.736 -
download
3
description
Transcript of Linguagem Java - Conceitos e Técnicas
Java
PUC-MGProf.ª Kecia Aline Marques Ferreira
Conceitos e Técnicas� Obtendo Java� Conceitos Fundamentais� Pacotes� Operadores e Estruturas de Controle� Tipos Básicos� Modificadores� Semântica de Referência
Kecia Marques 2
� Semântica de Referência� Arranjos� Composição de Objetos� Passagem de Parâmetros� Herança� Classes Abstratas� Interfaces� Polimorfismo� Tratamento de Exceções
Obtendo JAVA
Kecia Marques 3
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,
Kecia Marques 4
� 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.
Para utilizar Java
� Site oficial de Java: http://java.sun.com/
� Para utilizar Java é preciso:
Kecia Marques 5
� 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/
Para saber mais sobre Java
� Tutorial da Sun:
http://java.sun.com/developer/onlineTraining/
Kecia Marques 6
� Deitel, H. M.; Deitel, P. J. Java - Como
Programar. 6. ed. Prentice-Hall, 2005.
Conceitos Fundamentais
Kecia Marques 7
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
Kecia Marques 8
� 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)
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”
Kecia Marques 9
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
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
Kecia Marques 10
� 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.
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
Kecia Marques 11
� 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.
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,
Kecia Marques 12
conta corrente, conta poupança, dentre outras.
A figura a seguir mostra a estrutura da classe ContaCorrente.
Um exemplo simples – Conta Corrente
Atributos: numero, agência e saldo.
Métodos: depositar, sacar, consultar saldo.
Kecia Marques 13
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;
Kecia Marques 14
private double saldo;
public ContaCorrente(long n, int ag) {
numero = n;
agencia = ag;
saldo = 0.0;
}
Um exemplo simples – Conta Corrente
public void sacar(double valor){
if (valor > 0)
saldo = saldo - valor;
}
public void depositar(double valor){
if (valor > 0)
Kecia Marques 15
if (valor > 0)
saldo = saldo + valor;
}
public double consultarSaldo(){
return (saldo);
}
}
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.
Kecia Marques 16
estado inicial do objeto.
� Em Java, objetos são criados utilizando-se a palavra reservada new.
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 umobjeto da classe ContaCorrente.
Kecia Marques 17
objeto da classe ContaCorrente.
minhaConta
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 aminhaConta;
Kecia Marques 18
minhaConta;
minhaConta
Numero = 12345
Agencia = 236
Saldo = 0
Comunicação entre Objetos
� Programas orientados por objetos são constituídos por objetos que trocam mensagens entre si.
Kecia Marques 19
� O envio de uma mensagem a um objeto corresponde a invocar um método de tal objeto.
Comunicação entre Objetos
EmminhaConta.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
para que este realize a operação depositar.
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
Kecia Marques 21
� 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.
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.
Kecia Marques 22
classes Cliente e Conta Poupança.b) Implemente a classe Cliente em Java.
Pacotes
Kecia Marques 23
Organização de Classes
� Em Java classes são organizadas em pacotes.
Um pacote é um conjunto de classes
Kecia Marques 24
� Um pacote é um conjunto de classes relacionadas.
� A palavra package indica o pacote ao qual a classe pertence.
Organização de Classes
� Exemplo:
package rh;
Kecia Marques 25
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).
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
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
Kecia Marques 27
� 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.*;
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:
Kecia Marques 28
� 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
Organização de Classes
Kecia Marques 29
Operadores e Estruturas de
Kecia Marques 30
Controle
Operadores
� Algumas estruturas utilizadas em Java são muito semelhantes às de C/C++
� Início de fim de blocos são marcados com { }
Kecia Marques 31
� Os operadores utilizados em Java são basicamente os mesmos utilizados em C/C++:
Aritméticos: + - / * % ++ --Relacionais: == != >= <= Atribuição: =Lógicos: && || !
Estruturas de controle
� Estruturas de controle� Condicional:
if (condição){comandos;
Kecia Marques 32
}
if (condição){comandos;
}else{
comandos;
}
Estruturas de controle
� Escolha:
switch (expressão){case constante1: comandos;
break;
Kecia Marques 33
break;case constante2: comandos;
break;...default: comandos;
}
Estruturas de controle
� Repetição:
while (condição){comandos;
}
Kecia Marques 34
do{comandos;
} while (condição);
for (inicialização; condição; passo){comandos;
}
Tipos Básicos
Kecia Marques 35
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
Kecia Marques 36
� 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
Wrappers (Empacotadoras)
� Empacotadoras: há uma classe empacotadora para cada tipo primitivo em Java
� boolean: Boolean
Kecia Marques 37
� byte: Byte� short: Short� char: Character� int: Integer� long: Long� float: Float� double: Double
Wrappers (Empacotadoras)
� Serviços das classes empacotadoras:
� Contrutor: public Integer(int value)Integer numero = new Integer(5);
Kecia Marques 38
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.
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
Kecia Marques 39
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.
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;
Kecia Marques 40
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);
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
Kecia Marques 41
//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");
}
}
Modificadores
Kecia Marques 42
Modificadores de Métodos
� Modificadores de Métodos
� abstract: método abstrato, sem corpo. � final: método não pode ser redefinido.
Kecia Marques 43
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.
Modificadores de Atributos
� Modificadores de Atributos
� final: atributo é uma constante.� public: atributo pode ser acessado por outras classes.
Kecia Marques 44
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.
Semântica de Referência
Kecia Marques 45
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.
Kecia Marques 46
referência para um objeto da classe C.C obj;
� Um objeto criado deve ser associado a uma referência.obj = new C();
Semântica de Referência
� A atribuição de uma referência b a outra a, resulta em ae b referenciando o mesmo objeto.
a = new C();
b = new C();
a = b;
Kecia Marques 47
a = b;
a
b
após executar a=b
a
b
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
Kecia Marques 48
elimina objetos pendentes na memória de tempos em tempos.
Exercício
Analise o programa a seguir, escrito em Java e formado pelas classes Principal e ClasseMaluca.
Kecia Marques 49
O que ele imprime?
Exercício
public class ClasseMaluca {
private int dado1;
private int dado2;
public ClasseMaluca(int d1, int d2) {
dado1 = d1;
dado2 = d2;
}
Kecia Marques 50
public int getDado1(){
return (dado1);
}
public int getDado2(){
return (dado2);
}
}
Exercício
public class Principal {
public static void main (String[] args) {
ClasseMaluca objA, objB;
objA = new ClasseMaluca(10,20);
objB = new ClasseMaluca(50,100);
Kecia Marques 51
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());
}
}
Arranjos
Kecia Marques 52
Arranjos
� Declaração de arranjos:
� [] junto ao tipo indica que todos os elementos declarados são arranjos.
Kecia Marques 53
declarados são arranjos.int[] a, b; // a e b são arranjos
� [] junto da variável indica que ela é um arranjoint a[], b; // a é arranjo, mas b não
Arranjos
� Criação de arranjos:
� Arranjos devem ser criados:a = new int[4];
Kecia Marques 54
a = new int[4];
a 0 1 2 3
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);
Kecia Marques 55
a[0] = new A(5,9,8);
a[3] = new A(11,23,5);
a 0 1 2 3
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
//
Kecia Marques 56
// 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] + " - ");
Arranjos
A[] vetorObjetos = new A[5];
vetorObjetos[1] = new A(1,2,3);
vetorObjetos[1].ImprimeValores();
// vetorObjetos[2].ImprimeValores();
Kecia Marques 57
// vetorObjetos[2].ImprimeValores();
// Este comando gera a exceção NullPointerException
}
Composição de Objetos
Kecia Marques 58
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.
Kecia Marques 59
� 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.
Classe Pontopublic 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){
Kecia Marques 60
public void alterarY(float y){
this.y = y;
}
public float obterX(){
return x;
}
public float obterY(){
return y;
}
}
Classe Circulopublic 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);
Kecia Marques 61
centro.alterarY(y);
}
public void alterarRaio(float r){
raio = r;
}
public float obterCentroX(){
return centro.obterX();
}
Classe Circulopublic float obterCentroY(){
return centro.obterY();
}
public float obterRaio(){
return raio;
}
}
Kecia Marques 62
Classe Aplicacaoimport 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();
Kecia Marques 63
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("");
}
}
Passagem de Parâmetros
Kecia Marques 64
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.
Kecia Marques 65
Java.
� O que ocorre quando um objeto é passado por parâmetro?
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.
Kecia Marques 66
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.
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
Classe Aplicaçãopublic class Aplicacao {
public static void alteraCirculo(Circulo c){
c.alterarCentro(10, 20);
c.alterarRaio(5);
System.out.println("\n\n**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("\n\n**Dados do novo circulo dentro do método:
Kecia Marques 68
System.out.println("\n\n**Dados do novo circulo dentro do método:
**");
System.out.println("Raio: " + c.obterRaio());
System.out.println("Centro: (" + c.obterCentroX() + ", " +
c.obterCentroY() + ").");
}
Classe Aplicaçãopublic 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);
Kecia Marques 69
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);
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.0Centro: (1.0, 1.0).
Kecia Marques 70
**Dados do circulo dentro do método: **Raio: 5.0Centro: (10.0, 20.0).
**Dados do novo circulo dentro do método: **Raio: 9.0Centro: (3.0, 3.0).
**Circulo após execução do método: **Raio: 5.0Centro: (10.0, 20.0).
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);
Kecia Marques 71
� O método que recebe o arranjo como parâmetro deve indicar isso na sua lista de parâmetros.
void metodo(int b[])
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
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 + " - ");
Kecia Marques 73
b = new int[3];
System.out.println("\n**Novo arranjo b**");
for (int valor : b)
System.out.print(valor + " - ");
}
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
System.out.print(valor + " - ");
}
}
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
Herança
Kecia Marques 76
Herança
� Herança é um recurso que permite que novas classes sejam definidas a partir de classes já definidas.
� Na hierarquia de classes:
Kecia Marques 77
� 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.
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ó.
Kecia Marques 78
� 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ó.
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
de Conta.
Herança
� Significa que:
� Conta Corrente herda características e comportamentos de Conta.
Kecia Marques 80
comportamentos de Conta.
� Conta Poupança herda características e comportamentos de Conta.
Herança
Kecia Marques 81
Herança
� No exemplo:� Conta Corrente possui como atributos: número, saldo
e limite, pois herda os dois primeiros da classe Conta.
Kecia Marques 82
� 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.
Herança
� No exemplo:� Conta Poupança possui como atributos:
número, saldo e rendimento, pois herda os dois primeiros da classe Conta.
Kecia Marques 83
� Conta Poupança possui como métodos: criar, depositar, sacar,
consultarSaldo , obterNumero e
atualizarRendimentos , sendo que, os cinco primeiros são herdados de Conta.
Herança
� Exemplo de implementação de herança em JavaA palavra chave extends indica herança em Java.
Kecia Marques 84
public class A extends B
Indica que a classe A herda da classe B
Herança
public class A {
protected int x, y;
private int z;
public A(int a, int b, int c) {
x = a;
Kecia Marques 85
x = a;
y = b;
z = c;
}
public int obterX(){
return (x);
}
public int obterY(){
return (y);
}
Herança
public int obterZ(){
return (z);
}
public void alterarX(int a){
x = a;
}
Kecia Marques 86
public void alterarY(int a){
y = a;
}
public void alterarZ(int a){
z = a;
}
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);
}
}
Kecia Marques 87
public class B extends A{
private int k;
public B(int a, int b, int c, int d){
super (a,b,c);
k = d;
}
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
Kecia Marques 88
System.out.println("Z não pertence a esta
classe");
System.out.println("O valor de Z da superclasse
é: " + obterZ());
}
}
Herança
public class TesteHeranca {
public static void main (String[] args){
B obj1 = new B(10,20,30,40);
obj1.ImprimeValores();
Kecia Marques 89
obj1.alterarY(100);
obj1.ImprimeValores();
}
}
Herança
O exemplo de código a seguir mostra aimplementação das classes Conta eContaCorrente em Java. É mostradatambém uma classe MainBanco para
Kecia Marques 90
também uma classe MainBanco paraexemplificar o uso das classes criadas.
Herança
public class Conta {
long numero;
double saldo;
public Conta(long n) {
numero = n;
Kecia Marques 91
numero = n;
saldo = 0;
}
public void depositar(double v){
if (v > 0)
saldo = saldo + v;
}
Herança
public boolean sacar(double v){
if ( (v > 0) && (saldo-v) >= 0){
saldo = saldo - v;
return true;
}
else
Kecia Marques 92
else
return false;
}
public double consultarSaldo(){
return(saldo);
}
Herança
public long obterNumero(){
return(numero);
}
} // Fim da classe Conta
public class ContaCorrente extends Conta{
Kecia Marques 93
public class ContaCorrente extends Conta{
double limite;
public ContaCorrente(long n, double l) {
super(n);
limite = l;
}
Herança
public void alterarLimite(double l){
if (l > 0)
limite = l;
}
Kecia Marques 94
}
public double consultarLimite(){
return limite;
}
Herança
public boolean sacar(double v){
if ((v > 0) && (saldo + limite - v ) >= 0){
saldo = saldo - v;
return true;
}
else
Kecia Marques 95
return false;
}
public double consultarSaldoTotal(){
return(saldo + limite);
}
} // Fim da classe Conta Corrente.
Herança
public class MainBanco {
public static void main (String[] args){
ContaCorrente minhaConta;
Kecia Marques 96
minhaConta = new ContaCorrente(12345, 300);
System.out.println("Numero da Conta: " +
minhaConta.obterNumero());
System.out.println("Saldo: " +
minhaConta.consultarSaldo());
HerançaminhaConta.alterarLimite(200);
System.out.println("Limite: " +
minhaConta.consultarLimite());
System.out.println("Saldo Total: " +
minhaConta.consultarSaldoTotal());
Kecia Marques 97
minhaConta.depositar(300);
System.out.println("Saldo após depósito: " +
minhaConta.consultarSaldo());
System.out.println("Saldo total após depósito: "
+ minhaConta.consultarSaldoTotal());
Herança
if (minhaConta.sacar(200)) {
System.out.println("Saldo após saque: " +
minhaConta.consultarSaldo());
System.out.println("Saldo total após saque: "
Kecia Marques 98
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());
Herança
if (minhaConta.sacar(700)) {
System.out.println("Saldo total após saque: "
+ minhaConta.consultarSaldoTotal());
}
Kecia Marques 99
}
else
System.out.println("Não foi possível realizar
operação. Saldo total disponível é de " +
minhaConta.consultarSaldoTotal());
}
}//Fim da classe MainBanco
Herança
� Herança provê reuso de classes já construídas.
� Alguns benefícios do uso de herança:
Kecia Marques 100
� 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.
Herança
� Exercício:� Implemente a classe ContaPoupança.
� Altere a classe MainBanco para criar e realizar
Kecia Marques 101
� 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.
Classes Abstratas
Kecia Marques 102
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.
Kecia Marques 103
� é 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.
Classes Abstratas
� Propósito de uso de classes abstratas: fornecer uma superclasse apropriada da qual outras classes possam herdar interface e/ou implementação.
Kecia Marques 104
implementação.
� As classes herdeiras de uma classe abstrata são denominadas classes concretas.
Interface
Kecia Marques 105
Interface
� Interface de Java é um recurso que permite especificar os serviços de uma classe.
interface Forma {...}
Kecia Marques 106
� 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.
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 {...}
Kecia Marques 107
� Uma interface pode ser implementada por várias classes.
� Uma classe pode implementar várias interfaces.
� Interface é um caso especial de classe abstrata.
Polimorfismo
Kecia Marques 108
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
Kecia Marques 109
� 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.
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
Kecia Marques 110
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
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.
Kecia Marques 111
é possível receber um dado de um tipo Y.Polimorfismo = “muitas formas”
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.
Kecia Marques 112
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;
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.
Kecia Marques 113
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.
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
deve ser também um valor de T.”
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
Polimorfismo
Exemplo 1)
public class TesteHeranca {
public static void main (String[] args){
B obj1 = new B(10,20,30,40);
Kecia Marques 116
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();
}
}
Polimorfismo
O programa anterior imprime:O valor de X é: 200O valor de Y é: 300O valor de Z é: 400
Kecia Marques 117
O valor de X é: 10O valor de Y é: 20O valor de K é: 40Z não pertence a esta classeO valor de Z da superclasse é: 30
Tratamento de Exceções
Kecia Marques 118
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
Kecia Marques 119
� Tratamento de Exceções� Propagação de Exceções� Relançamento de Exceções� Continuação após o Tratamento de Exceções
Conceito
� Robustez: é a capacidade de um software continuarem operação corretamente mesmo em condiçõesanormais.
Problemas: Como prevenir-se de erros em tempo de
Kecia Marques 120
� Problemas: Como prevenir-se de erros em tempo deexecuçã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ãoinicializado, acesso a um índice inválido de um vetor.
Conceito
� Exceção:
� “é um evento ocorrido durante a execução de um programa que desvia o fluxo normal de
Kecia Marques 121
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.
Ausência de Mecanismos para Exceções
� Quando a LP utilizada não fornece mecanismos para exceções, o programador usa recursos como:
Kecia Marques 122
� 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.
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:
Kecia Marques 123
� Conseqüências: � Programas menos confiáveis.� Programas com legibilidade prejudicada.
� Exemplos de LP sem mecanismos para exceções: C e Pascal.
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.
Kecia Marques 124
� 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.
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
Kecia Marques 125
definidas pelo programador para um aplicação ou uma biblioteca.
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).
Kecia Marques 126
(nula).
IndexOutOfBoundsException: ocorre quando é realizado um acesso a um vetor por índice que está fora dos seus limites.
Lançamento de Exceções
� O lançamento (ou sinalização) de exceções pode ser realizado:
� Automaticamente: o próprio mecanismo de
Kecia Marques 127
� 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.
Lançamento de Exceções
� Explicitamente: o programador realiza o lançamento de uma exceção.
O exemplo a seguir mostra um lançamento
Kecia Marques 128
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();
}
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:
Kecia Marques 129
� 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 trycorrespondente;
Tratamento de Exceções
� podem ser incluídas várias cláusulas catch após o try;
� a cada catch corresponde um classe de
Kecia Marques 130
� a cada catch corresponde um classe de exceções.
Tratamento de Exceções
Ex.:...
String n, d;
...
try{
int num = Integer.valueOf(n).intValue();
Kecia Marques 131
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.”);
}
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”);
Kecia Marques 132
}
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.
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
Kecia Marques 133
� 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.
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.
Kecia Marques 134
� 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.
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
Kecia Marques 135
� Se a exceção chegar ao método principal sem que seja tratada, o programa é abortado.
Relançamento de Exceções
� Em algumas situações, pode ser necessário que o localonde ocorreu a exceção a trate de maneira parcial,deixando o restante de seu tratamento para um dosblocos mais externo (ou para um dos métodos naseqüência de chamada). Neste caso, utiliza-se o recurso
Kecia Marques 136
seqüência de chamada). Neste caso, utiliza-se o recursode relançamento de exceções.
Relançamento de Exceções
Ex.:...
try{
try{
...
throw new IOException();
Kecia Marques 137
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.
}
Continuação após o Tratamento de Exceções
� A execução de um programa sem aocorrência de exceções segue o fluxo normaldeterminado no programa.
Kecia Marques 138
O que ocorre na presença de um exceção?Qual será o fluxo do programa nesta
situação?
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 pontono qual foi gerada. A execução é desviada para um pontoexterno e são encerradas as unidades na pilha de execução,
Kecia Marques 139
no qual foi gerada. A execução é desviada para um pontoexterno e são encerradas as unidades na pilha de execução,a partir do ponto onde ocorreu a exceção até a unidadeanterior a que o tratador de exceção foi executado. Aexecução continua na unidade na qual o tratador foiencontrado.
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, independentedo tipo de exceção ocorrida.
Kecia Marques 140
� A cláusula finally de Java provê este recurso.
� Em geral, este recurso é utilizado quando deseja-serestabelecer o estado de algum objeto de formaindependente da ocorrência e da propagação deexceções. Por exemplo, quando deseja-se encerrarconexões com banco de dados ou fechar arquivosquando ocorrer uma exceção qualquer.
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;
Kecia Marques 141
em um de seus blocos catch;
� o seu bloco try fechar utilizando return, break ou continue.
Continuação após o Tratamento de Exceções
� É possível a existência de bloco try sem aassociação de uma cláusula catch. Mas, não épossível a existência de um bloco try sem pelomenos um cláusula catch ou finally.
Kecia Marques 142
� Em outras palavras, um bloco try pode nãopossuir cláusulas catch, mas, neste caso, devepossuir então uma cláusula finally.
Continuação após o Tratamento de Exceções
Exemplo:...
try {
System.out.println(“Primeiro try”);
try{
System.out.println(“Segundo try”);
Kecia Marques 143
System.out.println(“Segundo try”);
... //aqui ocorreu uma exceção qualquer
}
finally{
System.out.println(Finally do segundo try);
}
}
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”);
Kecia Marques 144
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.
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.
Kecia Marques 145
� 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.