JAVA Bibliografia

Propaganda
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
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
Bibliografia
Bruce 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
JAVA
Cristina Ribeiro
1
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Arquitectura Java
Programa.java
Programa.class
Compilador
(javac ou J++)
Interpretador
(java)
(jview ou browser Web)
computador
executa Assembly
executa by te-code
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"); }
}
JAVA
Cristina Ribeiro
2
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Regras de nomeação
Variáveis locais e parâmetros: nomes curtos em minúsculas
Classes e Interfaces: nomes ou frases nominais, maiúsculas e
minúsculas, 1ª letra maiúscula
Membros (excepto final) nomes ou frases nominais, maiúsculas e
minú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ª letra
minú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 valores
propriamente ditos em vez de referências
Tipo Primitivo Dim.
Mínimo
Máximo
boolean
char
byte
short
int
long
float
double
-Unicode 0
-128
-215
-231
-263
-3.4E+38
-1.8E+308
-Unicode 216 - 1
+127
+215 - 1
+231 - 1
+263 - 1
+3.4E+38
+1.8E+308
1-bit
16-bit
8-bit
16-bit
32-bit
64-bit
32-bit
64-bit
Tipo Derivado
Boolean
Character
Byte
Short
Integer
Long
Float
Double
JAVA
Cristina Ribeiro
3
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Inicialização
Para os tipos primitivos é garantida
… mas só quando são membros de uma classe
Tipo
boolean
char
byte
short
int
long
float
double
Inicialização
false
‘\u0000’ (null)
(byte)0
(short)0
0
0L
0.0f
0.0d
JAVA
Variáveis de classe
Qualificador static em atributo
public class Cube {
int side;
public Color cColor;
Cube( int s ){
side = s;
}
}
class picture
Cube
Cube
Cube
...
}
{
cube1 = new Cube ( 5 );
cube2 = new Cube ( 10 );
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;
...
}
JAVA
Cristina Ribeiro
4
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Métodos de classe
Qualificador static
em método
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);
}
método da classe
pode usar-se sem que existam
objectos da classe
notação:
<Classe>.<métodoEstático>
(exemplo: main)
// Rest of class
public static void main( String [ ] args )
{
System.out.println( "View first five entries");
se existirem objectos dessa
classe, também funciona:
<Objecto>. <métodoEstático>
for( int i = 0; i < 5 &&
i < squareRoots.length; i++ )
System.out.println( squareRoots[ i ] );
não tem this: não se podem
chamar métodos de instância
dentro de métodos de classe
}
}
Inicialização estática:
- com inicializador: static <bloco>
- com método estático: requer chamada
JAVA
Criação de objectos
Criaçã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
JAVA
Cristina Ribeiro
5
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
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ência
Examinar 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 = direito
tem o mesmo significado em tipos primitivos e em referência: valor guardado em
direito é 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();
c
}
comprimento( )
v
v = comprimento(c)
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
JAVA
Cristina Ribeiro
6
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
String
Imutá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 igualdade
equals é método sistemático para testar igualdade
Alguns Métodos
esquerdo.compareTo(direito) compara de acordo com ordem lexicográfica
cadeia.length()
cadeia.charAt(pos) indexa a partir de 0
cadeia.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ção
array1 = 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];
JAVA
Cristina Ribeiro
7
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Referências e atribuição
class Number {
int i;
}
class Letter {
char c;
}
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);
}
}
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
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 por
omissão: compara as referências!
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));
}}
JAVA
Cristina Ribeiro
8
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
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
Arvore
membros de instância
membros de classe
altura
info()
info(-)
quant: 2
prt()
Arvore()
Arvore(-)
altura:7
altura: 4
Sobrecarga
membros de classe alea
aleatorio()
prt()
“new”
info()
info(-)
JAVA
Cristina Ribeiro
9
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Sobrecarga de métodos
sobrecarga - permite lidar com
variações de conceitos
essencialmente idênticos
comportamentos diferentes
conforme o número e tipo de
argumentos do método respectivo
Construtores: métodos especiais
que não devolvem nada (nem
void) e têm nome fixo; podem ser
sobrecarregados
Operadores: não podem ser
sobrecarregados
excepção: + e += em String
Exemplo das árvores:
o método info pode ter ou não
uma etiqueta como argumento
pode-se criar uma árvore sem
altura (semeá-la) ou com altura
(plantar uma já crescida)
o gerador de números aleatórios
fica numa variável de classe,
para poder ser actuado por um
método de classe
a atribuição, para além de
funcionar como instrução,
também é uma expressão
JAVA
Métodos Básicos
Acesso 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ída
tostring - 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 (==) e
todas as referências são iguais (equals) aos do objecto corrente
main - qualquer classe pode ter (usar em teste)
JAVA
Cristina Ribeiro
10
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Auto-referência (this)
um método tem sempre um
parâmetro implícito que é
o objecto (ou classe) a que
se vai aplicar
x.inc() pode ser visto como
inc(x) (notação mais corrente)
se se omitir o objecto assumese que se trata do objecto
corrente
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[]){
para referir explicitamente o
objecto corrente usa-se this
Contador x = new Contador();
uma escolha criteriosa do
resultado das funções pode
permitir um estilo de escrita
que use composição de funções
x.inc().inc().inc().print();
Contador y = new Contador();
y.inc().print(); }
}//Contador
JAVA
Referências this e super
para designar um membro m (atributo ou método) de um
objecto o, a notação é o.m
na definição dos métodos de uma classe, o objecto corrente está normalmente
implí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, este
fica escondido; para lhe chegar usa-se super.f()
super refere-se ao objecto corrente, mas indicando o início da pesquisa de métodos
só 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 nova
definição que chama método da superclasse
JAVA
Cristina Ribeiro
11
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Construtores
evitar objectos com variáveis por
inicializar
class Tijolo{
Tijolo() { // é este o construtor
System.out.println("A criar um
tijolo");
Construtor - é um método com o
mesmo nome da classe invocado na
criação de cada instância, e que
procede à sua inicialização
a responsabilidade é do
implementador da classe e não dos
programadores que a usam
}}
public class Construcao {
public static void main(String args[])
{
for(int i = 0; i < 10; i++)
possível passar argumentos a
completar a inicialização
new Tijolo();
}}
JAVA
Construtores e this
public class Flor {
Flor() {
private int i = 0;
this("Cravo", 47);
private String s = new String(null);
System.out.println(
Flor(int x){
"Construtor p/ omissão (sem args)" );
i = x;
}
System.out.println(
void print() {
"Construtor com int: i= " + i );}
System.out.println(
"i = " + i + " s = " + s);
Flor(String ss) {
System.out.println(
"Construtor com String:s= " +ss );
s = ss;}
}
public static void main(String args[]){
Flor x = new Flor();
x.print();
} }
Flor(String s, int x) {
this(x);
/* resultado:
this.s = s; // Outro uso do "this"
Construtor com int: i=47
System.out.println("Dois args");
Dois args
Construtor por omissão (sem args)
}
i=47 s=Cravo */
JAVA
Cristina Ribeiro
12
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Criação e eliminação
o construtor por omissão
não tem argumentos
só é sintetizado se não se definir
nenhum construtor
um construtor pode usar
outro chamando-o com a
sintaxe this(args)
tem de ser a primeira instrução
só se pode chamar outro construtor
uma vez
não se pode usar esta sintaxe num
método que não seja um construtor
uso do this, como referência ao
objecto corrente, dentro de um
construtor; por exemplo para
desambiguar um nome de atributo
igual a um argumento (this.s=s)
não existe destruição de
objectos
quando deixam de ser precisos
(não há mais referências para
eles) são eliminados pelo
colector de lixo (garbage
colector), que é um processo
automático do sistema de
execução Java (ver exemplo dos
tijolos)
se não se define o
construtor
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
JAVA
Cristina Ribeiro
13
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
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 base
visíveis nas classes derivadas
Membros final
⌧método final: não pode ser revogado
⌧classe final: é folha na hierarquia
JAVA
Herança
class Cleanser {
private String s=new String("Cleanser");
public void append(String a) {
public class Detergent extends Cleanser {
// Change a method:
public void scrub() {
s += a; }
append(" Detergent.scrub()");
public void dilute() {
//Call base-class version
append(" dilute()"); }
public void apply() {
append(" apply()"); }
super.scrub();}
// Add methods to the interface:
public void foam() {
public void scrub() {
append(" foam()"); }
append(" scrub()"); }
public void print() {
public static void main(String[] args){
Detergent x = new Detergent();
System.out.println(s); }
x.dilute(); x.apply();
public static void main(String[] args)
{
Cleanser x = new Cleanser();
x.scrub(); x.foam(); x.print();
System.out.println("Test base class:");
x.dilute(); x.apply(); x.scrub();
x.print();}
Cleanser.main(args);}
}
}
JAVA
Cristina Ribeiro
14
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Construção com herança
a hierarquia pode ter mais do
que dois níveis
// Cartoon.java
class Arte {
Arte() {
o sistema chama todos os
construtores que afectam o
objecto, começando pelo mais
geral
Println(”Construtor Arte");
} }
class Desenho extends Arte {
Desenho() {
resultado
Println(”Construtor Desenho");
Construtor Arte
} }
Construtor Desenho
public class Cartoon extends Desenho {
Construtor Cartoon
Cartoon() {
Println(”Construtor Cartoon"); }
herança suporta
desenvolvimento incremental e
prototipagem rápida
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(); }
}
JAVA
Cristina Ribeiro
15
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Herança
Hierarquia é induzida pela relação IS-A
Animal
IndexOutOfBoundsException
RuntimeException
IS-A
NullPointerException
Exception
Cão
EOFException
IOEx ception
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 {
public class Beetle extends Insect {
int i = 9;
int k = prt("Beetle.k initialized");
int j;
Beetle() {
Insect() {
prt("k = " + k);
prt("i = " + i + ", j = " + j);
j = 39;
}
prt("j = " + j);
}
static int x2 =
static int x1 =
prt("static Insect.x1 initialized");
static int prt(String s) {
prt("static Beetle.x2 initialized");
public static void main(String[] args)
{
prt("Beetle constructor");
System.out.println(s);
Beetle b = new Beetle();
return 47;
}
}
}
}
JAVA
Cristina Ribeiro
16
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Herança Múltipla
Problema: como definir objectos que se enquadram em mais do
que 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
Interfaces
Colecção de nomes de métodos que fornecem “esquemas” para a
criaçã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 para
as subclasses
public interface Vehicle {
void goForward( );
void goBackward( ):
}
public class Car implements Vehicle {
...
void goForward( ) {
...
}
void goBackward( ) {
...}}
JAVA
Cristina Ribeiro
17
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
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
class Hero extends ActionCharacter
import java.util.*;
implements CanFight, CanSwim, CanFly {
public void swim() {}
interface CanFight {
void fight();
public void fly() {}
}
}
public class Adventure {
interface CanSwim {
void swim();
}
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(); }
interface CanFly {
void fly();
}
public static void main(String[] args) {
Hero h = new Hero();
t(h); // Treat it as a CanFight
u(h); // Treat it as a CanSwim
class ActionCharacter {
public void fight() {}
}
v(h); // Treat it as a CanFly
w(h); // Treat it as an ActionCharacter
}}
JAVA
Cristina Ribeiro
18
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Uma Interface da API
Alguns métodos:
java.io
Interface DataInput
All Known Subinterfaces:
ObjectInput
All Known Implementing Classes:
RandomAccessFile,
DataInputStream
boolean
byte
char
double
float
void
int
String
int
int
readBoolean()
readByte()
readChar()
readDouble()
readFloat()
readFully(byte[] b)
readInt()
readLine()
readUnsignedByte()
skipBytes(int n)
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)
finally <bloco>
<bloco>
⌧Comportamento:
se try executa sem excepção : passa a bloco de finally
se try encontra excepção que não tem catch correspondente: passa a bloco finally e
propaga
se try encontra excepção que tem catch correspondente: executa blocos de catch e de
finally
Erro:
⌧Situação anormal que não requer “catch” numa aplicação regular
JAVA
Cristina Ribeiro
19
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
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 detectada
throw new Exception( “Vai mal” )
JAVA
Entrada/Saída
import java.io.*;
Streams
predefinidos:
system.in
System.out
system.err
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 ); }
}
JAVA
Cristina Ribeiro
20
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Leitura em Ficheiros Sequenciais
Reading bytes
Reading characters
Unformatted
(Chapman, Cap. 14)
Formatted
JAVA
Escrita em Ficheiros Sequenciais
Writing bytes
Writing characters
Formatted
Unformatted
(Chapman, Cap. 14)
JAVA
Cristina Ribeiro
21
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Entrada/Saída
import 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 Visibilidade
public: (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
JAVA
Cristina Ribeiro
22
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Uma classe privada
class Soup {
class Sandwich { // Uses Lunch
private Soup() {}
void f() { new Lunch(); }
// (1) Allow creation via static method:
}
public static Soup makeSoup() {
return new Soup();
public class Lunch {
}
void test() {
// (2) Create a static object and
//! Soup priv1 = new Soup();
// return a reference upon request.
Soup priv2 = Soup.makeSoup();
// (The "Singleton" pattern):
Sandwich f1 = new Sandwich();
private static Soup ps1 = new Soup();
Soup.access().f();
public static Soup access() {
return ps1;
}
}
}
public void 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...
}
}
JAVA
Cristina Ribeiro
23
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
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 sobrepor
mé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());
System.getProperties().list(System.out);
// data do dia
// 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>
JAVA
Cristina Ribeiro
24
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Applets
Applets: programas preparados
para serem executados no ambiente
de um vasculhador Web
applet tem que ser uma subclasse
de Applet e tem que ser pública
o vasculhador chama
automaticamente o método
paint(), usado para escrever no
écran
o método drawString tem como
parâmetros a cadeia e a respectiva
posição na janela
ficheiro HTML chama applet
// Ola.java
import 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=275
height=35 >
</applet>
</html>
JAVA
Métodos automáticos numa applet
public void init()
⌧chamado uma vez ao carregar a applet; inicializa variáveis e componentes GUI
public 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 da
applet; 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 g
public void stop()
⌧chamado para terminar a execução quando o vasculhador deixa a página HTML
da 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
JAVA
Cristina Ribeiro
25
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Applet
public 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.
}
}
JAVA
Cristina Ribeiro
26
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Applet
public class AdapterSpot extends Applet //no implements clause
{
private Point clickPoint = null;
private static final int RADIUS = 7;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
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();
}}
JAVA
Packages
Organizam classes relacionadas
evitam 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 do
mesmo package por omissão
JAVA
Cristina Ribeiro
27
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Componentes genéricos
Reutilização de código:
implementação igual a menos do tipo
dos dados: fazer implementação
genérica
ex: ordenação de um vector não
depende 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
Programação genérica em
JAVA:
public Object read( )
{ return storedValue; }
public void write( Object x)
{ storedValue = x; }
classe genérica usa objectos de uma
superclasse apropriada (ex: Object)
ex: ordenação de um vector não
depende do tipo dos seus elementos
// 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( ) );
}
}
JAVA
Cristina Ribeiro
28
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Documentação automática
javadoc - aproveita a
informação no ficheiro
de descrição de uma
classe (implementação)
para documentar a
interface
Saída é ficheiro HTML
comentários com /** são usados
/**
* 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;
}
etiquetas especiais para metainformação
@author, @param, @return, @exception
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”
JAVA
Cristina Ribeiro
29
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Serialização de Objectos
Interface Serializable
em java.io
Classes que não implementam esta interface não têm o seu estado serializado or desserializado
Subclasses de classe “serializable” são também “serializable”
A interface de serialização não tem métodos nem atributos e serve apenas para
identificar 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 Objectos
Interface Serializable
em java.io
Classes que não implementam esta interface não têm o seu estado serializado or desserializado
Subclasses de classe “serializable” são também “serializable”
A interface de serialização não tem métodos nem atributos e serve apenas para
identificar 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.
JAVA
Cristina Ribeiro
30
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
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();
JAVA
Cristina Ribeiro
31
Download