Anda di halaman 1dari 99

Universidade Catolica

de Pelotas

Java
Programacao

Andre Rauber Du Bois


dubois@ucpel.tche.br


M OTIVAC AO
mais simples e facil
de
Sintaxe parecida com C++, porem
aprender
Orientada a objetos
com coleta de Lixo automatica

Gerenciamento de memoria
(Garbage Collection)
Escreva uma vez, rode em qualquer lugar (na teoria :-)
Muitas bibliotecas
E de graca! (http://java.sun.com)
E tri legal!!!!!!!! :-)

M OTIVAC A O

RODANDO P ROGRAMAS

Cada computador (Hardware) entende apenas a sua propria


linguagem (zeros e uns)
Uma linguagem de alto nvel pode ser compilada ou
interpretada
Compilador: traduz o programa em alto nvel para um arquivo

executavel.
O computador executa o arquivo rodando cada
presentes no arquivo.
uma das instrucoes
Interpretador: cada linha do programa e traduzida para

linguagem de maquina
e executada imediatamente

R ODANDO P ROGRAMAS

JAVA
do compilador e interpretador
Java combina a ideia
A linguagem e compilada para bytecodes

Java Bytecode: e uma linguagem de maquina


generica,
e aceita por nenhum hardware
que nao

Maquina
Virtual Java: (JVM - Java Virtual Machine) Programa
que executa programas em Java compilados para bytecode
O mesmo programa Java compilado para bytecode pode rodar

em maquinas
diferentes, basta existir uma JVM para a
plataforma em que o programa sera executado

J AVA

C OMPILANDO PROGRAMAS EM JAVA


Compilador javac
[dubois@haskell]$ javac MyProgram.java
Gera o arquivo bytecode: MyProgram.class

javac
Programa Java
MyProgram.java

Programa em Bytecode
MyProgram.class
COMPUTADOR A

C OMPILANDO PROGRAMAS EM J AVA

RODANDO PROGRAMAS EM JAVA


Interpretador (JVM) java
[dubois@haskell]$ java MyProgram
java (JVM)
Bytecode
MyProgram.class

resultado

COMPUTADOR A

java (JVM)
Bytecode
MyProgram.class

resultado

COMPUTADOR B

R ODANDO PROGRAMAS EM J AVA

RODANDO PROGRAMAS EM JAVA

MyProgram

MyProgram

MyProgram

JVM

JVM

Windows

Linux

Solaris

Hardware

Hardware

Hardware

JVM

Computador A

R ODANDO PROGRAMAS EM J AVA

Computador B

Computador C

H ELLO WORLD
//Meu primeiro programa inutil em Java!
class HelloWorld {

public static void main (String []args)


{
System.out.println("Hello World!");
}
}

H ELLO W ORLD

E NTENDENDO O P ROGRAMA
Declarando uma nova classe: class HelloWorld
public static void main (String []args):

public: qualificador, metodo


pode ser acessado fora da
classe HelloWorld

static: Essse tipo de metodo


pode ser chamado mesmo
foi criado um objeto para esta classe. Metodos

quando nao
compartilhados por todos os objetos criados a
static sao
partir de sua classe.

retornam valores
void: Como em C, metodos
void nao

main: Esse e o nome do metodo


que indica ao compilador
o inicio do programa. Todo o programa Java deve possuir

um metodo
main.

E NTENDENDO O P ROGRAMA

Continuando...
(String []args): Vetor de Strings contendo os valores
passados como argumentos para o programa
System.out.println("Hello World!");:
System e uma classe, out e um de seus atributos que

representa STDOUT, e println e um metodo


que
imprime uma String na tela.

E NTENDENDO O P ROGRAMA

10

U MA CLASSE SIMPLES (Point)


class Point {
int x, y;
}
Classe Point

os atributos da classe, no caso


Duas variaveis
que sao
em que o ponto se encontra
representam a posicao

Variaveis
do tipo int

U MA CLASSE SIMPLES (Point)

11

U SANDO A CLASSE (Point)


class Point {
int x, y;
}
class PointWork {
public static void main (String[] args) {
Point meuPonto = new Point();
meuPonto.x = 12;
meuPonto.y = 12;
System.out.println("Ponto = (" + meuPonto.x +
"," + meuPonto.y+")");
}
}
Point meuPonto = new Point();
meuPonto e um objeto do tipo Point (uma instancia da
U SANDO A CLASSE (Point)

12

inicializados com 0
classe Point). Os atributos x e y sao

Point meuPonto =new Point();: Aloca a variavel


meuPonto
meuPonto.x = 12; muda o conte udo do atributo x do
objeto meuPonto para 12
Operador + no exemplo, serve para concatenar Strings. No
exemplo os valors meuPonto.x e meuPonto.y de tipo
transformados para String.
int, sao
Compilando e rodando o programa:
[dubois@haskell]$ javac PointWork.java
[dubois@haskell]$ java PointWork
Ponto = (12,12)
Obs:O nome do arquivo .java sempre deve ser o mesmo da
classe sendo definida. Caso exista mais de uma classe, o
U SANDO A CLASSE (Point)

13

arquivo deve ter o mesmo nome da classe que possui o

metodo
main

U SANDO A CLASSE (Point)

14

C ONSTRUTORES
metodos

executados
Construtores sao
especiais que sao
automaticamente quando um objeto e criado
Um construtor sempre possui o mesmo nome de sua classe

possui
O construtor e diferente de outros metodos
pois ele nao
tipo de retorno
possui construtor, o compilador gera um
Se uma classe nao
construtor automaticamente (como na classe Point)

C ONSTRUTORES

15

U M CONSTRUTOR PARA A CLASSE Point


class Point {
private int x, y;
public Point (int xValue, int yValue) {
x = xValue;
y = yValue;
}
}
O construtor da classe Point recebe dois argumentos do tipo
usados para inicializar os valores de x e y
int que sao
Criando um objeto Point
Point meuPonto = new Point(12,12);

U M CONSTRUTOR PARA A CLASSE Point

16

M ODIFICADORES
modificadores de visibilidade em Java
public e private sao
Membros private de uma classe podem ser acessados
apenas dentro da classe
Membros public de uma classe podem ser acessados fora
dela
Exemplo: Point
O novo construtor e public e pode ser acessado fora da
classe
Point meuPonto = new Point(0,1024);
private e nao
podem ser acessados
x e y sao
meuPonto.x = 0 //ERRO DE COMPILACAO

M ODIFICADORES

17

ACESSANDO ATRIBUTOS private


Quando se quer possibilitar o acesso a` atributos private

geralmente se fornece metodos


com o nome get e set
class Point {
private int x, y;
public Point (int x, int y) {
this.x = x;
this.y = y;
}
public int getX ()
{ return x;}
public void setX (int x)
{ this.x = x; }
}

ACESSANDO ATRIBUTOS private

18

Vantagem: restringe o acesso e permite fazer testes nos


quero que o
valores antes de modifica-los. Exemplo: Nao
Ponto tenha um valor negativo.
this.x significa que estamos usando o x que e atributo da
classe

Obs/Exerccio: E preciso definir os metodos


getY e setY.

ACESSANDO ATRIBUTOS private

19

U SANDO A CLASSE (Point)


class PointWork {
public static void main (String[] args) {
Point meuPonto = new Point(0,0);

meuPonto.setX(12);
meuPonto.setY(12);
System.out.println("Ponto = (" + meuPonto.getX() +
"," + meuPonto.getY()+")")
}
}
Rodando o programa:
[dubois@haskell]$ javac PointWork.java
[dubois@haskell]$ java PointWork
Ponto = (12,12)
U SANDO A CLASSE (Point)

20


O M ETDO
toString()

Geralmente uma classe posssui um metodo


que e usado para
transformar o conte udo do objeto em uma String
Permite que se imprima facilmente o conte udo do objeto

Esse metodo
em Java geralmente e chamdo de toString()
class Point {
private int x, y;
public Point (int x, int y) {(...) }
public int getX () { return x;}
(...)
public String toString() {
return ("(" + x + ","+ y+")" );
}
}
O M ETDO toString()

21


Note que como o metodo
toString() e definido dentro da
e necessario
usar os metodos

classe, nao
get e set para se
acessar os valores de x e y

O M ETDO toString()

22

U SANDO toString()
class PointWork {
public static void main (String[] args) {
Point meuPonto = new Point(0,0);
meuPonto.setX(12);
meuPonto.setY(12);
System.out.println("Ponto = " +
meuPonto.toString());
}
}

U SANDO toString()

23

M AIS SOBRE O toString()

Quando uma classe possui o metodo


toString(), ele e
de output
usado por default em qualquer operacao
class PointWork {
public static void main (String[] args) {
Point meuPonto = new Point(0,0);
meuPonto.setX(12);
meuPonto.setY(12);
System.out.println("Ponto = " + meuPonto);
}
}
e necessario
chamar o toString
Note que nao
explicitamente
M AIS SOBRE O toString()

24

C LASSE Reta
class Reta {
private Point p1, p2;
public Reta (int x, int y, int z, int w)
{
p1 = new Point (x,y);
p2 = new Point (z, w);
}
public Reta (Point p1, Point p2)
{
this.p1 = p1;
this.p2 = p2;
}
public String toString() {
return (p1 + "---" + p2 );
}}
C LASSE Reta

25

C LASSE Reta
class UsandoReta {
public static void main (String[] args) {
Point ponto1 = new Point(0,0);
Point ponto2 = new Point(12,12);
Reta reta = new Reta(ponto1,ponto2);
System.out.println("Reta = " + reta);
}
}

Obs: Note que a classe Reta possui 2 construtores e Java


escolhe o construtor certo dependendo dos argumentos
(overloading).

C LASSE Reta

26


VARI AVEIS
DE C LASSE
de classe e dividida por todos os objetos criados
Uma variavel
a partir dessa classe

Se um objeto modificar essa variavel,


todos os outros objetos
ver essa modificacao

irao

chamadas de variaaveis

Essas variaveis
sao
estaticas,
e sao
declaradas usando a palavra static

VARI AVEIS DE C LASSE

27


M ETODO
DE C LASSE
e necessaria
uma referencia

Nao
ao objeto para chama-lo

Chama-se o metodo
a partir do nome da classe
Ex: Math.abs()

Outro exemplo e o metodo


main
e usada para se criar um metodo

A palavra static tambem

estatico

M ETODO DE C LASSE

28

` CLASSE Point
A DICIONANDO UMA VARI AVEL
EST ATICA
A
counter serve para contar quantas objetos Point foram
criados no programa
class Point{
private static int counter = 0;
private int x,y;
public Point (int xValue, int yValue) {
x = xValue;
y = yValue;
counter++;
}
public static int getCounter()
{return counter;}
}
A DICIONANDO UMA VARI AVEL EST ATICA A` CLASSE Point

29

E XEMPLO
class PointWork {
public static void main (String[] args) {
System.out.println("Objetos criados:"
+ Point.getCounter());
Point meuPonto = new Point(12,12);
Point meuSegundoPonto = new Point(0,2);
System.out.println("Objetos criados:"
+ Point.getCounter());
}
}
Resultado:
Objetos criados: 0
Objetos criados: 2
E XEMPLO

30


E XERCI CIO : ACHAR O P ONTO M EDIO
entre dois pontos:
Ponto medio
pontoMedio (a,b) (c,d) = (a + c /2, b + d/2)

Implementar os seguintes metodos:


c.midPoint(a,b)
c = a.midPoint (b);
c = Point.midPoint (a, b);

DIO
E XERC
I CIO : A CHAR O P ONTO M E

31

L ENDO VALORES DO TECLADO


Usa-se a classe BufferedReader
BufferedReader keyboard = new
BufferedReader(new InputStreamReader(System.in));
dados de um buffer, no
BufferedReader usa-se para ler
caso o buffer esta conectado ao System.in, ou seja STDIN
(entrada no sistema).
dados vindos do teclado, usa-se
Para se ler
keyboard.readLine() que retorna uma String
importar import java.io.*; antes da
E necessario
da classe
definicao

L ENDO VALORES DO TECLADO

32

L ENDO VALORES DO TECLADO


Exemplo:
public static void main(String[] args)
throws IOException
{
BufferedReader keyboard = new
BufferedReader(new InputStreamReader(System.in));
String name;
System.out.println ("Name? ");
name = keyboard.readLine();
System.out.println ("Hello " + name);
}
do teclado pode gerar uma Excecao,
por isso usa-se
Ler
throws IOException. Voltaremos a esse assunto mais
tarde
L ENDO VALORES DO TECLADO

33

L ENDO U M ARQUIVO
o BufferedReader
Pode-se usar tambem
BufferedReader keyboard = new
BufferedReader(new FileReader("ex.txt"));
String linha;
System.out.println ("Arquivo: ");
linha = keyboard.readLine();
while(linha!=null)
System.out.println (linha);
linha = keyboard.readLine();
}

L ENDO U M ARQUIVO

34


L ENDO N UMEROS

Usa-se o estatico
metodo
Integer.parseInt
number = Integer.parseInt(keyboard.readLine());
rate = Double.parseDouble(keyboard.readLine());

L ENDO N UMEROS

35


E XCEC OES
dados de um arquivo, ou stdin, sockets, etc., sao

Ler
que podem dar errado. Ex: o arquivo nao
existe, a
operacoes
com o socket foi fechada, etc
conexao
geram
Para tratar esse tipo de erros, essas operacoes

excecoes
que podem gerar excecoes,

Em Java, operacoes
devem ser
colocada dentro de um bloco try ... catch, o que
significa tente (try) executar os comandos, se eles gerarem
esta deve ser capturada (catch), e o codigo

uma excecao,
em
catch sera executado

E XCEC OES

36


E XCEC OES
try{
BufferedReader keyboard = new
BufferedReader(new FileReader("ex.txt"));
name = keyboard.readLine();
while(name!=null)
System.out.println (name);
name = keyboard.readLine();
}
}catch(Exception e){
System.out.println("Excecao: " +e); }
exista, a excecao
gera a
Caso o arquivo nao
mensagem:Excecao:
java.io.FileNotFoundException: ex.txt (No
such file or directory)

E XCEC OES

37

E SCREVENDO EM UM ARQUIVO
Para se escrever em um arquivo usa-se o BufferedWriter
try{
BufferedWriter output =
new BufferedWriter( new FileWriter("ex.txt") );
output.write("Alo\n");
output.write("Mundo \n!!!!");
output.close();
}catch(Exception e){
System.out.println("Excecao: " +e);
}

o metodo
write(), escreve uma string no arquivo e o metodo
close() fecha o arquivo.
E SCREVENDO EM UM ARQUIVO

38

E SCREVENDO NA TELA
Pode-se usar o BufferedWriter para se escrever na tela, basta

conectar o buffer ao System.out. O metodo


flush() do
Buffer serve para esvaziar o Buffer, jogando os dados na tela.
try{
BufferedWriter output =
new BufferedWriter(new OutputStreamWriter(System.out) );
output.write("Alo\n");
output.write("Mundo \nadsfasdfasdfas");
output.flush();
}catch(Exception e){
System.out.println("Excecao: " +e);
}
E SCREVENDO NA TELA

39


L INGUAGEM B ASICA
Operadores Relacionais
<, <=, >, >=, ==, !=
Operadores Booleanos

&& (e), (ou), ! (nao)

Tipos Basicos
int, float, double, char, boolean
int i = 25; // inteiro 32bits com sinal
double d = 34.987;// 64 bits com sinal
char c = a;
boolean t = true;
float f = 21.1; // 32 bits com sinal
byte b = 10;// de -128 ate 127
Bloco if
if
L INGUAGEM B ASICA

(Expressao Booleana)
40

{// comandos}
else { //comandos}
O else e opcional

L INGUAGEM B ASICA

41

S WITCH
switch (dayNumber)
{
case 1: screen.println("Sunday"); break;
case 2: screen.println("Monday"); break;
case 3: screen.println("Tuesday"); break;
case 4: screen.println("Wednesday"); break;
case 5: screen.println("Thursday"); break;
case 6: screen.println("Friday"); break;
case 7: screen.println("Saturday"); break;
default: screen.println("Invalid day");
}
//end switch

S WITCH

42

WHILE

number = 1;
while (number <= 10) {
screen.println ( number );
number ++;
}

number =1;
do { screen.println ( number );
number ++;
} while (number <=10)

WHILE

43

FOR

sum = 0;
for (i = 0; i<10; i++) {
System.out.println("Numero: ");
number=Integer.parseInt(keyboard.readLine().trim());
sum += number;
}
screen.println("Soma = "+ sum);

FOR

44

S TRINGS
Strings e uma classe:
String str = new String ("Alo Mundo!");
criar strings sem usar o new:
Em Java pode-se tambem
String str = "Alo Mundo!"; //O efeito \e o mesmo

Para se transformar um valor em string, usa-se o metodo

estatico
String.valueOf():
double d = 3.45;
String str = String.valueOf(d);

Para se saber o tamanho de uma string, usa-se o metodo


lenght():
String str = "Alo Mundo!";
S TRINGS

45

int tamanho = str.length();


// tamanho recebe o valor 10

Para se comparar duas strings, usa-se o metodo


equals(String)
String str = "Andre";
boolean t = str.equals("Andre");
// t recebe o valor true

S TRINGS

46

A RRAYS
Para se criar um array (vetor) em java, usa-se:
double [] ad = new double[20];
int
[] ai = new int [50];
char
[] ac = new char [10];
No exemplo, ad e um vetor de double que pode conter 20
elementos, ai e um vetor de inteiros que pode conter 50
elementos e ac e um vetor de caracteres que pode conter 10
elementos
Um array pode ser inicializado quando declarado:
int[] marks={74,42,97,24,16,50,62};
Quando um vetor e declarado e inicializado, o compilador
o espaco
conta o n umero de elementos e aloca em memoria

necessario
A RRAYS

47

indexados partindo do
Os vetores, como na linguagem C, sao
0 (zero), e seu tamanho, pode ser descoberto pelo atributo

length; (Diferente de uma string que possui um metodo


length())
int i;
for (i =0; i <marks.length; i++)
{
System.out.println("Valor " + marks[i]);
}

A RRAYS

48

DE OBJETOS : Vector
C OLEC AO
de objetos que cresce
Um Vector e uma colecao

e necessario
declarar-se um
automaticamente,
ou seja, nao
tamanho para um Vector
Para usar um Vector e preciso importar import
java.util.*;

Metodos
principais: size() que retorna o tamanho atual do
Vector add(Object o) adiciona um objeto ao Vector,
Object get(int index) que devolve um objeto na
index, boolean remove (Object o) que remove
posicao

a primeira ocorrencia
do objeto o dentro do vetor e Object

remove(int index), que remove o objeto na posicao


index
Declarando um vector:
C OLEC A O DE OBJETOS : Vector

49

Vector v = new Vector();

C OLEC A O DE OBJETOS : Vector

50

C ASTING
Supondo que exista uma classe Conta que represente uma

conta em um restaurante, e que essa tenha um metodo


custoTotal() que devolva o custo da conta
double total = 0;
for (int n = 0; n < v.size(); n++)
total += ((Conta)v.get(n)).custoTotal();

No exemplo, v e um vector que possui varias


contas, e o
programa usa um loop for para calcular o custo de todas as
contas do Vector
Note que como um vector pode conter qualquer tipo de objeto,
temos que fazer um cast (ou seja, afirmar o tipo do objeto)
toda a vez que se usa um objeto armazenado no vetor :
((Conta)v.get(n)).custoTotal();
C ASTING

51

H ERANC A
Uma classe nova, pode ter muito em comum com uma classe
antiga
Heranca permite que se construa uma nova classe usando
como base uma classe antiga. A classe nova herda os

atributos e metodos
de uma classe antiga
da classe pai
A classe nova e vista como uma extensao

H ERANC A

52


H ERANC A EM C OMPUTAC AO
Java e toda baseada na ideia de heranca
Todos os objetos em Java heradam de uma super classe
chamada Object

A classe Object possui metodos


como o toString e o
equals

H ERANC A EM C OMPUTAC A O

53

E XEMPLO, E MPREGADOS
Todos os empregados em uma empresa possuem coisas em
commum: um endereco um nome e um n umero de cpf
de maneira diferente:
Os empregados podem receber o salario
mensal, semanal ou por hora
Os empregados podem ser modelados como uma classe
Empregado, que e extendida para lidar com os tipos

diferentes de salario

E XEMPLO, E MPREGADOS

54

E XEMPLO, E MPREGADOS
class Empregado {
private int cpf;
private String nome;
public Empregado () { }
public Empregado ( String nome, int cpf) {
this.cpf = cpf;
this.nome = nome;
}
public String getNome()
{ return nome; }
public String toString() {
return (cpf + "\t" + nome +"\t");
}}

E XEMPLO, E MPREGADOS

55

M ODIFICADOR private VS . protected


Atributos protected podem ser usados por subclasses, mas
estao
disponiveis para o mundo exterior
mesmo assim nao
podem ser acessados diretamente
Atributos private nao
pelas subclasses
Alguns projetistas de software falam que todos os atributos de
uma classe devem sempre ser protected, para que eles
possam ser acessados pelas subclasses
Outros acham que os atributos devem ser private :-)

M ODIFICADOR private VS . protected

56

AssalariadoMensal
class AssalariadoMensal extends Empregado {
private double salarioMensal;
public AssalariadoMensal
(String nome,int cpf,double salario) {
super (nome, cpf);
salarioMensal = salario;
}
public String toString()
{
return (super.toString() + salarioMensal);
}
}
AssalariadoMensal

57

H ERANC A

precisam ser declaradas pois


As variaveis
nome e cpf nao
herdadas da superclasse Empregado
sao
A palavra super, quando usada no construtor, permite que se
use o construtor da classe pai (superclasse). Ou seja, o novo
construtor, faz tudo o que o construtor pai fazia, mais lidar com
salarioMensal
a nova variavel

A subclasse (ou classe filho) pode reescrever os metodos


da

classe pai. No caso de AssalariadoMensal, o metodo

toString adiciona ao metodo


pai, que e chamado usando
super.toString(), o salarioMensal

O metodo
getNome e herdado da classe Empregado e pode
de um objeto da classe
ser usado atraves
AssalariadoMensal
H ERANC A

58

(OVERRIDING )
S OBREPOSIC AO
Vimos anteriormente que uma classe pode ter mais de um

metodo
com o mesmo nome, mas tipos diferentes, o que
chamamos de sobrecarga (Overloading)

Uma classe filha que herda um metodo,


pode reimplementa-lo,
ja que classes herdeiras geralmente executam tarefas

executam
adicionais que os metodos
da superclasse nao
de metodos

A reimplementacao
pela classe herdeira
(Overriding)
chamamos de Sobreposicao

Um exemplo e o metodo
toString da classe
AssalariadoMensalque foi reimplemento para adicionar o
(salarioMensal), na string retornada
valor do salario

S OBREPOSIC A O (OVERRIDING )

59

E XEMPLO, Horista
class Horista extends Empregado {
private static double valorPorHora = 15.20;
private int horas;
public Horista (String nome, int cpf, int horas) {
super (nome,cpf);
this.horas = horas;
}
public double getSalario() {
return (horas * valorPorHora);
}
public String toString() {
return (super.toString() + getSalario());
}
}
E XEMPLO, Horista

60

P ROCURA DIN AMICA


DE M ETODOS
Empregado empregado;
Horista horista = new Horista ("Andre",1234,20);
AssalariadoMensal mensal = new
AssalariadoMensal("Joao",4321,3000);
empregado = mensal;
System.out.println("Assalariado Mensal " +empregado);
empregado = horista;
System.out.println("Horista " +empregado);

Quando um metodo
e chamado, o tipo atual do objeto e usado

para se escolher qual metodo


sera usado. No exemplo, a
Empregado possui tipo Empregado, mas quando ela
variavel
recebe um objeto do tipo Horista, o toString usado e o da
classe Horista.
P ROCURA DIN AMICA DE M ETODOS

61

E XEMPLO : E MPRESA
um Vector de Empregados
Uma empresa contem
class Empresa {
private Vector vector;
public Empresa ()
{
vector = new Vector();
}

public void add(Empregado e) {


vector.add(e);
}
E XEMPLO : E MPRESA

62

Note que estamos sempre adicionando um Empregado no

Vector. Como Horista e AssalariadoMensal sao


podem ser inseridos
subclasses de Empregado elestambem
e de tipo Emregado pode receber
no Vector. A variavel
objetos das duas subclasses. Isso se chama polimorfismo.

E XEMPLO : E MPRESA

63


E XEMPLO : Empresa C ONTINUAC AO
Imprimindo todos os Empregados:
class Empresa {
(...)
public void listEmpregados()
{
for (int n = 0; n < vector.size(); n++)
System.out.println(vector.get(n));
}
Empregados podem ser tanto Horistas quanto
AssalariadoMensal. Quando imprimindo, o toString()

apropriado e usado automaticamente


E XEMPLO : Empresa C ONTINUAC A O

64


E XEMPLO : Empresa C ONTINUAC AO
se saber a qual sub classe um objeto
As vezes e necessario
pertence. Para isso, usa-se o instanceof
public void listaHoristas()
{
for (int n = 0; n < vector.size(); n++)
if (vector.get(n) instanceof Horista)
System.out.println(vector.get(n));
}

Esse metodo
imprime somente os empregados que sao
Horistas

E XEMPLO : Empresa C ONTINUAC A O

65

C LASSES A BSTRATAS
podem ser instanciadas

Classes abstratas nao


um ou mais metodos

Classes abstratas contem


abstratos
vazios, nao
possuem implementacao,

Metodos
abstratos sao
possuem apenas a assinatura

Uma subclasse de um metodo


abstrato pode implementar os

metodos
abstratos, sobrescrevendo os metodos
vazios
Uma subclasse de uma classe abstrata so e instancialvel se

todos os metodos
vazios forem sobrescritos

C LASSES A BSTRATAS

66

C LASSES A BSTRATAS
Classes abstratas geralmente existem no topo das hierarquias
usadas como modelos para as classes que
de classes e sao
seu comportamento
herdarao
Se a classe abstrata e bem pensada, ela ajuda a organizar e a
o comportamento
garantir que suas subclasses terao
adequado
As subclasses de uma classe abstrata devem implementar os

metodos
abstratos da classe pai

C LASSES A BSTRATAS

67

C LASSE E MPREGADO, COMO UMA CLASSE A BSTRATA


abstract class Empregado {
private int cpf;
private String nome;
public Empregado () { }
public Empregado (int cpf, String nome) {
this.cpf = cpf;
this.nome = nome;
}
public String toString(){
return ("Nome: " + nome+ " CPF: " +cpf + "\t");
}
abstract public double salario();
}

C LASSE E MPREGADO, COMO UMA CLASSE A BSTRATA

68

C LASSE E MPREGADO, COMO UMA CLASSE A BSTRATA

possui implementacao

O metodo
salario() e abstrato e nao
A presenca de salario() na classe abstrata Empregado
forca que todas as subclasses de Empregado possuam uma
desse metodo

implementacao

C LASSE E MPREGADO, COMO UMA CLASSE A BSTRATA

69

C ONTAS EM BANCOS

Todos os bancos oferecem varios


tipos de contas
Todas as contas possuem atributos em comum como saldo
nome, numeroDaConta, endereco...
como
Todas as contas devem fornecer certas operacoes
deposito(), saque(), transferencia(), etc...

C ONTAS EM B ANCOS

70

U MA CLASSE ABSTRATA PARA C ONTAS


Supondo que existam dois tipos de conta: normal e especial.
pode ficar negativa e a especial possui um
A conta normal nao
certo limite negativo

como saque(), e
O tipo de conta influencia
em operacoes
dinheiroDisponivel()
Podemos definir uma classe abstrata que possui todos os

atributos necessarios
em uma conta, e force que cada tipo de

conta implemente os metodos


saque() e
dinheiroDisponivel()

U MA CLASSE ABSTRATA PARA C ONTAS

71

U MA CLASSE ABSTRATA PARA C ONTAS


abstract class Conta {
private String nome;
protected double saldo;
public Conta (String nome, double saldo) {
this.nome = nome;
this.saldo = saldo;
}
public String toString() {
return (nome + "\t" + saldo + "\t");
}
public double getSaldo() {
return saldo;
}
U MA CLASSE ABSTRATA PARA C ONTAS

72


M AIS M ETODOS
COMUNS PARA A CLASSE Conta
public void deposito (double dinheiro) {
saldo += dinheiro;
}
public boolean transferencia (Conta somebody,
double money) {
if (money > 0) {
if (saque(money)) {
somebody.deposito(money);
return true;
}
}
return false;
}
M AIS M ETODOS COMUNS PARA A CLASSE Conta

73


M ETODOS
ABSTRATOS DA CLASSE Conta
abstract public boolean saque (double money);
abstract public double dinheiroDisponivel();
}

Note que mesmo sendo abstrato, o metodo


saque() foi
do metodo

usado na definicao
transferencia()

M ETODOS ABSTRATOS DA CLASSE Conta

74

ContaNormal
class ContaNormal extends Conta {
public ContaNormal (String nome, double saldo) {
super (nome, saldo);
}
public boolean saque (double money) {
if (saldo - money >= 0) {
saldo -= money;
return true;
}
else return false;
}
public double dinheiroDisponivel() {
return saldo;
}
}
ContaNormal

75

ContaEspecial
class ContaEspecial extends Conta {
private double limite = -200;
public ContaEspecial (String name, double balance) {
super (name, balance);
}
public boolean saque (double money) {
if (saldo - money >= limite) {
saldo -= money;
return true;
}
else return false;
}
public double dinheiroDisponivel() {
return (saldo - limite);
}}
ContaEspecial

76

U M LIMITE PARA A H ERANC A


Uma classe em Java possui apenas UMA classe pai, ou seja,
apenas uma superclasse
Uma classe pode ter um n umero ilimitado de classes filhas, ou

seja, varias
classes podem estender uma classe pai
Na figura, as classes filhas B, C e D estendem a classe pai
(superclasse) A
A

U M LIMITE PARA A H ERANC A

77

I NTERFACES
de metodos

Uma interface em Java, e uma colecao


abstratos

aqueles que nao

e constantes (metodos
abstratos sao

possuem implementacao)
Em outras palavras, uma interface possui apenas assinaturas

de metodos
e nenhum codigo
para eles (diferente de uma
classe abstrata)
Uma classe pode implementar mais de uma interface e ao
mesmo tempo estender uma classe pai
Essa e a maneira de se ter heranca m ultipla em Java

I NTERFACES

78

I NTERFACES
A

B e uma subclasse (classe filha) de A, ou seja, ela estende A


implementa as interfaces C e D
B tambem

I NTERFACES

79

U M EXEMPLO S IMPLES

Uma loja vende varios


itens, e cada item possui caractersticas
como um n umero que o identifica, nome, fornecedor, etc
determinados de varias

Esses itens possuem precos que sao


maneiras diferentes (por peso, quantidade) etc.
Um item, quando vendido, deve produzir um preco total
de um item pode ser uma classe abstrata
A descricao

U M EXEMPLO S IMPLES

80

Item
abstract class Item {
private int id;
private String name;
public Item (int id, String name)
{
this.id = id;
this.name = name;
}
abstract double precoTotal();
}

Item

81

I TENS
estender a classe Item e
Os diferentes itens de uma loja vao

implementar o metodo
precoTotal()
Vamos supor que alguns itens, quando vendidos em
quantidade maior do que 12, possuem descontos, com uma
taxa fixa
Desconto pode ser implementado como uma interface que e
o desconto!
implementada por todos os itens que dao

I TENS

82

Item
interface Desconto {
final double DESCONTO = 0.1;
abstract double totalDesconto();
}
A interface e declarada usando-se a palavra interface

Um interface pode possuir apenas constantes e metodos


e obrigatorio
o uso da palavra
abstratos, por isso nao
dos mesmos
abstract ou final na declaracao

SEMPRE p ublicos, mesmo


Ambos metodos
e constantes, sao
tenham sido declarados como tal (como no exemplo)
que nao

Item

83

D IAGRAMA DE C LASSES

D IAGRAMA DE C LASSES

84

U MA Garrafa COM Desconto


class Garrafa extends Item implements Desconto
private double price;
private int quantity;
public Garrafa (int id, String name,
double price, int quantity) {
super (id, name);
this.price = price;
this.quantity = quantity;
}

A palavra implements e usada para se implementar uma


interface

U MA Garrafa COM Desconto

85

U MA Garrafa COM Desconto


public double precoTotal() {
return (price*quantity - totalDesconto());
}
public double totalDesconto() {
if (quantity < 12)
return 0;
else
return price*quantity* DESCONTO;
}
}// fim da classe

U MA Garrafa COM Desconto

86

U SANDO UMA INTERFACE DE JAVA


Java possui uma interface Comparable que possui um

metodo
abstratocompareTo, com a seguinte assinatura de
tipo:
public int compareTo (Object obj)

iguais, e
Este metodo
deve retornar 0 se os dois objetos sao
se this e menor que obj o compareTo retorna um n umero
negativo, caso contrario um n umero positivo

U SANDO UMA INTERFACE DE J AVA

87

PACKAGES
Conjunto de classes com algo em comum

Serve como uma maneira de organizar e distribuir o codigo


Java
organizadas em um diretorio
com o
Todas as classes sao
nome da package.
Uma classe para ser acessada fora da package deve ser
public (so pode haver 1 classe public em um arquivo).
deve ser declarado como
O construtor da classe tambem
public se o programador deseja instanciar objetos desse tipo
fora da package;
Se nenhum modificadro e colocado ao se declarar uma

classe/metodo/construtor,
este so pode ser acessado dentro
da package.
PACKAGES

88

Dessa maneira o uso de packages fornece um outro tipo de


encapsulamento, o encapsulamento de package

PACKAGES

89

C OMO CRIAR PACKAGES


com o mesmo nome da
Deve-se primeiro criar um diretorio
package
Ex:
-> Livros
Todos as classes da package devem ser definidas dentro do

diretorio
No inicio de cada arquivo de definico de classe deve-se
colocar a o nome da package, no caso Livros
package Livros;

C OMO CRIAR PACKAGES

90

E XEMPLO DE PACKAGE
package Livros;
public class Livro
private String
private String
private String

{
titulo;
autor;
editora;

public Livro(String t, String a, String e)


{
titulo = t;
autor = a;
editora = e;
}
public String getTitulo()
E XEMPLO DE PACKAGE

91

{ return titulo;}
public String getAutor()
{ return autor;}
public String getEditora()
{ return editora;}
public String toString()
{ return ("Livro: " + titulo + " Autor: "
+ autor + " Editora: " + editora);}
}

E XEMPLO DE PACKAGE

92

E XEMPLO DE PACKAGE
package Livros;
interface Digital{
public String qualURL();
}

E XEMPLO DE PACKAGE

93

E XEMPLO DE PACKAGE
package Livros;
public class LivroDigital extends Livro implements Digital{
private String url;

public LivroDigital (String t, String a, String e, String


{
super(t,a,e);
this. url = url;
}
public String qualURL()
{ return url;}
public String toString()
E XEMPLO DE PACKAGE

94

{ return (super.toString() + " url: " + url);}


}

E XEMPLO DE PACKAGE

95

E XEMPLO DE PACKAGE
package Livros;
import java.util.*;
public class Livraria{
private Vector livros;
public Livraria()
{ livros = new Vector();}
public void adicionaLivro(Livro l)
{
livros.add(l);
}
E XEMPLO DE PACKAGE

96

public Livro procuraLivro (String titulo)


{
for (int i =0; i< livros.size(); i++)
{
if (((Livro)livros.get(i)).getTitulo().equals(titulo))
return ((Livro)livros.get(i));
}
return null;
}
public String listaLivroDigital()
{
String temp = "";
for (int i =0; i< livros.size(); i++)
{
if (livros.get(i) instanceof LivroDigital)
E XEMPLO DE PACKAGE

97

temp = temp + livros.get(i);


}
return temp;
}
}

E XEMPLO DE PACKAGE

98

U SANDO U MA PACKAGE
import Livros.*;
class UsaLivros{
public static void main (String []args)
{
Livraria l = new Livraria();
l.adicionaLivro(new Livro ("Haskell","Andre","Campus"));
System.out.println(l.procuraLivro("Haskell"));
}
}

U SANDO U MA PACKAGE

99

Anda mungkin juga menyukai