java - web.fe.up.ptarocha/aed1/apontamentos/java01.pdf · java java sumário zelementos da...

31
LEIC-FEUP 2001/2002 Algoritmos e Estruturas de Dados 1 Cristina Ribeiro 1 JAVA JAVA Sumário z Elementos da linguagem z Classes e membros z Métodos e passagem de parâmetros z Tipos primitivos e tipos de referência z Strings e Arrays z Objectos e referências z Herança z Subclasses z Interfaces z Excepções z Entrada/Saída z Organização de programas z Packages z Documentação JAVA Bibliografia Bruce Eckel z Thinking in Java, 2a. Edição, 2000. z versão electrónica em http://www.mindview.net/Books/TIJ/ z pressupõe algum conhecimento de programação H. M. Deitel, P. J. Deitel z Java How to Program, 2a. Edição. z Prentice-Hall International, 2000. z livro de programação com ênfase na linguagem Java. M. A. Weiss z Data Structures & Problem Solving Using Java, 2a. Edição. z Addison-Wesley, 2001 z Pequena introdução à linguagem, uso em estruturas de dados. F. Mário Martins z Programação Orientada aos Objectos em JAVA2 z FCA, 2000

Upload: nguyenliem

Post on 14-Dec-2018

256 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 1

JAVA

JAVA

Sumário

Elementos da linguagem

Classes e membros

Métodos e passagem de parâmetros

Tipos primitivos e tipos de referência

Strings e Arrays

Objectos e referências

Herança

Subclasses

Interfaces

Excepções

Entrada/Saída

Organização de programas

Packages

Documentação

JAVA

BibliografiaBruce Eckel

Thinking in Java, 2a. Edição, 2000.

versão electrónica em http://www.mindview.net/Books/TIJ/

pressupõe algum conhecimento de programação

H. M. Deitel, P. J. Deitel

Java How to Program, 2a. Edição.

Prentice-Hall International, 2000.

livro de programação com ênfase na linguagem Java.

M. A. Weiss

Data Structures & Problem Solving Using Java, 2a. Edição.

Addison-Wesley, 2001

Pequena introdução à linguagem, uso em estruturas de dados.

F. Mário Martins

Programação Orientada aos Objectos em JAVA2

FCA, 2000

Page 2: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 2

JAVA

Arquitectura Java

Interpretador(java)

(jview ou browser Web)

computadorexecuta Assembly

executa byte-code

Programa.classPrograma.java

Compilador(javac ou J++)

JAVA

Classes

class Animal{String name;public Animal( ){

name = new String("ANIMAL ");}String isAlive( ){ return ("yes"); }

}

class Machine{String name;public Machine( ){

name = new String("MACHINE ");}String isAlive( ){ return ("no"); }

}

Page 3: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 3

JAVA

Regras de nomeaçãoVariáveis locais e parâmetros: nomes curtos em minúsculas

Classes e Interfaces: nomes ou frases nominais, maiúsculas eminúsculas, 1ª letra maiúscula

Membros (excepto final) nomes ou frases nominais, maiúsculas eminúsculas, 1ª letra minúscula

Class SportsCar{ int currentSpeed;

int maxSpeed; ...

Constantes em interfaces e variáveis final : tudo maiúsculas,separadas por “_”

Métodos: verbos ou frases verbais, maiúsculas e minúsculas, 1ª letraminúscula

JAVA

Tipos primitivos

os tipos primitivos não originam objectos, por razões de eficiência

criam-se variáveis automáticas na pilha, que contêm os valorespropriamente ditos em vez de referências

Tipo Primitivo Dim. Mínimo Máximo Tipo Derivado

boolean 1-bit -- -- Booleanchar 16-bit Unicode 0 Unicode 216 - 1 Characterbyte 8-bit -128 +127 Byteshort 16-bit -215 +215 - 1 Shortint 32-bit -231 +231 - 1 Integerlong 64-bit -263 +263 - 1 Long

float 32-bit -3.4E+38 +3.4E+38 Floatdouble 64-bit -1.8E+308 +1.8E+308 Double

Page 4: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 4

JAVA

InicializaçãoPara os tipos primitivos é garantida

… mas só quando são membros de uma classe

Tipo Inicializaçãoboolean falsechar ‘\u0000’ (null)byte (byte)0short (short)0int 0long 0Lfloat 0.0fdouble 0.0d

JAVA

Variáveis de classeQualificador static em atributo

public class Cube {int side;public Color cColor;Cube( int s ){

side = s;}

}

class picture {Cube cube1 = new Cube ( 5 );Cube cube2 = new Cube ( 10 );Cube cube3 = new Cube ( 5 );...

}

public class Cube {static int side;public Color cColor;Cube(){ }

}

class picture {Cube cube1 = new Cube ( );Cube cube2 = new Cube ( );Cube cube3 = new Cube ( );Cube.side = 10;...

}

Page 5: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 5

JAVA

Métodos de classe

Qualificador staticem método

método da classe

pode usar-se sem que existamobjectos da classe

notação:<Classe>.<métodoEstático>(exemplo: main)

se existirem objectos dessaclasse, também funciona:<Objecto>. <métodoEstático>

não tem this: não se podemchamar métodos de instânciadentro de métodos de classe

public class Squares{ private static double squareRoots[ ] =

new double[ 100 ]; static { for( int i = 0; i < squareRoots.length; i++) squareRoots[ i ] = Math.sqrt( ( double ) i); }

// Rest of class public static void main( String [ ] args ) { System.out.println( "View first five entries");

for( int i = 0; i < 5 &&i < squareRoots.length; i++ )

System.out.println( squareRoots[ i ] ); } }

Inicialização estática: - com inicializador: static <bloco>

- com método estático: requer chamada

JAVA

Criação de objectosCriação de uma referência para uma String:

String s;cria só a referência, não o objecto

a referência está para o objecto como o comando para o televisor (deslocar a referência/comando não implica transportar o objecto/televisor)

uma mensagem para s neste ponto origina erro (não há televisor)

pode-se inicializar uma cadeia de caracteres com

String s = "asdf";mas isso é o caso especial das cadeias; em geral usa-se o operador new

Todos os objectos têm de ser criados

s = new String("asdf");tudo de uma vez: String s = new String("asdf");

à esquerda define-se a referência; à direita cria-se um objecto String inicializado

Page 6: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 6

JAVA

Objectos e referências

Variáveis dos tipos primitivos guardam valores

Variáveis dos outros tipos guardam referências para objectos

2 tipos de operações sobre uma referênciaExaminar e manipular o valor desta

⌧só se aceitam operadores = (atribuição), == e != (comparação)

Manipular o objecto referido

⌧conversão de tipos

⌧acesso a atributos ou chamada de métodos⌧Operador instanceof para verificar tipo do objecto

Atribuição esquerdo = direitotem o mesmo significado em tipos primitivos e em referência: valor guardado emdireito é copiado para esquerdo

se forem referências: esquerdo passa a referir o mesmo objecto que direito

JAVA

Métodos e passagem de parâmetros

int comprimento(String s){

return s.length();

}

este método recebe como argumento uma cadeia s

⌧mais concretamente é passada uma referência para uma cadeia

devolve (return) o resultado de enviar a mensagem length() a s

⌧o respectivo método está na classe String

⌧return termina a execução do método, onde quer que apareça

o resultado do método comprimento é do tipo int

os métodos só vivem dentro de classes

⌧comprimento, para ser compilado, tem de estar numa classe

comprimento( )c v

v = comprimento(c)

Page 7: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 7

JAVA

StringImutáveis: depois de construídas não são modificadas

Concatenação: + constrói String se um dos argumentos o for

== e != testam identidade de objectos, não igualdadeequals é método sistemático para testar igualdade

Alguns Métodosesquerdo.compareTo(direito) compara de acordo com ordem lexicográfica

cadeia.length()

cadeia.charAt(pos) indexa a partir de 0cadeia.substring(ini, fim)

tostring converte tipo primitivo em String (é implícito em +)

Integer.parseInt constrói inteiro representado em String

JAVA

Array

Colecção de entidades do mesmo tipo

declaração int [] array1 ou int array1 []

Construçãoarray1 = new int [100]

com incialização: int [] array2 = {3, 4, 5, 6}

necessário criar elementos:

Button [] arrayOfButtons;

arrayOfButtons = new Button [5];

for( int i=0; i< arrayOfButtons.length; i++)

arrayOfButtons[i] = new Button();

construção é dinâmica

multi-dimensional: int [][] x = new int [2][3];

Page 8: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 8

JAVA

Referências e atribuição

class Number { int i;}

public class Assignment { public static void main(String[] args) { Number n1 = new Number(); Number n2 = new Number(); n1.i = 9; n2.i = 47; System.out.println("1: n1.i: " + n1.i + ", n2.i: " + n2.i); n1 = n2; System.out.println("2: n1.i: " + n1.i + ", n2.i: " + n2.i); n1.i = 27; System.out.println("3: n1.i: " + n1.i + ", n2.i: " + n2.i); }}

class Letter { char c;}

public class PassObject { static void f(Letter y) { y.c = 'z'; }

static void main(String[] args) { Letter x = new Letter(); x.c = 'a'; System.out.println("1: x.c: " + x.c); f(x); System.out.println("2: x.c: " + x.c); }}

•Atribuição muda referências

•Objecto passado como parâmetro: a referência é usada

JAVA

class Value { int i; } public class EqualsMethod2 { public static void main(String[] args) { Value v1 = new Value(); Value v2 = new Value(); v1.i = v2.i = 100; System.out.println(v1.equals(v2)); }}

Igualdade public class Equivalence { public static void main(String[] args) { Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1 == n2); System.out.println(n1 != n2); }}

public class EqualsMethod { public static void main(String[] args) { Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1.equals(n2)); }}

Igualdade com ==

só para tipos primitivos

Para os outros

== compara as referências

Para os objectos de uma nova classe,equals exibe o comportamento poromissão: compara as referências!

Page 9: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 9

JAVA

Sobrecarga

class Arvore { int altura;

static int quant=0;

Arvore() {

prt("Semeando uma semente");

altura = 0; quant++; }

Arvore(int i) { prt("Plantando uma arvore com "

+ i + " metros de altura");

altura = i; quant++; } void info() { prt("A arvore tem " + altura +

" metros de altura"); } void info(String s) { prt(s + ": a arvore tem " + altura

+ " metros"); } static void prt(String s) { System.out.println(s); }}

import java.util.*;

public class Sobrecarga {

static Random alea = new Random();

static int aleatorio(int mod) {

return Math.abs(alea.nextInt()) % mod;

}

public static void main(String args[]) {

int i = 0;

while(i != 9) {

Arvore t = new Arvore(i = aleatorio(10));

t.info();

t.info("Legenda");

} // construtor sobrecarregado:

new Arvore();

Arvore.prt ("Instâncias: "+ Arvore.quant);

}

}

JAVA

Membros das classes

altura:7 altura: 4

alturainfo()info(-)quant: 2prt()Arvore()Arvore(-)

Arvore

membros de instância

membros de classe

info()info(-)

prt()“new”

aleaaleatorio()

Sobrecarga

membros de classe

Page 10: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 10

JAVA

Sobrecarga de métodos

sobrecarga - permite lidar comvariações de conceitosessencialmente idênticos

comportamentos diferentesconforme o número e tipo deargumentos do método respectivo

Construtores: métodos especiaisque não devolvem nada (nemvoid) e têm nome fixo; podem sersobrecarregados

Operadores: não podem sersobrecarregados

excepção: + e += em String

Exemplo das árvores:

o método info pode ter ou nãouma etiqueta como argumento

pode-se criar uma árvore semaltura (semeá-la) ou com altura(plantar uma já crescida)

o gerador de números aleatóriosfica numa variável de classe,para poder ser actuado por ummétodo de classe

a atribuição, para além defuncionar como instrução,também é uma expressão

JAVA

Métodos BásicosAcesso e modificação

deve ser feito via métodos, e não tornando públicos os atributos

⌧para cada atributo acessível: métodos verAtrib e porAtrib

⌧pode assegurar-se estado consistente dos dados

Saídatostring - método de classe que devolve String própria para imprimir

⌧Método toString na classe Object devolve uma string com o nome da classe do objecto,seguida de `@', seguida da representação hexadecimal do seu código de hash

equals - testar se 2 referências são para o mesmo valor

public boolean equals( Object obj) retorna true na classe UmaClasse se

⌧obj é instância de UmaClasse

⌧convertendo obj para UmaClasse, todos os atributos primitivos são iguais (==) etodas as referências são iguais (equals) aos do objecto corrente

main - qualquer classe pode ter (usar em teste)

Page 11: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 11

JAVA

Auto-referência (this)

um método tem sempre umparâmetro implícito que éo objecto (ou classe) a quese vai aplicar

x.inc() pode ser visto comoinc(x) (notação mais corrente)

se se omitir o objecto assume-se que se trata do objectocorrente

para referir explicitamente oobjecto corrente usa-se this

uma escolha criteriosa doresultado das funções podepermitir um estilo de escritaque use composição de funções

public class Contador {

private int i = 0;

Contador inc() {

i++;

return this; }

void print() {

System.out.println("i = " + i); }

public static void main(String args[]){

Contador x = new Contador();

Contador y = new Contador();

x.inc().inc().inc().print();

y.inc().print(); }

}//Contador

JAVA

Referências this e super

para designar um membro m (atributo ou método) de umobjecto o, a notação é o.m

na definição dos métodos de uma classe, o objecto corrente está normalmenteimplícito (referem-se os membros sem prefixo)

se existir uma variável x num método da classe com o mesmo nome de um atributo,este fica escondido; para lhe chegar usa-se this.x

this refere-se ao objecto corrente

se existir um método local f() com o mesmo nome de um numa superclasse, estefica escondido; para lhe chegar usa-se super.f()

super refere-se ao objecto corrente, mas indicando o início da pesquisa de métodossó na superclasse imediata (as variáveis visíveis em f() são as do objecto corrente)

super pode ser usado para fazer revogação parcial de um método: fornecer novadefinição que chama método da superclasse

Page 12: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 12

JAVA

Construtores

evitar objectos com variáveis porinicializar

Construtor - é um método com omesmo nome da classe invocado nacriação de cada instância, e queprocede à sua inicialização

a responsabilidade é doimplementador da classe e não dosprogramadores que a usam

possível passar argumentos acompletar a inicialização

class Tijolo{

Tijolo() { // é este o construtor

System.out.println("A criar umtijolo");

}}

public class Construcao {

public static void main(String args[]){

for(int i = 0; i < 10; i++)

new Tijolo();

}}

JAVA

Construtores e thispublic class Flor {

private int i = 0;

private String s = new String(null);

Flor(int x){

i = x;

System.out.println(

"Construtor com int: i= " + i );}

Flor(String ss) {

System.out.println(

"Construtor com String:s= " +ss );

s = ss;}

Flor(String s, int x) {

this(x);

this.s = s; // Outro uso do "this"

System.out.println("Dois args");

}

Flor() {

this("Cravo", 47);

System.out.println(

"Construtor p/ omissão (sem args)" );

}

void print() {

System.out.println(

"i = " + i + " s = " + s);

}

public static void main(String args[]){

Flor x = new Flor();

x.print();

} }

/* resultado:

Construtor com int: i=47

Dois args

Construtor por omissão (sem args)

i=47 s=Cravo */

Page 13: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 13

JAVA

Criação e eliminaçãoo construtor por omissãonão tem argumentos

só é sintetizado se não se definirnenhum construtor

um construtor pode usaroutro chamando-o com asintaxe this(args)

tem de ser a primeira instrução

só se pode chamar outro construtoruma vez

não se pode usar esta sintaxe nummétodo que não seja um construtor

uso do this, como referência aoobjecto corrente, dentro de umconstrutor; por exemplo paradesambiguar um nome de atributoigual a um argumento (this.s=s)

não existe destruição deobjectos

quando deixam de ser precisos(não há mais referências paraeles) são eliminados pelocolector de lixo (garbagecolector), que é um processoautomático do sistema deexecução Java (ver exemplo dostijolos)

se não se define oconstrutor

construtor por omissão inicializa

⌧tipos primitivos a 0⌧referências a null

JAVA

Classes e subclasses

Objecto da subclasse é “do mesmo tipo” que objecto da classe

Como se estende a classe na subclasse

Novos métodos

Novas definições para os métodos

Page 14: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 14

JAVA

Classe Derivada

Acrescenta atributos

Pode acrescentar métodos

Métodos da classe de base não redefinidos: herdados

Métodos da classe de base redefinidos na parte pública revogados

Métodos públicos da classe de base não podem ser redefinidos como privados

Membros protected da classe basevisíveis nas classes derivadas

Membros final⌧método final: não pode ser revogado⌧classe final: é folha na hierarquia

JAVA

Herançaclass Cleanser {

private String s=new String("Cleanser");

public void append(String a) {

s += a; }

public void dilute() {

append(" dilute()"); }

public void apply() {

append(" apply()"); }

public void scrub() {

append(" scrub()"); }

public void print() {

System.out.println(s); }

public static void main(String[] args){

Cleanser x = new Cleanser();

x.dilute(); x.apply(); x.scrub();

x.print();}

}

public class Detergent extends Cleanser {

// Change a method:

public void scrub() {

append(" Detergent.scrub()");

//Call base-class version

super.scrub();}

// Add methods to the interface:

public void foam() {

append(" foam()"); }

public static void main(String[] args){

Detergent x = new Detergent();

x.dilute(); x.apply();

x.scrub(); x.foam(); x.print();

System.out.println("Test base class:");

Cleanser.main(args);}

}

Page 15: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 15

JAVA

Construção com herança

a hierarquia pode ter mais doque dois níveis

o sistema chama todos osconstrutores que afectam oobjecto, começando pelo maisgeral

resultado

Construtor Arte

Construtor Desenho

Construtor Cartoon

herança suportadesenvolvimento incremental eprototipagem rápida

// Cartoon.java

class Arte {

Arte() {

Println(”Construtor Arte");

} }

class Desenho extends Arte {

Desenho() {

Println(”Construtor Desenho");

} }

public class Cartoon extends Desenho {

Cartoon() {

Println(”Construtor Cartoon"); }

public static void main(String args[]){

Cartoon x = new Cartoon(); } }

JAVA

Herança e construção class Game { Game(int i) {

System.out.println("Game constructor");

}

}

class BoardGame extends Game { BoardGame(int i) {

super(i);

System.out.println("BoardGame constructor"); }

}

public class Chess extends BoardGame { Chess() {

super(11);

System.out.println("Chess constructor");

}

public static void main(String[] args) {

Chess x = new Chess(); }

}

Page 16: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 16

JAVA

HerançaHierarquia é induzida pela relação IS-A

Animal

Cão

IS-AException

RuntimeException

IOException

NullPointerException

IndexOutOfBoundsException

EOFException

FileNotFoundException

IS-A é transitiva

NullPointerException é Exception, embora não seja esta a sua classe de base

Operador instanceof atravessa hierarquia

X is-a Y e Y is-a Z : se obj é do tipo X (e não é null) obj instanceof Z é true

JAVA

Herança e Inicialização

class Insect {

int i = 9;

int j;

Insect() {

prt("i = " + i + ", j = " + j);

j = 39;

}

static int x1 =

prt("static Insect.x1 initialized");

static int prt(String s) {

System.out.println(s);

return 47;

}

}

public class Beetle extends Insect {

int k = prt("Beetle.k initialized");

Beetle() {

prt("k = " + k);

prt("j = " + j);

}

static int x2 =

prt("static Beetle.x2 initialized");

public static void main(String[] args){

prt("Beetle constructor");

Beetle b = new Beetle();

}

}

Page 17: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 17

JAVA

Herança MúltiplaProblema: como definir objectos que se enquadram em mais doque uma hierarquia?

Public interface Noisy {String noise( );

}

Public interface Moves {String move( );

}

Interface• abstracta: não pode ser implementada independentemente de uma classe• métodos são public abstract• atributos são public static final

JAVA

InterfacesColecção de nomes de métodos que fornecem “esquemas” para acriação de novas classes

Exemplos

Runnable no package java.lang

DataInput no package java.io

São abstractas: métodos são definidos, implementação fica paraas subclasses

public interface Vehicle {void goForward( );void goBackward( ):

}

public class Car implements Vehicle {...

void goForward( ) {...

}void goBackward( ) {

...}}

Page 18: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 18

JAVA

Interface e Implementação

public class Cat extends Animal implements Noisy, Moves{

String name;public Cat( ) { name = new String( "Cat " ); }public String noise( ){

return ("MEOW ");}public String move( ){

return ("feet ");}

}

public class Car extends Machine implements Noisy, Moves{

String name;public Car( ) {

name = new String("Car "); }public String noise( ){

return ("VROOM ");}public String move( ) {

return ("wheels ");}

}

class Ear {String heard;void hear (Noisy n){

heard = n.noise( );}

}

JAVA

Herança Múltipla

import java.util.*;

interface CanFight {

void fight();

}

interface CanSwim {

void swim();

}

interface CanFly {

void fly();

}

class ActionCharacter {

public void fight() {}

}

class Hero extends ActionCharacter

implements CanFight, CanSwim, CanFly {

public void swim() {}

public void fly() {}

}

public class Adventure {

static void t(CanFight x) { x.fight(); }

static void u(CanSwim x) { x.swim(); }

static void v(CanFly x) { x.fly(); }

static void w(ActionCharacter x) {x.fight(); }

public static void main(String[] args) {

Hero h = new Hero();

t(h); // Treat it as a CanFight

u(h); // Treat it as a CanSwim

v(h); // Treat it as a CanFly

w(h); // Treat it as an ActionCharacter

}}

Page 19: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 19

JAVA

Uma Interface da API

boolean readBoolean() byte readByte() char readChar() double readDouble() float readFloat() void readFully(byte[] b) int readInt() String readLine() int readUnsignedByte() int skipBytes(int n)

java.io Interface DataInput

All Known Subinterfaces: ObjectInput

All Known Implementing Classes: RandomAccessFile, DataInputStream

Alguns métodos:

JAVA

Excepção

Em Java: Classes Error e Exception, subclasses de Throwable

Excepção:

⌧Objecto que guarda informação transmitida fora da sequência normal de retorno

⌧Propagada para trás na sequência de chamadas até método que a trate

⌧Formato:try <bloco>

catch ( <UmaClasseException> e) <bloco>finally <bloco>

⌧Comportamento:se try executa sem excepção : passa a bloco de finallyse try encontra excepção que não tem catch correspondente: passa a bloco finally epropagase try encontra excepção que tem catch correspondente: executa blocos de catch e definally

Erro:

⌧Situação anormal que não requer “catch” numa aplicação regular

Page 20: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 20

JAVA

Excepções

Checked exceptions: tem de ser feito o catch ou declarado throws

public static void processa( String cadeia) throws IOException{ ...}public static void main(String [] args){

for( int i = 0; i < args.length; i++){

try{ processa( args[i] ); }

catch( IOException e ){ System.err.println( e ); }

} }

Assinalar situação de excepção detectadathrow new Exception( “Vai mal” )

JAVA

Entrada/Saída

Streamspredefinidos:

system.in

System.out

system.err

import java.io.*;

public class DivideByTwo{ public static void main( String [ ] args ) { BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) ); int x; String oneLine;

System.out.println( "Enter an integer: " ); try { oneLine = in.readLine( ); x = Integer.parseInt( oneLine ); System.out.println( "Half of x is " + ( x / 2 ) ); } catch( Exception e ) { System.out.println( e ); } } }

Page 21: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 21

JAVA

Leitura em Ficheiros Sequenciais

Reading charactersReading bytes

UnformattedFormatted

(Chapman, Cap. 14)

JAVA

Escrita em Ficheiros Sequenciais

Writing charactersWriting bytes

Unformatted

Formatted(Chapman, Cap. 14)

Page 22: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 22

JAVA

Entrada/Saídaimport java.io.*;import java.util.*;

public class MaxTest{ public static void main( String args[ ] ) { BufferedReader in = new BufferedReader(new InputStreamReader( System.in ) ); String oneLine; StringTokenizer str; int x; int y;

System.out.println( "Enter 2 ints on one line: " ); try { oneLine = in.readLine( ); str = new StringTokenizer( oneLine ); if( str.countTokens( ) != 2 ) throw new NumberFormatException( ); x = Integer.parseInt( str.nextToken( ) ); y = Integer.parseInt( str.nextToken( ) ); System.out.println( "Max: " + Math.max( x, y ) ); } catch( Exception e ) { System.err.println( "Error: need two ints" ); } } }

JAVA

Modificadores de Visibilidadepublic: (método, variável, classe)

acessível por todas as outras classes (que importem o pacote) e seus membros

<sem declaração> = friend

acessível pelas classes do pacote

invisível para as outras (mesmo as subclasses)

private: (método, variável)

acessível apenas por métodos da classe

protected: (método, variável)

acessível pelas classes do pacote e pelas subclasses da que contém o item (por herança)

private protected

só acessível pelas subclasses

inacessível para as do pacote

Modificador é obrigatório em cada variável de instância ou método

Page 23: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 23

JAVA

Uma classe privada

class Soup {

private Soup() {}

// (1) Allow creation via static method:

public static Soup makeSoup() {

return new Soup();

}

// (2) Create a static object and

// return a reference upon request.

// (The "Singleton" pattern):

private static Soup ps1 = new Soup();

public static Soup access() {

return ps1;

}

public void f() {}

}

class Sandwich { // Uses Lunch

void f() { new Lunch(); }

}

public class Lunch {

void test() {

//! Soup priv1 = new Soup();

Soup priv2 = Soup.makeSoup();

Sandwich f1 = new Sandwich();

Soup.access().f();

}

}

JAVA

Modificadores

abstract: (método) não tem corpo

declara funcionalidade que a classe derivada tem de fornecer

abstract: (classe) não tem instâncias

public abstract class Shape( ) { public abstract void draw( ); } public class Circle extends Shape { public void draw( ) { your method here... } }

Page 24: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 24

JAVA

Classe abstract da API

public abstract class KeyAdapter

extends Object

implements KeyListener

Classe de adaptação para eventos do teclado

Estender esta para criar um “listener” para objectos KeyEvent e sobrepormétodos só para os eventos de interesse

Vantagem sobre interface:Se se implementa o KeyListener interface, têm de se definir todos os métodos

a classe abstracta define methods nulos para todos eles, quem usa sobrepõe só os de interesse

component.addKeyListener(new KeyAdapter() {

public void keyPressed(KeyEvent evt) {

} });

JAVA

Aplicação// Propriedades.java

import java.util.*; //+ import java.io.*;

public class Propriedades {

public static void main(String args[]) { //+ throws IOException

System.out.println(new Date()); // data do dia

System.getProperties().list(System.out); // info sobre sistema

Runtime rt = Runtime.getRuntime(); // info sobre execução

System.out.println( "Memoria Total = " + rt.totalMemory()

+ " Memoria Livre = " + rt.freeMemory());

//+ int x = System.in.read() // pausa

}

}

// activar instruções //+ para correr com jview

import public main static System Date <class>.<metodo>

Page 25: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 25

JAVA

Applets

Applets: programas preparadospara serem executados no ambientede um vasculhador Web

applet tem que ser uma subclassede Applet e tem que ser pública

o vasculhador chamaautomaticamente o métodopaint(), usado para escrever noécran

o método drawString tem comoparâmetros a cadeia e a respectivaposição na janela

ficheiro HTML chama applet

// Ola.javaimport java.awt.Graphics;import java.applet.Applet;public class Ola extends Applet {

public void paint( Graphics g ){g.drawString("Ola a todos!", 25,25);}

}

<!Ola.html>

<html>

<applet code=Ola.class width=275height=35 >

</applet>

</html>

JAVA

Métodos automáticos numa appletpublic void init()

⌧chamado uma vez ao carregar a applet; inicializa variáveis e componentes GUIpublic void resize( int width, int heigth ) redimensiona a applet

public void start()

⌧chamado a seguir ao init e sempre que o utilizador retorna à página HTML daapplet; arranca animações e fios de execução

public void paint( Graphics g )

⌧chamado depois do init acabar e de o start começar; (re)desenha a applet e échamado quando esta é coberto por outra janela

⌧public void repaint() permite chamar o paint sem precisar do gpublic void stop()

⌧chamado para terminar a execução quando o vasculhador deixa a página HTMLda applet; interrompe animações e fios de execução

public void destroy()

⌧chamado para eliminar a applet da memória quando o vasculhador termina;cancela fios de execução

Page 26: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 26

JAVA

Appletpublic class Spot extends Applet implements MouseListener { private java.awt.Point clickPoint = null;

private static final int RADIUS = 7;

public void init() {addMouseListener(this);

}

public void paint(Graphics g) {g.drawRect(0, 0, getSize().width - 1,

getSize().height - 1);

if (clickPoint != null)

g.fillOval(clickPoint.x - RADIUS,

clickPoint.y - RADIUS,

RADIUS * 2, RADIUS * 2);

}

public void mousePressed(MouseEvent event) { clickPoint = event.getPoint();

repaint();

}

public void mouseClicked(MouseEvent event) {}

public void mouseReleased(MouseEvent event) {}

public void mouseEntered(MouseEvent event) {}

public void mouseExited(MouseEvent event) {} }

import java.applet.Applet;import java.awt.*;import java.awt.event.*;

JAVA

Applet import java.applet.*;

import java.awt.*;

public class BasicApplet extends Applet {

public void init() {

// Called once by the browser when it starts the applet.

}

public void start() {

// Called whenever the page containing this applet is made visible.

}

public void stop() {

// Called whenever the page containing this applet is not visible.

}

public void destroyed() {

// Called once when the browser destroys this applet.

}

public void paint(Graphics g) {

// Called whenever this applet needs to repaint itself.

}

}

Page 27: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 27

JAVA

Applet public class AdapterSpot extends Applet //no implements clause

{

private Point clickPoint = null;

private static final int RADIUS = 7;

public void init() {

addMouseListener(new MyMouseAdapter());

}

public void paint(Graphics g) {

g.drawRect(0, 0, getSize().width - 1,

getSize().height - 1);

if (clickPoint != null)

g.fillOval(clickPoint.x-RADIUS,

clickPoint.y-RADIUS,

RADIUS*2, RADIUS*2);

}

class MyMouseAdapter extends MouseAdapter {

public void mousePressed(MouseEvent event) {

clickPoint = event.getPoint();

repaint(); }}

import java.applet.Applet;import java.awt.*;import java.awt.event.*;

JAVA

Packages

Organizam classes relacionadasevitam o uso de nomes completos

sintaxe declaração package MeuPacote antes da definição da classe

sintaxe importação:

⌧import NomePackage.NomeClasse ou import NomePackage.*

pode tornar difícil, ao ler o código, identificar a origem das classes

importação de java.lang é automática; resultam classes Math, Integer, System, ...

Pesquisa de pacotes: em directórios do CLASSPATH

Classes do package P: no directório P, em caminho do CLASSPATH

Visibilidade

⌧sem modificador são friendly ; public são acessíveis fora do pacote

todas as classes encontradas em CLASSPATH e sem declaração de package são domesmo package por omissão

Page 28: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 28

JAVA

Componentes genéricos

Reutilização de código:

implementação igual a menos do tipodos dados: fazer implementaçãogenérica

ex: ordenação de um vector nãodepende do tipo dos seus elementos

Programação genérica emJAVA:

classe genérica usa objectos de umasuperclasse apropriada (ex: Object)

ex: ordenação de um vector nãodepende do tipo dos seus elementos

// MemoryCell class// Object read( ) // --> Returns the stored value// void write( Object x ) // --> x is stored

public class MemoryCell{ // Public methods

public Object read( )

{ return storedValue; }

public void write( Object x)

{ storedValue = x; }

// Private internal data

private Object storedValue;}

JAVA

Classes “wrapper”Classes especiais para os 8 tipos primitivos

permitem tratá-los genericamente como objectos

public class TestMemoryCell{ public static void main( String [ ] args ) { MemoryCell m = new MemoryCell( );

m.write( new Integer( 5 ) ); System.out.println( "Contents are: " + ( (Integer) m.read( ) ).intValue( ) ); }}

Page 29: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 29

JAVA

Documentação automática

javadoc - aproveita ainformação no ficheirode descrição de umaclasse (implementação)para documentar ainterfaceSaída é ficheiro HTML

comentários com /** são usados

etiquetas especiais para meta-informação

@author, @param, @return, @exception

/** * A class for simulating an integer memory cell * @author Mark A. Weiss */public class IntCell{ /** * Get the stored value. * @return the stored value. */ public int read( ) { return storedValue; }

/** * Store a value * @param x the number to store. */ public void write( int x ) { storedValue = x; }

private int storedValue;}

JAVA

Packages na API Java

java.lang

construções básicas da linguagem; importado automaticamente

java.util

processamento de datas e horas, números aleatórios, cadeias, …

java.io (input/output)

entrada e saída de dados

java.net

suporte para comunicação via Internet

java.applet

criação de applets e respectiva interacção

java.awt (abstract windowing toolkit)

criação e manipulação de GUI

javax.swing

criação e manipulação de GUI, pacote “leve”

Page 30: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 30

JAVA

Serialização de ObjectosInterface Serializable em java.io

Classes que não implementam esta interface não têm o seu estado serializado or des-serializado

Subclasses de classe “serializable” são também “serializable”

A interface de serialização não tem métodos nem atributos e serve apenas paraidentificar a classe como serializável

Interface ObjectOutput em java.io

extends DataOutput inclui escrita de objectos

DataOutput tem métodos para saída de tipos primitivos

ObjectOutput alarga-a para incluir Object, arrays, Strings

Implementada por ObjectOutputStream

void writeObject(Object obj)Write an object to the underlying storage or stream.

JAVA

Serialização de ObjectosInterface Serializable em java.io

Classes que não implementam esta interface não têm o seu estado serializado or des-serializado

Subclasses de classe “serializable” são também “serializable”

A interface de serialização não tem métodos nem atributos e serve apenas paraidentificar a classe como serializável

Interface ObjectInput em java.io

extends DataInput inclui escrita de objectos

DataInput tem métodos para saída de tipos primitivos

ObjectInput alarga-a para incluir Object, arrays, Strings

Implementada por ObjectInputStream

Object readObject()Read and return an object.

Page 31: JAVA - web.fe.up.ptarocha/AED1/APONTAMENTOS/JAVA01.pdf · JAVA JAVA Sumário zElementos da linguagem zClasses e membros zMétodos e passagem de parâmetros zTipos primitivos e tipos

LEIC-FEUP 2001/2002Algoritmos e Estruturas de Dados 1

Cristina Ribeiro 31

JAVA

Serialização- exemplo

FileOutputStream ostream = new FileOutputStream("t.tmp");

ObjectOutputStream p = new ObjectOutputStream(ostream);

p.writeInt(12345);

p.writeObject("Today");

p.writeObject(new Date());

p.flush();

ostream.close();