java - web.fe.up.ptarocha/aed1/apontamentos/java01.pdf · java java sumário zelementos da...
TRANSCRIPT
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
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"); }
}
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
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;...
}
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
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)
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];
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!
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
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)
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
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 */
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
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);}
}
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(); }
}
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();
}
}
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( ) {
...}}
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
}}
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
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 ); } } }
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)
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
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... } }
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>
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
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.
}
}
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
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( ) ); }}
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”
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.
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();