Este documento fornece uma introdução aos conceitos fundamentais da linguagem de programação Java, incluindo:
1) Como obter o Java Development Kit e ferramentas de desenvolvimento como Eclipse ou NetBeans;
2) Principais conceitos como classe, objeto, métodos e atributos;
3) Organização de classes em pacotes e importação de pacotes;
4) Tipos de dados primitivos e wrappers em Java.
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. 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. 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
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. 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. 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. 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. 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. Um exemplo simples – Conta Corrente
Atributos: numero, agência e saldo.
Métodos: depositar, sacar, consultar saldo.
Kecia Marques 13
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. 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. 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. 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. 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. 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. 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. 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. 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
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. 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. 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. 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. 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
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. Estruturas de controle
Estruturas de controle
Condicional:
if (condição){
comandos;
}
if (condição){
comandos;
}
else{
comandos;
}
Kecia Marques 32
33. Estruturas de controle
Escolha:
switch (expressão){
case constante1: comandos;
break;
case constante2: comandos;
break;
...
default: comandos;
}
Kecia Marques 33
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
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. 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. 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. 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. 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. 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
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. 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
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. 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. 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. 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. 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. 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
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. Arranjos
Criação de arranjos:
Arranjos devem ser criados:
a = new int[4];
a 0 1 2 3
Kecia Marques 54
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. 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. 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
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. 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. 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. Classe Circulo
public float obterCentroY(){
return centro.obterY();
}
public float obterRaio(){
return raio;
}
}
Kecia Marques 62
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
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
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. 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. 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. 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
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Herança
public void alterarLimite(double l){
if (l > 0)
limite = l;
}
public double consultarLimite(){
return limite;
}
Kecia Marques 94
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. 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. 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. 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. 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. 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. 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
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. 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
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. 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
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. 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. 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. 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. 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. 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. 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. 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. 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
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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