104
1 Introdu Introduç ão ão ao ao Java Java FEUP>DEEC>MRSC> FEUP>DEEC>MRSC>Programa Programação ão em em Comunica Comunicações ões v1.4 v1.4 Isidro Vila Verde <[email protected]> Jaime Sousa Dias <[email protected]> 2 O que O que é o JAVA? o JAVA? É uma Linguagem de Programação Orientada aos objectos Class Based Concorrente High Level Strongly Typed Portável Um programa em JAVA é independente da arquitectura Em principio pode correr em qualquer plataforma Uma máquina virtual (JVM) Biblioteca de Classes API

Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

Embed Size (px)

Citation preview

Page 1: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

1

IntroduIntroduççãoão aoao JavaJavaFEUP>DEEC>MRSC>FEUP>DEEC>MRSC>ProgramaProgramaççãoão emem ComunicaComunicaççõesõesv1.4v1.4

Isidro Vila Verde <[email protected]>Jaime Sousa Dias <[email protected]>

2

O que O que éé o JAVA?o JAVA?

• É uma Linguagem de Programação• Orientada aos objectos Class Based• Concorrente• High Level• Strongly Typed• Portável

• Um programa em JAVA é independente da arquitectura • Em principio pode correr em qualquer plataforma

• Uma máquina virtual (JVM)• Biblioteca de Classes• API

Page 2: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

2

ComparaComparaçção com outras linguagensão com outras linguagens

4

DiferenDiferençças para o C++as para o C++

• Cada classe (pública) é gravada num ficheiro respectivo com o mesmo nome da classe* e extensão .java• * Na realidade esta afirmação só se aplica a Top Level Classes

• O que existe em Java• Run Time Type Check

• Array bounds• Null pointers access

• Interfaces• Concorrência (Multi-thread) nativa• Garbage Collector

• Os recursos dos objectos são automaticamente libertados quando osistema detecta que já não são necessários (referenciados)

Page 3: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

3

5

DiferenDiferençças para o C++ (2)as para o C++ (2)

• O que não existe em Java• Estruturas (struct)• Uniões (union)• Apontadores ou ponteiros (pointers)

• Apenas referências• Apontadores para funções (Function Pointers)• Funções globais

• Incluindo a função do C/C++ main Em java o main é uma função membro estática

• Variáveis/Objectos globais• Malloc’s ou delete’s A gestão de memória é automática

(Garbage Colector) • Herança múltipla

6

DiferenDiferençças para o C++ (3)as para o C++ (3)

• O que não existe em Java (cont.)• Sobrecarga de operadores (operator overloading)• Templates• Header Files (.h)• Directiva de pré-processamento (ex: #pragma)• Variáveis-objecto Em java tudo o que não seja tipo primitivo é

manuseado como referência

Page 4: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

4

7

Java vs. outras linguagensJava vs. outras linguagens

• PERL, TCL, Python• São interpretadas• O código fonte é distribuído aos utilizadores• Obriga à instalação prévia do interpretador• Se fizer uso de primitivas/comandos do sistema terá de haver uma

versão de código para cada S.O. • Execução lenta

8

Java vs. outras linguagens (2)Java vs. outras linguagens (2)

• C, C++, Pascal• São linguagens compiladas• O código fonte não é distribuído aos utilizadores, apenas o código

binário• Se fizer uso de primitivas/comandos do sistema terá de haver uma

versão de código para cada S.O.

Page 5: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

5

9

Java vs. outras linguagens (3)Java vs. outras linguagens (3)

• C, C++, Pascal (cont.)• Necessita de uma versão binária por cada ambiente (S.O. + CPU)

• Windows• Eventualmente: 95, NT, 2000• Necessáriamente: Intel, Alpha, Mips

• Unix• Eventualmente: BSD, Linux, AIX, HP-UX, SCO• Necessariamente: Sparc, Intel, Alpha, Mips

• Execução Eficiente• Em C ou C++ é possível controlar ao nível do assembly a eficiência

• O programador pode controlar/garantir eficiência

10

Java vs. outras linguagens (4)Java vs. outras linguagens (4)

• JAVA• É compilado para uma máquina virtual

• O compilador gera Bytecodes• O Código fonte não é distribuído• Uma só versão de código independente da plataforma (CPU e/ou

S.O.)• O código binário (Bytecodes) é carregado e interpretado na JVM

(Java Virtual Machine)• $> java codigodaclass

• Obriga à existência ou instalação prévia do JRE (Java RunTimeEnviroment)

• Incluí a JVM

• Execução lenta

Page 6: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

6

11

Ambiente JAVAAmbiente JAVA

System Library classes Compile

Java SourceApp.java

Java Byte CodesApp.class

Java Interpreter

JJVVMM

JDKJDK

WRITEWRITE USEUSE

JREJRE

Operating System

Hardware

Runtime System

Just in Time Compiler

Class loader bytecode verifier

Java Libraries

12

TiposTipos de de programasprogramas JavaJava

• Aplicações• programas “Standalone”

• Applets• Componentes de código que correm num ambiente WEB

• Servlets• São componentes de código que correm num servidor WEB por

oposição às Applets que correm no cliente (navegador)

• JSP• Java Server Pages – Directivas embutidas em páginas HTML que

permitem executar código JAVA intercalado com HTML

Page 7: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

7

Exemplo de UtilizaExemplo de Utilizaççãoão

14

Executar uma aplicaExecutar uma aplicaçção escrita em Javaão escrita em Java

• O JRE• java, javaw, appletviewer

• O código da aplicação• App.class

• Executar• $> java App

• Omite-se a extensão “.class”• Nota: o ficheiro App.class deve estar o directório corrente ou num

dos directórios incluídos na variável de ambiente CLASSPATH.

Page 8: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

8

15

JRE instalado?JRE instalado?

• Verificar se já está instalado• Executar java -version

• Se corre então deve estar (devidamente?) instalado• Nas distribuições recentes dos S.O.s já é fornecido e instalado por

omissão• Se não encontrou o programa java

• http://java.sun.com

• Seleccionar o J2SE (última versão)• Selecionar o JRE

• O SDK só é necessário para fazer desenvolvimento• Fazer o download e instalar

16

Criar uma aplicaCriar uma aplicaçção em Javaão em Java

• Um editor de texto • vi, pico, notepad, wordpad, etc.

• O java JDK (SDK)• Verificar se já está instalado

• Executar javac -version• Se corre então deve estar (devidamente?) instalado• Nota: não é java é javac (Java Compiler)

• Se não encontrou o comando• http://java.sun.com

• Seleccionar o J2SE (última versão)• Seleccionar o SDK• Fazer o download e instalar

Page 9: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

9

17

Escrever a aplicaEscrever a aplicaççãoão

• Criar um ficheiro com o nome da aplicação e extensão .java• Ex: App.java

• Editar o ficheiro App.java e criar uma classe (class) Apppública (public)

public class App {

}

18

Escrever a aplicaEscrever a aplicaçção (2)ão (2)

• Incluír na definição da classe um método estático (static) público (public) e sem tipo (void), de nome main com um argumento do tipo array de strings (String[])

public class App {

public static void main(String[] args) {

}

}

Page 10: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

10

19

Escrever a aplicaEscrever a aplicaçção (3)ão (3)

• Definir o método main para executar o código pretendido• Ex: Escrever “Hello World”

public class App {

public static void main(String[] args) {

System.out.println("Hello World");

}

}

20

Compilar o cCompilar o cóódigodigo

• Gravar o ficheiro• Compilar o código em linha de comando

• Usar o “comando” javac• $> javac App.java

• Verificar que foi criado o ficheiro App.class

• Testar o código• $> java App

Page 11: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

11

AnAnáálise do lise do ““HelloHello WorldWorld””

22

O O HelloHello WorldWorld

public class App {

public static void main(String[] args) {

System.out.println("Hello World");

}

}

• Componentes do “Hello world”• Declaração da classe (class)• método main• Classe String• System.out.println• Modificador de acesso public• Modificador static

Page 12: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

12

23

ClassClass

• O formato mais simples para definir uma classe é este:[<acessibilidade>] class <Nomeclass> {

<declaração e definição dos membros aqui>

}

• No caso do exemplo “Hello World”:• Nomeclass é o nome que quiser, tendo em atenção que:

• Deve ter o mesmo nome que o ficheiro onde está• É sensivel à capitulação dos caracteres

• A visibilidade tem de ser public para ser visível do exterior

24

MMéétodotodo

• Os métodos são funções ou procedimentos membros de uma dada classe que permitem manusear o objecto

• Um caso especial dos métodos é o método public static void main (String[] argv).

• Por se chamar main, ser estático (static) e público (public) éinvocado sempre que se carrega a classe (programa standalone)

• $> java App

Page 13: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

13

25

Classe StringClasse String

• A classe String • É uma classe do ‘core’ do Java• Está definida na API• Está incluída na package

java.lang

• Como o próprio nome indica fornece um conjunto de métodos para trabalhar com cadeias de caracteres

26

System.out.printlnSystem.out.println

• A classe System está definida na package java.lang

• Tem uma variável membro outdo tipo PrintStream

• out é o standard output e estáaberto e pronto a receber caracteres

Page 14: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

14

27

System.out.printlnSystem.out.println

• System.out• É uma instância /objecto da

classe java.io.PrintStream

• A classe PrintStream estádefinida na package java.io

• Tem um método membro println(String)

28

Modificador publicModificador public

• public é um modificador de acesso (visibilidade )• permite que a classe App esteja acessível de fora da

package (neste caso o ficheiro)• Além da classe ser acessível também é preciso dar

acessibilidade pública ao método main para poder ser invocado a partir do exterior da package

Page 15: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

15

29

Modificador staticModificador static

• O modificar static permite que o método main seja invocado sem haver ainda qualquer instância da classe jácriada

• Aplica-se à classe e não a um objecto em particular

A linguagem JavaA linguagem Java

Page 16: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

16

31

Componentes da Linguagem JavaComponentes da Linguagem Java

[<package>]<Classe>*

<Membros>*<Campos>*<Métodos>*<Classes>*<Interfaces>*

<Interfaces>*<IMembros>*

<Campos>*<IMétodos>*

32

Java KeywordsJava Keywords

volatilewhile

voidtrythrowsthrowthis

synchronisedswitchsuperstaticshort

returnpublicprotectedprivatepackage

nullnewnativelonginterface

intinstanceofimportimplementsif

gotoforfloatfinallyfinal

extendselsedoubledodefault

Continueconstclasscharcatch

casebytebreakbooleanabstract

Page 17: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

17

ClassClass

34

ClassClass

• A declaração de uma classe é a principal declaração em JAVA

• Em Java tudo é implementado em Classes• Uma classe é uma colecção de dados e/ou código que

define intrinsecamente as características e comportamento de um certo conjunto de objectos.

• Uma classe está para os objectos como um esquema electrónico está para um equipamento fabricado em série.

Page 18: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

18

35

ClassClass

• A declaração de uma classe define um novo tipo e descreve as suas características e comportamento.

• O formato mínimo para declarar uma classe deve obedecer à seguinte regra

<modificador>* class <ClassName>{

<membros>*

}

• Por convenção o nome da classe (<ClassName>) deve começar por uma maiúscula

36

Ex1\Ex0.javapublic class Ex0 {

public static void main(String[] args) {A a = new A();B b = new B();System.out.println(a.j);System.out.println(b.j);

}}

ClassClassEx1\A.javaclass A {

int j = 6;}class B {

int j = 66;}

Membros das Classes

Page 19: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

19

Membros da ClasseMembros da Classe

38

Membros da ClasseMembros da Classe

• Uma classe é composta por:• Campos• Métodos• Classes • Interfaces• Inicializadores

• Os campos são:• Variáveis de tipos primitivos• Ou referências para objectos

Page 20: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

20

39

Tipos PrimitivosTipos Primitivos

• Estes são os tipos primitivos do Java. Tudo o resto são referências

• Inteiros• byte (1 byte, -128 to 127)• short (2 bytes)• int (4 bytes)• long (8 bytes)

• Vírgula flutuante• float (4 bytes, 6-7 significant decimal digits)• double (8 bytes, 15 significant decimal digits)

40

Tipos Primitivos (2)Tipos Primitivos (2)

• char (2 byte, Unicode) (ASCII 1 byte)• boolean (true or false)

• Não se pode converter booleanos em inteiros e vice-versa

Page 21: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

21

41

MMéétodostodos

• Os métodos são funções ou procedimentos membros da classe

• A declaração dos métodos obedece a esta regra<modificador>* <tipo> <nome>(Arg*){

<codigo aqui>

}

• No caso dos construtores a regra muda para:<modificador>* <nome>(Arg*){

<codigo aqui>

}

• O modificador pode assumir vários valores

42

MMéétodos todos –– ExemploExemploEx2\Counter.javapublic class Counter {

int n = 0; //campo membro//método membro estáticopublic static void main(String[] argv) {

Counter c = new Counter();c.print();mark("v = " + c.n);c.go(5);mark("v = " + c.inc());c.go(7);

}//método membro que retorna um intint inc(){

return n++;}

Continua

Page 22: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

22

43

Ex2\Counter.java (cont.)//método membro estáticostatic void mark (String s){

System.out.println(s);}//método membrovoid print (){

System.out.println ("Counter = " + n);}//método membrovoid go (int k){

while (k-- > 0){inc();print();

}}

}

MMéétodos todos –– Exemplo (2)Exemplo (2)

44

Operador de acesso aos membrosOperador de acesso aos membros

• O acesso aos membros da classe é feito com o operador “.”<Nome da instância>.<nome do membro>

• Acesso aos métodos membroc.print();

• Acesso aos campos membroc.n

• Dentro de um método (não static) o nome da instância está implícito e como tal é desnecessário

int inc(){return n++;

}

Page 23: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

23

45

ConstrutorConstrutor

• Dentro dos métodos há uma situação particular designada por Constructor

• Os construtores são métodos mas com algumas particularidades• Têm o mesmo nome da classe e não têm um tipo definido

explicitamente• São invocados quando se instancia um novo objecto (com o

operador new)• Não podem ser invocados explicitamente com o operador “.”

• Racional para isto:• Se o objecto ainda não foi criado não se pode invocar métodos sobre o

mesmo• Se já foi criado então não faz sentido cria-lo novamente

46

Construtor Construtor –– ExemploExemploEx3\Counter2.javapublic class Counter2 {

int n = 0;Counter2 (int x){

n = x;}public static void main(String[] argv) {

Counter2 c = new Counter2(5);mark("v = " + c.n);c.inc();mark("v = " + c.n);

}int inc(){ return n++;}static void mark(String s){ System.out.println(s);}void print(){System.out.println("Counter = " + n);}

}

Page 24: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

24

47

MMéétodos especiaistodos especiais

• Há dois métodos que têm um tratamento especial derivado do seu nome• O método public static main (String[] argv)

• Se declarado dentro de uma classe publica é o primeiro a ser invocado quando se carrega a classe

• $> java Counter2

• O método protected void finalize()• É invocado pelo sistema quando este detecta que o objecto já não é

usado• Não é garantida a ordem de invocação deste método

48

MMéétodos especiais (por conventodos especiais (por convençção)ão)

• Convencionou-se que as seguintes regras de atribuição de nome aos métodos traduzem acções bem definidas• Métodos de atribuição de valores

void setQualquerCoisa(tipo1){

variavelQualquerCoisa = arg1;

}

• Métodos de inspecção de valorestipo1 getQualquerCoisa(){

return variavelQualquerCoisa;

}

Page 25: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

25

Classe vs. ObjectoClasse vs. Objecto

50

Classe vs. ObjectoClasse vs. Objecto

• Um objecto é uma instância de uma classe• Num programa em Java cada classe é única mas pode

haver (e normalmente há) vários objectos da mesma classe• A classe define as características e o comportamento do

conjunto de objectos do seu tipo

Page 26: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

26

51

Classe vs. Objecto (2)Classe vs. Objecto (2)

• Em Java não há variáveis-objecto.• Todas as variáveis de algum tipo não primitivo são na

realidade referências para o objecto e não o objecto em si mesmo

ClasseT a = new ClasseT;

• Consequências A atribuição não copia o objectoClasseT b = a;

• Algumas análogias• Esquema electrónico Equipamento produzido• Planta Habitações (iguais) construídas

HeranHeranççaa

Page 27: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

27

53

HeranHeranççaa

• A herança é uma técnica para derivar novas classes a partir de classes já existentes

• As novas classes assim criadas são chamadas subclasses e herdam das superclasses

• A subclasse herda os membros da superclasse e pode:• Acrescentar mais membros• Redefinir os métodos da superclasse (sobreposição)

54

HeranHerançça (2)a (2)

• Um objecto do tipo de uma subclasse é automaticamente também do tipo da superclasse• O inverso é falso• Os objectos instanciados da subclasse formam um subconjunto dos

objectos da superclasse

• O formato base para declarar uma subclasse é este

<modificador>* class <SubClassName> extends <SuperClassName>{

<membros>*

}

Page 28: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

28

55

Ex4\Comp.java

class Storage{private int cap;void setCap(int c){cap = c;};int getCap(){return cap;}int getCar(){return 0;}

}//Disco é uma subclasse de Storageclass Disco extends Storage{

private int rpm = 7800;int getCar(){return rpm;}//sobreposição do método

}//Memoria é uma subclasse de Storageclass Memoria extends Storage{

private int vel = 233;int getCar(){return vel;}// sobreposição do métodoint getDataWidth(){return 64;}

}

Continua

HeranHerançça a –– ExemploExemplo

56

HeranHerançça a –– Exemplo (2)Exemplo (2)Ex4\Comp.java (cont.)public class Comp{

static public void main(String[] s){Disco d = new Disco();Memoria m = new Memoria();d.setCap(80); //setCap é membro de Disco por herançam.setCap(512);System.out.println("ds = " + d.getCap());//Chama o membro getCar() de Disco porque foi sobreposto //nesta classe ao getCar() de StorageSystem.out.println("r = " + d.getCar());System.out.println("ms = " + m.getCap());System.out.println("v = " + m.getCar());System.out.println(“dw = " + m.getDataWidth());

}}

$>java Compds = 80r = 7800ms = 512v = 233dw = 64

Page 29: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

29

PolimorfismoPolimorfismo

58

PolimorfismoPolimorfismo

• Um nome, várias formas. • Em Java o polimorfismo manifesta-se na forma de

múltiplos métodos (diferentes implementações) com o mesmo nome.

• Dois tipos• Polimorfismo por sobrecarga de métodos: múltiplos métodos com

o mesmo nome mas diferentes listas de parâmetros.• Polimorfismo por sobreposição de métodos: múltiplos métodos

com o mesmo nome, a mesma lista de parâmetros e devolvem o mesmo tipo.

Page 30: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

30

59

SobrecargaSobrecarga

• Os métodos são identificados pelo seu nome e pela sua assinatura• A assinatura é a combinação do tipo de argumentos com o seu

número e a sua ordem• Algumas assinaturas possíveis para o método estenome

• void estenome (String s)

• void estenome (int n)

• void estenome (Strint s, int n)

• void estenome (int n, String s)

• void estenome ()

• A sobrecarga de um método é feita definindo um outro método com o mesmo nome mas com assinatura distinta

60

Sobrecarga Sobrecarga –– ExemploExemploEx11\comp.javapublic class Comp{

private int n;private String nome;/** A sobrecarga também se aplica aos Construtores./* Por omissão o Java fornece um construtor nulo se não houver qualquer construtor /* definido. No entanto, se isso acontecer e quisermos continuar a ter um construtor /* nulo, temos de o definirpublic Comp(){}public Comp(String s){nome = s;}public Comp(String s, int x){nome = s; n = x;}public Comp(int x){n = x; nome ="";}public void setCaract(String s){nome = s;}public void setCaract(String s,int x){nome = s; n = x;}public void setCaract(int x){n = x;}static public void main(String[] s){

Comp c0 = new Comp();Comp c1 = new Comp(5);Comp c2 = new Comp("garfield");Comp c3 = new Comp("snoopy",6);c0.setCaract(3);c0.setCaract("alf",3);c1.setCaract("bunny");

}}

Page 31: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

31

61

SobreposiSobreposiççãoão

• Quando a superclasse e a subclasse implementam um método com o mesmo nome e a mesma assinatura.

• Com a sobreposição, a escolha do método a executar baseia-se no tipo do objecto cuja referência está guardada na variável de referência e não no tipo da variável de referência através da qual o método é invocado.

• Ao contrário da sobrecarga, onde a decisão do método a invocar é feita durante a compilação, na sobreposição a decisão só pode ser feita em run-time (late binding ou Dynamic Bind).

62

SobreposiSobreposiççãoão

• Permite que os métodos de objectos de subclasses diferentes com uma superclasse comum sejam uniformemente invocados

• resultando na invocação de diferentes métodos de acordo com a sua subclasse de forma transparente para o programador e para o compilador

• Permite o uso do mesmo código para manipular dados cujo tipo (subclasse) ainda não é conhecido

Page 32: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

32

63

SobreposiSobreposiçção ão –– ExemploExemploEx5\Comp.javaclass Storage{

private int cap;void setCap(int c){cap = c;};int getCap(){return cap;}int getCar(){return 0;}String getCarUnits(){return "desconhecidas";}

}class Disco extends Storage{

private int rpm = 7800;//métodos sobrepostosint getCar(){return rpm;}String getCarUnits(){return "Rpm";}

}class Memoria extends Storage{

private int vel = 233;int getDataWidth(){return 64;}//métodos sobrepostosint getCar(){return vel;}String getCarUnits(){return "Mhz";}

}Continua

64

SobreposiSobreposiçção ão –– Exemplo (2)Exemplo (2)Ex5\Comp.java (cont.)public class Comp{

static public void main(String[] s){Storage s0 = new Disco();Storage s1 = new Memoria();s0.setCap(80);s1.setCap(512);System.out.println("ds = " + s0.getCap());System.out.print("r = " + s0.getCar());System.out.println(" " + s0.getCarUnits());System.out.println("ms = " + s1.getCap());System.out.print("v = " + s1.getCar());System.out.println(" " + s1.getCarUnits());//System.out.println("dw = " + s1.getDataWidth());/**Erro! s1 é do tipo Storage e esta classe não *define qualquer membro getDataWidth()System.out.println("dw = " + ((Memoria)s1).getDataWidth());//OK: foi feito o downcasting da referência para o tipo Memoria

}}$>java Compds = 80r = 7800 Rpmms = 512v = 233 Mhzdw = 64

Page 33: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

33

PackagePackage

66

PackagePackage

• Cada classe em Java é compilada para um ficheiro distinto mesmo que tenha sido definida no mesmo ficheiro• Ex.: no exemplo anterior (ficheiro fonte Comp.java) a

compilação produziu os seguintes ficheiros

• Um só ficheiro .java, mas um ficheiro .class por cada classe definida

$>dir01-09-2003 13:45 1.140 Comp.class01-09-2003 13:45 1.348 Comp.java01-09-2003 13:45 454 Disco.class01-09-2003 13:45 532 Memoria.class01-09-2003 13:45 621 Storage.class

Page 34: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

34

67

PackagePackage

• Cada classe pública precisa de ser definida num ficheiro independente

• Se várias classes públicas precisarem de partilhar entre si determinadas características o elemento de armazenamento (isto é, o ficheiro), não é uma solução

• Para atender a essa funcionalidade existe, em Java, o conceito de Package• Várias classes podem pertencer à mesma package se antes da

declaração de classe incluírem a identificação da packagepackage <nomedapackage>;

68

PackagePackage (2)(2)

• As packages tem uma estrutura hierárquica e reflectem uma árvore de directórios onde as classes são armazenadas

• Para se usar uma classe de uma package énecessário importá-la

• Alternativamente pode-se usar o nome completo da classe (qualified name)

Page 35: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

35

69

PackagePackage (3)(3)

• A ordem de declaração tem de obedecer a esta regraPackage <Nomedapackage>

[Import <Nomedapackageimportada>]

Classe* | Interfaces*

• Qualquer classe (ou interface) declarada sem package pertence a uma package especial designada por “unnamed”

• O import vai buscar as classes a partir das subdirectóriasdefinidos em CLASSPATH

70

PackagePackage –– ExemploExemploEx6\info\componentes\abstractos\Storage.javapackage info.componentes.abstractos;public class Storage{

private int cap = 16;public void setCap(int c){cap = c;};public int getCap(){return cap;}public int getCar(){return 0;}public String getCarUnits(){return "desconhecidas";}

}

info\componentes\Disco.javapackage info.componentes;import info.componentes.abstractos.Storage; //Só importa a classe Storagepublic class Disco extends Storage {

private int rpm = 7800;public int getCar(){return rpm;} public String getCarUnits(){return "Rpm";}

}info\componentes\Memoria.javapackage info.componentes;import info.componentes.abstractos.*; //Importa tudo o que estiver declarado nesta packagepublic class Memoria extends Storage {

private int vel = 233;public int getCar(){return vel;} public int getDataWidth(){return 64;} public String getCarUnits(){return "Mhz";}

}

Page 36: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

36

71

PackagePackage –– Exemplo (2)Exemplo (2)Ex6\info\Comp.java//declaração da packagepackage info;//importação das classes definidas na subpackageimport info.componentes.*;//declaração dos tipospublic class Comp{

private Disco d;private Memoria m;Comp(){

d = new Disco(); m = new Memoria();

}

//Esta classe não foi previamente importadapublic info.componentes.abstractos.Storage getStor(){

return m;}public static void main(String[] s){

Comp c = new Comp();int cap = c.getStor().getCap();System.out.println("capaciade (memoria) = " + cap);

}}

Operador Operador thisthis

Page 37: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

37

73

Operador Operador thisthis

• Refere-se ao próprio objecto • auto-referência

• Pode ser usada nos:• métodos não estáticos • Construtores

• Serve para aceder aos campos membros quando hávariáveis locais ou argumentos com o mesmo nome

• Nos construtores serve ainda para invocar outros construtores da mesma classe (polimorfismo)

74

Operador Operador thisthis –– ExemploExemploEx16\Counter.javapublic class Counter{

private int n = 0;private String nome;public Counter(String nome){

this.nome = nome; //Sem o this o campo nome ficava inacessível por //causa do nome do argumento ser igual ao nome do campo

}public Counter(int n){

this.n = n;}public Counter(int n, String nome){

this(n); //chama o construtor Counter(int n)//O this(...) só pode ser usado na 1ª instrução; e esta tem //de pertencer a um construtor

//this(nome); //ERRO! só pode ser usado uma vezthis.nome = nome;

}public Counter(){

this(100,"sem nome");}

Continua

Page 38: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

38

75

Operador Operador thisthis –– Exemplo (2)Exemplo (2)Ex16\Counter.java (cont.)

public void print(){// Aqui é desnecessário porque não há qualquer outra variável com // o mesmo nomeSystem.out.println("n = " + this.n);System.out.println("nome = " + this.nome);

}static public void main(String[] s){

Counter c0 = new Counter(), c1 = new Counter(20); Counter c2 = new Counter("C2");Counter c3 = new Counter(50,"C3");c0.print(); c1.print(); c2.print(); c3.print();

}}

Operador superOperador super

Page 39: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

39

77

Operador superOperador super

• Refere-se à superclasse• É uma referência para os membros da superclasse do

objecto• Serve para aceder aos membros da superclass quando há

sobreposição (nos campos e nos métodos) • Nos construtores serve ainda para seleccionar e invocar os

construtores da superclasse

78

Operador super Operador super –– Exemplo Exemplo Ex17\Counter.javapublic class Counter{

private int n = 0;protected String nome;public Counter(String nome){this.nome = nome;}public Counter(int n){this.n = n;}public Counter(int n, String nome){

this(n);this.nome = nome;

}public Counter(){}public void inc(){++n;}public int getVal(){return n;}public void reset(){n = 0;}

}

Page 40: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

40

79

Operador super Operador super –– Exemplo (2) Exemplo (2) Ex17\ModCounter.javapublic class ModCounter extends Counter {

public int n;public void inc(){

super.inc(); // acede/invoca o inc de Counterif (getVal() > n){reset();}

}ModCounter(String nome, int i, int n){

//chama o construtor Counter(int,String)super(i,nome); //O super(...) só pode ser usado na 1ª instrução; e esta

//tem de pertencer a um construtorthis.n = n;

}ModCounter(int n){

this.n = n;}

}

ModificadoresModificadores

Page 41: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

41

81

ModificadoresModificadores

• Um modificador é uma keyword que afecta o tempo de vida (lifetime) ou a acessibilidade de uma classe, variável ou método.

Modificadores de acessoModificadores de acesso

Page 42: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

42

83

Modificadores de acessoModificadores de acesso

• public, protected e private

• Recorrendo aos modificadores de acesso é possível controlar quem tem acesso a uma classe ou aos respectivos membros.

• Este modificadores são mutuamente exclusivos• É desejável e aconselhável que o acesso se restrinja apenas

ao necessário

84

Modificadores de acesso Modificadores de acesso –– ClassesClasses

• Uma classe declarada sem package que não tenha modificador de acesso (<omisso>) fica acessível apenas pelas classes também elas declaradas sem package.

• Só pode haver uma classe pública por ficheiro.

Universo – classes de todas as packages

Classes na mesma package

Quem tem acesso

public

<omisso>

Modificador

Page 43: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

43

85

Modificadores de acesso Modificadores de acesso –– MembrosMembros

• O controlo de acesso dos membros funciona como um encapsulamento, onde é possível controlar que membros estão acessíveis/visíveis para o exterior da classe• Cada classe deve declarar privado/protegido o que não precisa de

ser visto pelo exterior• Do exterior só deve ser visível o estritamente necessário,

escondendo os pormenores de implementação

86

Modificadores de acesso Modificadores de acesso –– MembrosMembros

• Uma classe pode ter como membros• Campo• Método• Classe• Interface

• No caso de uma classe ou interface estas são consideradas inner class e inner interface respectivamente.

• Os modificadores aplicam-se à inner class ou innerinterface da mesma forma que se aplicam a qualquer outro membro.

Page 44: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

44

87

Modificadores de acesso Modificadores de acesso –– MembrosMembros

Só dentro da própria classe

Subclasses e classes na mesma package

Universo – classes de todas as packages

Classes na mesma package

Quem tem acesso

protected

private

public

<omisso>

Modificador

88

Modificadores de acesso Modificadores de acesso –– ExemploExemploEx7\info\componentes\abstractos\Storage.javapackage info.componentes.abstractos;public class Storage{

int cap = 16;public int base = 2;protected String origem = "Portugal";public void setCap(int c){cap = c;}public int getCap(){return cap;}int getCar(){return 0;}public String getCarUnits(){return "desconhecidas";}

}Ex7\info\componentes\Memoria.javapackage info.componentes;import info.componentes.abstractos.*; public class Memoria extends Storage {

private int vel = 233;int getCar(){return vel;} public int getDataWidth(){return 64;} public String getCarUnits(){return "Mhz";}public String getOrigem(){return origem;} //tem acesso a origem por herança

}

Page 45: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

45

89

Modificadores de acesso Modificadores de acesso –– Exemplo (2)Exemplo (2)Ex7\info\componentes\Teste.javapackage info.componentes;import info.componentes.abstractos.*;public class Teste{

static public void main(String[] args){Storage s = new Storage();Memoria m = new Memoria();

System.out.println("s.base: "+s.base);//System.out.println(s.cap);

//Erro: cap não apresenta modificador de acesso (<omisso>)//System.out.println(s.origem);

//Erro: origem é um campo protegido de StorageSystem.out.println("m.getOrigem(): "+m.getOrigem());

//OK: Memoria tem acesso ao campo origem porque é//uma subclasse de Storage

//System.out.println(m.vel); //Erro: vel é um campo privado de Memoria

System.out.println("getCar(): "+m.getCar()); //OK: o método getcar está acessível às classes da mesma package

}}

Modificador Modificador staticstatic

Page 46: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

46

91

Modificador Modificador staticstatic

• Só se aplica aos membros da classe• Permite que o método/campo seja invocado/acedido sem

haver qualquer instância criada do objecto• Aplica-se à classe e não a um objecto em particular• Dito de outro modo, aplica-se às características comuns ao

conjunto de objectos deste tipo, presentes ou futuros.• Um membro estático é partilhado por todos os objectos

92

Modificador Modificador staticstatic –– Exemplo 1Exemplo 1Ex10\Comp3.javapublic class Comp3 {

private int n;static private int ncomp = 0;public Comp3(){

n = ++ncomp;}static public int getNumOfInstances(){

//isto produz um erro de compilação//return n;return ncomp; //OK: ncom é um campo estático

}public int getInstanceNumber(){return n;}public String getInstancesRel(){

String s = "Instance " + n + " of "+ ncomp + " Instances";//OK! Os membros não estáticos podem aceder a membros estáticosreturn s;

}}

Page 47: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

47

93

Modificador Modificador staticstatic –– Exemplo 1 (2)Exemplo 1 (2)Ex10\Test3.javapublic class Test3 {

private static Comp3 c0, c1, c2;public static void showAndCreate(Comp3 c){

int n = Comp3.getNumOfInstances();print("N Of I (antes) = " + n);c = new Comp3();//int i = Comp3.getInstanceNumber();//Erro: Um método não estático só pode ser invocado para um objectoint i = c.getInstanceNumber();//int n = c.getNumOfInstances;//Erro: Um método estático só pode ser invocado para uma Classprint("Instance Number = " + i);print(c.getInstancesRel());

}public static void main(String[] args) {

showAndCreate(c0); showAndCreate(c1);showAndCreate(c2);

}private static void print(String s){

System.out.println(s);}

}

94

Modificador Modificador staticstatic –– Exemplo 2Exemplo 2Ex10a\Comp3.javapublic class Comp{

private int n;static private int ncomp = 0;public Comp(){n = ++ncomp;}public static void main(String[] s){

Comp c1 = new Comp();c1.printn("c1."); c1.printncomp("c1.");Comp c2 = new Comp();c2.printn("c2."); c2.printncomp("c2.");c1.printn("c1.");c1.printncomp("c1.");

}void printn(String s){System.out.println(s + "n = " + n);}void printncomp(String s){

System.out.println(s + "ncomp = " + ncomp);}

} //O campo ncomp é partilhado por c1 e c2. Se c2 alterar ncomp essa alteração reflecte-se em c1$>java Compc1.n = 1c1.ncomp = 1c2.n = 2c2.ncomp = 2c1.n = 1c1.ncomp = 2

Page 48: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

48

Modificador finalModificador final

96

Modificador final Modificador final

• Quando usado na declaração da classe esta não pode ser derivada (superclasse)

• Quando usado num método este não pode ser sobreposto• Usado da declaração de um campo este não pode ser

actualizado (mas deve ser inicializado)• Usando em conjunto com o static serve para implementar

constantes

Page 49: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

49

97

Modificador final Modificador final –– Exemplo Exemplo Ex18\Counter.javafinal public class Counter{

private int n = 0;final protected String nome; //o campo nome tem de ser inicializado no construtorfinal protected String ID = "a0"; //inicialização do campovoid serveParaNada(String lixo){

//nome = lixo; //um campo final não pode ser alterado//ID = lixo; //a atribuição a um campo final dá sempre erro

}public Counter(int n){

this.n = n;/* dentro do construtor a inicialização é possível e, * no caso do nome, necessária*/nome = "sem nome";//ID = "zero"; // Erro: ID já foi inicializado

}public Counter(int n, String nome){

this(n); //chamado outro construtor//this.nome = nome; //Erro: nome já foi inicializado

}final public void inc(){++n;} //não pode ser sobreposto

}

98

Modificador final Modificador final –– Exemplo (2) Exemplo (2) Ex18\ModCounter.javafinal public class ModCounter extends Counter {

public int n;//public void inc(){}//ERRO! o inc é um método final em CounterModCounter(String nome, int i, int n){

super(i,nome);this.n = n;

}ModCounter(int n){

super(0);this.n = n;

}}//class ExtModCounter extends ModCounter{}//Erro: ModCounter é final

Page 50: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

50

Modificador Modificador abstractabstract

100

Modificador Modificador abstractabstract

• Permite indicar que uma classe não foi totalmente implementada.

• Quando usado na declaração da classe esta não pode ser instanciada• Uma classe abstract não tem instâncias (objectos)• Uma classe abstract tem de ser derivada

• Quando usado num método este tem de ser obrigatoriamente sobreposto na subclasse• Não tem corpo• Só existe a sua declaração• A implementação é deixada para a subclasse• Implica que a classe também seja declarada como abstract

Page 51: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

51

101

Modificador Modificador abstractabstract –– ExemploExemploEx19\Counter.javaabstract public class Counter{

protected int c = 0;final protected String nome;public Counter(int n){

c = n;nome = "";

}public Counter(int n, String nome){

c = n;this.nome = nome;

}abstract public void inc(); //inc() não tem corpopublic int getVal(){return c;}

}

102

Ex19\ModCounter.javaabstract class AbsModCounter extends Counter {

public int n;//public void inc(){} //não precisa de ser implementada nesta classeAbsModCounter(String nome, int i, int n){super(i,nome);this.n = n;

}}public class ModCounter extends AbsModCounter{

//nesta class é obrigatorio implementar o método inc()public void inc(){c = ++c % n; }public ModCounter(String nome, int i, int n){super(nome,i,n);}public static void main(){Counter c;//c = new Counter(0,"teste"); //Erro: Counter é abstract//c = new AbsMoCounter("teste",0,16); //Erroc = new ModCounter("teste",0,16);c.inc();System.out.println("c = " + c.getVal());

}}

Modificador Modificador abstractabstract –– Exemplo (2)Exemplo (2)

Page 52: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

52

InicializaInicializaççãoão dos Camposdos Campos

104

InicializaInicializaççãoão

• A inicialização dos campos membro pode ser feita de 4 modos:• Omissão• Explícita• Blocos de inicialização• Construtor

Page 53: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

53

105

InicializaInicializaççãoão

• Inicialização por omissão• Declarando apenas as variáveis estas são inicializadas pelo java de

acordo com a tabela anexa

Valor inicialTipo

nullreferência

falsebooleano

0númerico

106

InicializaInicializaççãoão

• Explícita• Ao declarar o campo atribui-se-lhe um valor fixo ou o resultado de

uma expressão

• Blocos de inicialização• O Java permite definir blocos de código como membros da classe.

Estes blocos são executados quando:• a classe é carregada (blocos estáticos)• o objecto é criado (blocos não estáticos)

• Construtor • A inicialização é feita no corpo do construtor

Page 54: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

54

107

InicializaInicializaçção omissa ão omissa –– ExemploExemplo

$>java Compncomp = 0n = 0nome = nullactivo = false

Ex12\Comp.javapublic class Comp{

private int n;private String nome;static private int ncomp;private boolean activo;static public void main(String[] s){

System.out.println("ncomp = " + ncomp);Comp c = new Comp();System.out.println("n = " + c.n);System.out.println("nome = " + c.nome);System.out.println("activo = " + c.activo);

}}

108

Ex14\Comp.javapublic class Comp{

//pode ser o valor de um método membro estáticoprivate int n = initN();//pode ser uma constanteprivate String nome = "madrinha precisa-se";//pode ser uma expressãostatic private int ncomp = 100 * 2;static private int initN(){

return ++ncomp;}static public void main(String[] s){

System.out.println("ncomp = " + ncomp);Comp c = new Comp();System.out.println("n = " + c.n);System.out.println("nome = " + c.nome);

}}

InicializaInicializaçção explicita ão explicita –– ExemploExemplo

Page 55: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

55

109

Ex13\Comp.javapublic class Comp{

private int n;private String nome;{//bloco de inicialização para cada objecto

nome = "madrinha precisa-se";n = initN(); /* A inicialização pode ser feita recorrendo a * métodos membro mas estes têm de ser estáticos*/

}static private int ncomp;static private int initN(){return ++ncomp;}static { //bloco de inicialização para a class

ncomp = 100;}static public void main(String[] s){

System.out.println("ncomp = " + ncomp);Comp c = new Comp();System.out.println("n = " + c.n);System.out.println("nome = " + c.nome);

}}

InicializaInicializaçção por bloco ão por bloco –– ExemploExemplo

110

Ex15\comp.javapublic class Comp{

private int n;private String nome;static private int ncomp;public Comp(int x){

n = x;nome = "Madrinha precisa-se";

}static public void main(String[] s){

System.out.println("ncomp = " + ncomp);Comp c = new Comp(5);System.out.println("n = " + c.n);System.out.println("nome = " + c.nome);

}}

InicializaInicializaçção por Construtor ão por Construtor –– ExemploExemplo

Page 56: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

56

InterfacesInterfaces

112

InterfacesInterfaces

• Uma interface é um conjunto de requisitos para as classes que quiserem ser conformes

• Uma interfaces consiste numa colecção de constantes e declarações de métodos com as respectivas assinaturas• Os métodos não têm corpo (são apenas declarados mas não

implementados)

• As interfaces fornecem um mecanismo para impor à(s) classe(s) determinados métodos.• Assegura que os objectos disponibilizam certos métodos sem

impor à partida qual a acção resultante

Page 57: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

57

113

Interfaces (2)Interfaces (2)

• As interfaces são similares às classes mas:• Os campos são sempre public static final

• Na declaração dos campos pode-se omitir estes modificadores• Obriga à inicialização explicita

• Os métodos são sempre public abstract• Na declaração dos métodos pode-se omitir estes modificadores

• Uma interface nunca tem instâncias (tal como uma classe abstracta)

• Uma interface não tem construtores

114

Interfaces (3)Interfaces (3)

• A declaração de um interface obedece a esta regra:<modificador>* interface <InterfaceName> {

[public final satic] <camposestaticosfinaispublicos>*

[public abstract] <membrossemcorpo>*

}

• Uma interface também pode herdar de outra interface:<modificador>* interface <SubInterfaceName> [extends<SuperInterfaceName>]{

[public final static] <camposestaticosfinaispublicos>*

[public abstract] <membrossemcorpo>*

}

Page 58: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

58

115

Interfaces Interfaces –– ExemploExemploEx20\SO.javapublic interface SO{

String getName(); //os métodos são sempre public abstractString getVersion(); //Não tem corpo//String getVersion2(){}; //Erro: os métodos são abstractos//SO(){} //Erro: as interfaces não tem construtoresString WIN = "Windows"; //os campos são sempre public static finalString UNIX = "Unix"; //logo tem de ser inicialização explicita

}

Ex20\Unix.java//uma interface pode herdar de outrapublic interface Unix extends SO {

String LINUX = "Linux";String HPUX = "HP-UX";String AIX = "AIX";String getVariante();

}

116

Interfaces (4)Interfaces (4)

• Uma interface é implementada numa ou mais classes• Uma classe, não abstracta, que implemente uma interface

tem sempre de implementar todos os métodos da interface• A declaração de implementação de uma interface é feita na

declaração da classe

<modificador>* class <SubClassName> [extends <SuperClassName>] implements <InterfaceName1>, InterfaceName2,... {

<membros>*

}

Page 59: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

59

117

Interfaces Interfaces –– Exemplo (2)Exemplo (2)Ex20\Windows.javapublic class Windows implements SO {

private final String version;public String getName() {return WIN;}public String getVersion() {return version;}Windows(String v){version = v;}

}

Ex20\Dist.javapublic interface Dist {

String REDHAT = "RedHat";String MANDRAKE = "Mandrake";String getDist();

}Ex20\Linux.java//Como a classe é abstracta, pode mas não precisa de implementar os métodos das interfacesabstract public class Linux implements Unix, Dist{

protected final String kernelversion;Linux(String k){kernelversion = k;}// dois métodos implementados. Um de Unix e outro de SOpublic String getName(){return UNIX;}public String getVariante(){return LINUX;}// As subclasses já só precisam de implementar os restantes métodos

}

118

Ex20\Mandrake.javapublic class Mandrake extends Linux {

private final String version;public String getVersion(){

return "dv = "+version+"\nkv = "+kernelversion;}Mandrake(String v, String kv){

super(kv);version = v;

}public String getDist(){return MANDRAKE;}

}

Interfaces Interfaces –– Exemplo (3)Exemplo (3)

• A class Mandrake implementa implicitamente as interfaces Unix e Dist, logo tem de implementar os métodos :

• getName() e getVersion() de SO;

• getVariante() de Unix;

• getDist() de Dist;

• Visto que a superclasse Linux já implementou os métodos getName() e getVariante() aqui é suficiente definir o getVersion() e o getDist()

Page 60: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

60

119

Ex20\Teste.javapublic class Teste {

static void print(String s){System.out.println(s);}static void showSO(SO so){

print(so.getName());print(so.getVersion());

}static void showUnix(Unix u){

showSO(u);print(u.getVariante());

}static void showDist(Linux l){

showUnix(l);print(l.getDist());

}public static void main(String[] args) {

Mandrake m = new Mandrake("8.2","2.4");Windows w = new Windows("XP");showDist(m);print("-----------");showSO(w);

}}

Interfaces Interfaces –– Teste do Exemplo Teste do Exemplo

$>java TesteUnixdv = 8.2kv = 2.4LinuxMandrake-----------WindowsXP

120

Interfaces (4)Interfaces (4)

• Em Java a herança múltipla é conseguida com o recurso a interfaces public class Linux implements Unix, Dist

• Diferenças entre as interfaces e as classes abstractas• As interfaces não podem ter:

• Métodos estáticos• Construtores• Os métodos não podem ter implementação• Membros não públicos

• Um classe pode herdar de múltiplas interfaces mas não de múltiplas classes abstractas

Page 61: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

61

ExcepExcepççõesões

122

ExcepExcepççõesões

• As Excepções permitem definir o comportamento dos métodos em circunstâncias excepcionais

• Ocorrendo uma excepção o código abandona o percurso normal do método e salta para o código de tratamento da excepção

método(){

try{

código onde não ocorreu qualquer excepção

código onde ocorreu a excepção E

código que não chegou a ser corrido

}catch (Excepção E){

código que vai tratar a excepção E

}

}

Page 62: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

62

123

ExcepExcepçções (2)ões (2)

• O segmento de código onde podem ocorrer excepções édelimitado pela construção

try{código onde podem ocorrer excepções}

• Para apanhar as excepções usa-se a construçãocatch(Excepção E){código para tratar a excepção}

• É possivel ter vários “catches” para tratar diferentes tipos de Excepções

try{código onde ocorrem diversas excepções}

catch(Excepção E) {código para tratar a excepção}

catch(Excepção F) {código para tratar a excepção}

catch(Excepção G) {código para tratar a excepção}

finally{este código é executado sempre quer haja ou não excepções}

124

ExcepExcepçções (3)ões (3)

• Após uma excepção os diversos “catchs” são percorridos por ordem até ser encontrado um com uma excepção do tipo da ocorrida

• Depois de encontrar o “catch” respectivo os restantes são ignorados• Se F é uma subclasse de E então o “catch” do F deve ser incluído

antes do “catch” de E• Uma instância de F é uma instância de E logo ao passar pelo

“catch” E a condição é verificada e o código de E executado• Uma técnica para evitar multiplos “catchs“ é colocar um “catch”

de uma superclasse de todas as possíveis excepções Perde-se o tratamento especializado de cada excepção mas pode ser uma opção em estágios preliminares de desenvolvimento

Page 63: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

63

125

ExcepExcepçções (4)ões (4)

• O finally é opcional. • O código do finally é sempre executado

• Mesmo que seja encontrado um return no código do try ou do catch

126

UncheckedNão são verificadas pelo compilador A inexistência de código de tratamento não gera erros na compilação

CheckedSão verificadas pelo compilador.A inexistência de código de tratamento gera erros na compilação

Classes para excepClasses para excepççõesõesObject

Throwable

Error Exception

RuntimeException IOException

...

...

NullPointerException... SocketException

BindException

EOFException ...

...

Page 64: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

64

127

ExcepExcepçções (4)ões (4)

• Uma excepção é gerada por disparo de um objecto “throwable”

if (cond) throw new Exception()

• Uma excepção é sempre um objecto de uma subclasse da classe throwable

• Normalmente da classe Exception ou das suas derivadas

128

ExcepExcepçções (5)ões (5)

• Na compilação as excepções dividem-se em dois tipos:• Checked

• É verificado na compilação se há tratamento, ou redisparo destas excepções

• Numa aplicação Java as excepções checked tem de ser sempre tratadas

• Unchecked• Não é verificado pelo compilador. O que não implica que em runtime

não seja possível dar lugar à paragem da aplicação

Page 65: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

65

129

ExcepExcepçções ões –– Exemplo 1Exemplo 1Ex21\ModCounter.javapublic class ModCounter{

private int c = 0;private int n;public void inc(){c = ++c % n; }public ModCounter(int i, int n){

try{if (i > n) throw new Exception(i + " > "+ n);if (i < 0) throw new Exception(i + " < 0");c = i;this.n = n;

}catch(Exception e){

e.printStackTrace();}

}public int getVal(){return c;}public void setVal(int i) throws Exception{

if (i > n) throw new Exception(i + " > " + n);c = i;

}}

130

ExcepExcepçções (6)ões (6)

• Um método no qual podem ocorrer excepções checked tem duas opções• Ou faz o tratamento com try e catch• Ou redispara as excepções, declarando no método quais as

Excepções que podem ocorrer <modificadores> <tipo> <nomedometodo>(Args) throws

Exception1, Exception2,...{ ... }

• É da responsabilidade de quem chama o método fazer o tratamento das excepções

• Um método pode tratar algumas excepções e (re)disparar outras • Um “catch” pode redisparar a mesma excepção

Page 66: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

66

131

ExcepExcepçções ões –– Exemplo 2Exemplo 2Ex22\ModCounter.javapublic class ModCounter{

private int c = 0;private int n;public void inc(){c = ++c % n; }public ModCounter(int i, int n) throws InitException {

if (i > n) throw new InitException(i + " > " + n);if (i < 0) throw new InitException(i + " < 0");c = i; this.n = n;

}public int getVal(){return c;}public void setVal(int i) throws ModException{

if (i > n) throw new ModException(i + " > " + n);c = i;

}}

132

ExcepExcepçções ões –– Exemplo 2 (2)Exemplo 2 (2)Ex22\InitException.javapublic class InitException extends Exception {

public final String s;public InitException(String a){

s = "Erro na inicialização:\n\t" + a;}

}

Ex22\ModException.javapublic class ModException extends Exception {

public ModException(String s){super(s);}}

Page 67: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

67

133

ExcepExcepçções ões –– Exemplo 2 (3)Exemplo 2 (3)Ex22\Teste.javaclass NegativeException extends ModException {

NegativeException(String s){super(s);}String getMoreInfo(){

return "Erro:\n\tO argumento do setVal”+ “ tem de ser positivo";}

}public class Teste{

static ModCounter c;static void setVal(int v) throws ModException, NegativeException{

if (v < 0) throw new NegativeException( v + " < 0");c.setVal(v);

}public static void print(String s){

System.out.println(s);}public static void print(int n){

System.out.println(n);}

Continua

134

ExcepExcepçções ões –– Exemplo 2 (4)Exemplo 2 (4)Ex22\Teste.java (cont.)

public static void main(String[] s){try{

c = new ModCounter(0,16);c = new ModCounter(20,16);//as linhas que se seguem não serão processadas devido à//ocorrência de uma excepção do tipo InitExceptionsetVal(7); print(c.getVal());c.setVal(18); print(c.getVal());setVal(-10); print(c.getVal());return;

}catch (NegativeException te){ // o Negative Exception tem de surgir antes do ModException

print(te.getMoreInfo());}catch (ModException me){

print ("ERRO: " + me.getMessage()); //O getMessage é membro da superclass Trowableme.printStackTrace(); //O printStackTrace é membro da

}catch(InitException ie){ // superclass trowableprint(ie.s);

}finally{print("finally: Por aqui passo sempre, haja ou não erro");}}

}

$>java TesteErro na inicialização:

20 > 16finally: Por aqui passo sempre,haja ou não erro

Page 68: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

68

Classes do JavaClasses do Java

136

Classes do utilizador

Java APIClasses JavaClasses Java

Object

ThrowableString Class ... Number Math System

IntegerExcepion Character... ...

...

...

AppletServletSocket

PrinterWriter

Minhaclasse

InputStreamPrinterStream

Outraclasse

Subclasse1Subclasse2

Subclasse2

Qualquer classe é automaticamente subclasse de Object

...

Page 69: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

69

137

API do JavaAPI do Java

Classes para acesso aos protocolos de redejava.net

Ver a API do JavaEtc…

GUI usando swingjavax.swing

ClassesPackage

Creates appletsjava.applet

GUIjava.awt

Entrada e Saída – acesso a ficheiros, etcjava.io

Matemáticasjava.math

Classes e Interfaces utilitáriasjava.util

Classes “core” do Javajava.lang

• A utilização de qualquer classe das packages obriga a utilizar o import

• No entanto a package java.lang não precisa de ser explicitamente “importada”

138

API do JavaAPI do Java

• http://java.sun.com/j2se/1.4.2/docs/api/index.html

Page 70: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

70

ArraysArrays

140

ArraysArrays

• Os arrays em Java são objectos mas são manipulados de forma especial pelo programador

• Declaraçãoint v[];

Ouint[] v;

• Alocação de espaço (memória) v = new int[n];

• n não precisa de ser uma constante. Pode ser uma variável ou uma expressão

• Ou numa só instruçãoint[] v = new int[n];

Page 71: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

71

141

ArraysArrays –– ExemploExemplo

$>java Test primeiro argumento e, julgo eu, o segundo argumentos[0]=primeiros[1]=argumentos[2]=e,s[3]=julgos[4]=eu,s[5]=os[6]=segundos[7]=argumento

Ex23\Test.javapublic class Test{

public static void main(String[] s){print(s);

}private static void print(String[] s){

for (int n = 0; n < s.length; n++){System.out.println("s["+n+"]="+s[n]);

}}

}

142

ArraysArrays

• Inicializaçãov[2] = 3;

• Declaração, reserva de espaço e inicializaçãoint[] v = {3,7,6,8};

• Podem ser multidimensionaisint[][] vv={{1,3},{7,4,5}};

int[][] vw= new int[5][3];

• Um arrays de arrays pode conter arrays de dimensão diferente

• Pode-se declarar arrays de objectosObj[] ov = new Obj[4];

ov[2] = new Obj();

Page 72: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

72

143

ArraysArrays –– Exemplo 2Exemplo 2

$>java Testv[1][2]=8v[1][1]=3v[1][0]=5v[0][1]=4v[0][0]=3

Ex24\Test.javapublic class Test{

public static void main(String[] s){int[][] v = {{3,4},{5,3,8}};for(int n = v.length; n-- > 0;)

for(int k = v[n].length; k-- > 0;)print("v[" + n + "][" + k + "]=" + v[n][k]);

}private static void print(String s){

System.out.println(s);}

}

144

ArraysArrays –– Exemplo 2Exemplo 2Ex25\Test.javaclass MeuObjecto{

private int k;private int n;MeuObjecto(int a, int b){k = a; n = b;}int getProd(){return n * k;}

}public class Test{

public static void main(String[] s){int n = 2, k = 3;MeuObjecto[][] mov = new MeuObjecto[n][k];while (n-- > 0){

int j = k;while(j-- > 0)

mov[n][j] = new MeuObjecto(n+1,j+1);}while(k-- > 0) print(mov[1][k].getProd());

}private static void print(int i){

System.out.println(i);}

}

$>java Test642

Page 73: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

73

145

ArraysArrays

• Os arrays são implementados internamente com objectos de uma classe “built-in” (não listada na API Java)• São subclasses de Object e herdam, naturalmente, todos os

membros deste• clone

• equals

• finalize

• ...• Adiciona aos métodos de Object o campo final length

StringsStrings

Page 74: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

74

147

StringsStrings

• As Strings são objectos definidos na classe java.lang.String mas tem algumas particularidades não partilhadas por outros objectos• Podem ser inicializados sem recurso ao operador new

String s = “Esta é uma String”;

• Tem definida a operação de concatenação com o operador +String s1 = s + “ concatenada”;

• Como objectos que são, as variáveis do tipo String são referências• O teste s == s1 compara se s e s1 se referem ao mesmo objecto e

não se as strings são iguais

Entrada/SaEntrada/Saíídada

Page 75: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

75

149

Classe FileClasse File

• Usada para representar o sistema de ficheiros• É apenas uma abstracção: a existência de um objecto File

não significa a existência de um ficheiro ou uma directoria.• Contém métodos para testar a existência de ficheiros, para

definir permissões (nos S.O.s onde for aplicável), para apagar ficheiros, criar directorias, listar o conteúdo de directorias, etc..

150

Classe File (2)Classe File (2)

• Alguns métodos• String getAbsolutePath()• String getParent(): devolve a directoria (objecto File) superior• boolean exists()• boolean isFile()• boolean isDirectory()• boolean delete(): tenta apagar a directoria ou ficheiro• long length(): devolve o tamanho do ficheiro em bytes• boolean mkdir(): cria uma directoria• String[] list(): lista dos ficheiros contido na directoria

Page 76: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

76

151

Classe File Classe File –– ExemploExemploEx26\Fileteste.javaimport java.io.*;

public class FileTeste {public static void main(String[] args){

try {File directoria = new File("teste");directoria.mkdir(); // cria, se possívelFile ficheiro = new File(directoria, "lixo.txt");FileOutputStream out= new FileOutputStream(ficheiro);// se ficheiro não existe, tenta criar

out.write( new byte[]{'l','i','x','o'} ); //escrever uma sequência de bytes

out.close();Continua

152

Classe File Classe File –– Exemplo (2)Exemplo (2)Ex26\Fileteste.java (cont.)

File subdir = new File(directoria, "subdir");subdir.mkdir();String[] ficheiros = directoria.list();for (int i = 0; i<ficheiros.length; i++) {

File filho = new File(directoria, ficheiros[i]);System.out.println(filho.getAbsolutePath());

}if (ficheiro.exists()) {

ficheiro.delete();}

} catch (IOException e){System.exit(1);

}}

}

Page 77: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

77

153

Fluxos de Entrada/SaFluxos de Entrada/Saíídada

• Um fluxo (stream) é um conceito abstracto. Representa uma sequencia linear de bytes ou caracteres de uma entrada ou para uma saída.

• Existem várias fontes de onde se deseja ler ou destinos para onde se deseja escrever ou enviar dados• Ficheiros• Conexões de rede• Consola (teclado / Monitor)• Memória

• Existem várias formas diferentes de ler/escrever dados• Sequencialmente / aleatoriamente• Como bytes / como caracteres• Linha por linha / palavra por palavra, ...

154

Classes e Interfaces para fluxos de E/SClasses e Interfaces para fluxos de E/S

• A package java.io fornece objectos que abstraem• fontes/destinos (nós) e fluxos de bytes e caracteres

• Dois grupos• orientado ao byte: InputStream e OutputStream• orientado ao caractere (char): Reader e Writer

Page 78: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

78

155

E/S E/S orientadaorientada aoao bytebyte

• InputStream• Classe abstracta para lidar com fluxos de bytes de entrada e nós de

fonte (dados para leitura).• Método principal: read()

• OutputStream• Classe abstracta para lidar com fluxos de bytes de saída e nós de

destino (dados para gravação).• Método principal: write()

156

E/S E/S orientadaorientada aoao byte (2)byte (2)

• Principais implementações• Entrada/leitura no nó fonte:

• FileInputStream (ficheiros), • ByteArrayInputStream (memória) e • PipedInputStream (pipe).

• Entrada/tratamento de fluxo: • FilterInputStream (abstract) e respectivas subclasses

• Saída/escrita no nó destino: • FileOutputStream (ficheiros), • ByteArrayOutputStream (memória) e • PipedOutputStream (pipe).

• Saída/tratamento de fluxo: • FilterOutputStream (abstract) e respectivas subclasses.

Page 79: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

79

157

E/S E/S orientadaorientada aoao bytebyte –– ExemploExemploEx27\FileCopia.javaimport java.io.*;//Esta aplicação copia um ficheiro: fonte -> destinopublic class FileCopia {

public static void main(String[] args){if (args.length>1){

try {String nomeFonte = args[0];String nomeDestino = args[1];File fonte = new File(nomeFonte);File destino = new File(nomeDestino);if (fonte.exists() && !destino.exists()) {

FileInputStream in = new FileInputStream(fonte);FileOutputStream out = new FileOutputStream(destino);byte[] buffer = new byte[8192]; //array de bytesint length = in.read(buffer);while ( length != -1) { // -1 sinaliza o EOF//grava apenas os bytes lidos e não o buffer completo

out.write(buffer, 0, length);length = in.read(buffer);

}Continua

158

E/S E/S orientadaorientada aoao bytebyte –– Exemplo (2)Exemplo (2)Ex27\FileCopia.java (cont.)

in.close();out.flush();out.close();

}} catch (IOException e){System.exit(1);} //é necessário tratar as excepções

} else {System.out.println("java FileCopia ffonte fdestino");}}

}

Page 80: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

80

159

FilterInputStreamFilterInputStream

• Recebe fonte de bytes e oferece métodos para ler dados filtrados. Implementações (subclasses):• DataInputStream:

• readInt(), • readUTF(), • readDouble()

• BufferredInputStream: • read() mais eficiente

• ObjectInputStream: • readObject() lê objectos serializados

160

FilterOutputStreamFilterOutputStream

• Recebe destino de bytes e escreve dados via filtro. Implementações:• DataOutputStream:

• writeUTF(), • writeInt(), etc.

• BufferedOutputStream: • write() mais eficiente

• ObjectOutputStream: • writeObject() serializa objectos

• PrintStream: • classe que implementa println()

Page 81: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

81

161

E/S orientada ao caractereE/S orientada ao caractere

• Reader• Classe abstracta para lidar com fluxos de caracteres de entrada:

método read() lê um caractere (16 bits) de cada vez.

• Writer• Classe abstracta para lidar com fluxos de caracteres de saída:

método write() grava um caractere de cada vez.

162

E/S orientada ao caractere (2)E/S orientada ao caractere (2)

• Principais implementações• Entrada/leitura no nó fonte:

• FileReader (ficheiro), • CharArrayReader (memória), • PipedReader (pipe) e • StringReader (memória).

• Entrada/tratamento de fluxo: • FilterReader (abstract), • BufferedReader, • InputStreamReader (conversor de byte para char), • LineNumberReader

Page 82: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

82

163

E/S orientada ao caractere (3)E/S orientada ao caractere (3)

• Principais implementações (cont.)• Saída/escrita no nó destino:

• FileWriter (ficheiro), • CharArrayWriter (memória), • PipedWriter (pipe) e • StringWriter (memória).

• Saída/tratamento de fluxo: • FilterWriter (abstract), • BufferedWriter, • OutputStreamWriter (conversor de char para byte), • PrintWriter

164

E/S orientada ao caractere E/S orientada ao caractere –– ExemploExemploEx28\InputCmd.javaimport java.io.*; //permite ler da consola. Faz echo para o monitor daquilo que lêpublic class InputCmd {

public static String readCmd(String inputMsg){ System.out.print(inputMsg); //InputStream/byte InputStreamReader/char BufferedReader/charBufferedReader br = new BufferedReader(

new InputStreamReader(System.in)); String input = null; try {

input = br.readLine(); // lê uma linha} catch (IOException ioe) {

System.out.println("IO error trying to read from the cmd!"); System.exit(1);

} return input;

}

public static void main (String[] args) { String s = readCmd("Input: ");System.out.println("Echo input: "+s);

} }

Page 83: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

83

ConcorrênciaConcorrência

166

ThreadsThreads

• Threads dividem o problema em tarefas independentes• Threads vs. Processos

• Processos: tarefas em espaços de endereços diferentes que comunicam entre si através de pipes fornecidos pelo S.O.

• Threads: tarefas dentro do espaço de endereços da aplicação que comunicam entre si através de pipes fornecidos pela JVM

• Em Java o suporte de threads é nativo• Um thread é um objecto que parece e age como um programa

individual.

Page 84: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

84

167

Como criar um threadComo criar um thread

• Há duas estratégias• Herdar da classe java.lang.Thread• Implementar a interface java.lang.Runnable

• Herdar da classe Thread• O objecto é um thread, e sobrepõe o comportamento associado à

classe Thread

• Implementar a interface Runnable• O objecto, que define o comportamento da execução, é passado para

um objecto Thread que o executa.

• Em ambos os casos• É necessário sobrepor o método run() que é o "main()" do Thread• A invocação do método start() inicia o thread (invoca run())• Quando o método run() termina, o thread morre.

168

CriaCriaçção de ão de threadsthreads –– ExemploExemploEx29\EstThread.javaclass EThread extends Thread {

int n;EThread(int i){n=i;}public void run(){

for (int i=0; i<5;i++){System.out.println("Thread"+n+": "+i);try{ Thread.sleep(10); //10ms} catch(InterruptedException e){System.exit(1);}

}}

}

public class EstThread{public static void main(String[] args){

EThread t1 = new EThread(1);EThread t2 = new EThread(2);t1.start();t2.start();

}}

$>java EstThreadThread1: 0Thread2: 0Thread1: 1Thread2: 1Thread1: 2Thread2: 2Thread1: 3Thread2: 3Thread1: 4Thread2: 4

Page 85: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

85

169

CriaCriaçção de ão de threadsthreads –– Exemplo 2Exemplo 2Ex29\ImpRunnable.javaclass IThread implements Runnable {

int n;IThread(int i){n=i;}public void run(){

for (int i=0; i<5;i++){System.out.println("Thread"+n+": "+i);try{Thread.sleep(10); //10ms} catch(InterruptedException e){System.exit(1);}

}}

}

public class ImpRunnable {public static void main(String[] args){

IThread it1 = new IThread(1);IThread it2 = new IThread(2);Thread t1 = new Thread(it1);Thread t2 = new Thread(it2);t1.start();t2.start();

}}

$>java impRunnableThread1: 0Thread2: 0Thread1: 1Thread2: 1Thread1: 2Thread2: 2Thread1: 3Thread2: 3Thread1: 4Thread2: 4

170

CicloCiclo de de vidavida de um threadde um thread

Thread t = new Thread()

Executável Bloqueado

Morto

start()

run() acaba(stop())

run() acaba(stop())

wait()sleep()I/O blocking

notify()sleep time-outI/O acabou

run() acaba(stop())

Page 86: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

86

171

ClasseClasse ThreadThread

• Principais métodos:• Estáticos

• Thread currentThread()• Devolve a referência para o thread que está a executar no momento

• void sleep(long tempo)• Coloca o thread bloquado durante pelo menos tempo ms.

• void yield()• Faz com que o thread atual pare e permita que outros que estão na sua

fila de prioridades executem.

172

ClasseClasse Thread (2)Thread (2)

• Principais métodos (cont.):• De instância (não estáticos)

• void run()• É o "main()" do Thread. Deve ser implementado no Thread ou no

objecto Runnable passado ao thread• void start()

• É um bootstrap. Faz o JVM chamar o run()

• boolean isAlive()• Verifica se thread está vivo

Page 87: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

87

173

MonitorMonitor

• Permite proteger os recursos impedindo que mais do que um thread os utilize em simultâneo.

• Recorre-se à keyword synchronized

• Por questões de desempenho deve-se limitar a sua aplicação ao essencial.

174

Monitor (2)Monitor (2)

• Aplica-se a blocos ou métodos.• por bloco:

synchronized (this){

<codigo protegido aqui>

}

• por métodosynchronized <outros modificadores>* <tipo> <nome>(Arg*){

<codigo protegido aqui>

}

Page 88: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

88

175

Sem Monitor Sem Monitor –– ExemploExemploEx30a\SemMonitor.javaclass Utilizador extends Thread {

Conta conta;Utilizador (Conta c){ conta=c; }public void run(){

for (int i=0;i<5;i++) conta.movimentar();}

}class Conta {

private int saldo=0;void movimentar(){ //o saldo nunca deve ser inferior a 0

if (saldo>=1000) {try { Thread.sleep((long)(Math.random()*1000));

//adormece durante alguns ms} catch (InterruptedException e){ System.exit(1);}saldo-=1000; //levantamentoSystem.out.println("- 1000, Saldo= "+saldo);

} else {saldo+=1000; //depósitoSystem.out.println("+ 1000, Saldo= "+saldo);

}}

}continua

$>java SemMonitor+ 1000, Saldo= 1000- 1000, Saldo= 0+ 1000, Saldo= 1000- 1000, Saldo= 0+ 1000, Saldo= 1000- 1000, Saldo= 0+ 1000, Saldo= 1000- 1000, Saldo= 0- 1000, Saldo= -1000+ 1000, Saldo= 0

176

Sem Monitor Sem Monitor –– Exemplo (2)Exemplo (2)Ex30a\SemMonitor.java (cont.)public class SemMonitor {

public static void main(String[] args){Conta c = new Conta();new Utilizador(c).start();new Utilizador(c).start();

}}

Page 89: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

89

177

Com Monitor Com Monitor –– ExemploExemploEx30b\CemMonitor.javaclass Utilizador extends Thread {

Conta conta;Utilizador (Conta c){ conta=c; }public void run(){

for (int i=0;i<5;i++) conta.movimentar();}

}class Conta {

private int saldo=0;synchronized void movimentar(){ //o saldo nunca deve ser inferior a 0

if (saldo>=1000) {try { Thread.sleep((long)(Math.random()*1000));

//adormece durante alguns ms} catch (InterruptedException e){ System.exit(1);}saldo-=1000; //levantamentoSystem.out.println("- 1000, Saldo= "+saldo);

} else {saldo+=1000; //depósitoSystem.out.println("+ 500, Saldo= "+saldo);

}}

}continua

$>java SemMonitor+ 1000, Saldo= 1000- 1000, Saldo= 0+ 1000, Saldo= 1000- 1000, Saldo= 0+ 1000, Saldo= 1000- 1000, Saldo= 0+ 1000, Saldo= 1000- 1000, Saldo= 0+ 1000, Saldo= 1000- 1000, Saldo= 0

178

Com Monitor Com Monitor –– Exemplo (2)Exemplo (2)Ex30b\SemMonitor.java (cont.)public class ComMonitor {

public static void main(String[] args){Conta c = new Conta();new Utilizador(c).start();new Utilizador(c).start();

}}

Page 90: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

90

ComunicaComunicaçções TCP/IPões TCP/IP

180

Pilha Protocolar TCP/IPPilha Protocolar TCP/IP

• Rede• IP (Internet protocol)• ICMP (Internet Control

Message Protocol)• IGMP (Internet Group

Management Protocol)

• Transporte• TCP (transmission Control Protocol) (orientado à conexão)• UDP (User datagram Protocol) (orientado ao datagrama)• Exemplo de outros protocolos (não suportados pelo Java):

• SCTP (Stream Control Transmission Protocol) (orientado à conexão)• DCCP (Datagram Congestion Control Protocol) (orientado ao datagrama)

• Aplicação• HTTP, SMTP, POP3, FTP, etc.

Page 91: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

91

181

ModelosModelos de de distribuidistribuiççãoão de dadosde dados

• Unicast• De um ponto para um outro ponto• Endereço destino identifica/localiza ponto destino

endereço unicast

• Multicast• De um ponto para um grupo de pontos• Endereço destino identifica o grupo destino• Nós destino associam os seus endereços (unicast) ao grupo destino

• Broadcast• De um ponto para todos os pontos• Endereço destino corresponde a um endereço universal

correspondido por todos os nós

182

TCPTCP

• Transmission Control Protocol• Protocolo de transporte orientado à conexão

• Antes de começar a enviar dados é necessário proceder ao estabelecimento da conexão

• Depois dados são enviados/recebidos sob a forma de um fluxo de bytes

• Unicamente unicast• Não existe um limite para o tamanho das mensagens a enviar.• Fiável Implementa mecanismo de recuperação de dados• Modelo cliente/servidor servidor fica à espera que o cliente

inicie o estabelecimento da conexão.

Page 92: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

92

183

UDPUDP

• User Datagram Protocol• Protocolo de transporte orientado ao datagrama

• Cada mensagem é enviada num datagrama independente dos (possíveis) restantes.

• Não é necessária qualquer sinalização prévia.• Cada datagrama contém toda a informação necessária para a

correcta comunicação (portos origem e destino) necessário especificar/verificar aquando do envio/recepção de cada datagrama

• Pode ser utilizado em todos os modelos de distribuição.• Tamanho das mensagens limitado a 64 kbytes (cabeçalho IP

incluído)• Não é fiável Não implementa mecanismos de recuperação de

datagramas

184

java.netjava.net

• TCP é suportado pelas classes• Socket (permite a comunicação através de uma conexão TCP)• SeverSocket (permite ao servidor ficar à escuta de pedidos de

conexão)

• UDP é suportado pelas classes• DatagramSocket (permite a comunicação via UDP)• DatagramPacket (datagrama UDP)• MulticastSocket (permite a comunicação via UDP em multicast)

• Endereçamento• InetAddress (representa um endereços IP)• URL (representa um URL e oferece um conjunto de operações

para comunicação)

Page 93: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

93

185

ClasseClasse SocketSocket

• Ponto de contacto entre a aplicação e a conexão TCP• Principais construtores

• Socket()• Socket(InetAddress address, int port)

• Cria um socket e conecta-o a um socket em address/port.• Socket(String host, int port)

• Cria um socket e conecta-o a um socket em host/port.

• Principais métodos servem para obter fluxos de entrada, saída• getInputStream(), getOutputStream()• close()

• Depois de obtido os fluxos, basta ler ou escrever dados como se de um ficheiro se tratasse.

186

ClasseClasse ServerSocketServerSocket

• Permite a um servidor TCP ficar à escuta num dado porto (local), até receber um pedido, para depois devolver um socket que fica associado à nova conexão

• Principais contrutores• ServerSocket(int port)

• Fica à escuta em no porto port de todas as interfaces (endereços IP) locais

• ServerSocket(int port, int backlog, InetAddress bindAddr)

• Fica à escuta no porto port do endereço bindAddr

• Principal método• accept()

• Aceita a conexão e devolve um socket para acesso à mesma

Page 94: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

94

187

Cliente TCP Cliente TCP –– ExemploExemploEx31\ClienteTcpHttp.java//Esta aplicação é um cliente TCP que faz o pedido de uma página a um servidor HTTPimport java.io.*;import java.net.*;public class ClienteTcpHttp {

public static void main(String[] args) throws IOException {Socket socket = null;PrintWriter out = null;BufferedReader in = null;try{

//cria o socket e associa-o a um endereçosocket = new Socket("www.google.com",80);

out = new PrintWriter(new OutputStreamWriter( socket.getOutputStream()), true);

in = new BufferedReader(newInputStreamReader(socket.getInputStream()));

} catch (UnknownHostException e) {System.out.println("Host desconhecido");System.exit(1);

} catch (IOException e) {System.out.println("Não foi possível estabelecer uma conexão");System.exit(1);

}Continua

188

Cliente TCP Cliente TCP –– Exemplo (2)Exemplo (2)Ex31\ClienteTcpHttp.java (cont.)// envia ao servidor o pedido da página por omissão (index.html...)

out.println("GET / HTTP/1.1\r\n"); //não esquecer o \r\nString resp="";while ((resp = in.readLine()) != null) {

System.out.println(resp); //imprime a resposta do servidor}out.close(); //fecha os fluxos e depois o socketin.close();socket.close();

}}

Page 95: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

95

189

Servidor TCP Servidor TCP –– ExemploExemploEx32\EchoServer.java//Esta aplicação é um servidor TCP que devolve o que recebe (faz echo)import java.net.*;import java.io.*;

public class EchoServer {public static void main(String[] args) throws IOException{

//fica associado ao porto local 3000ServerSocket serverSocket = new ServerSocket(3000); Socket clienteSocket=null;try {

//fica à espera (escuta) de uma conexãoclienteSocket = serverSocket.accept();//o socket para escuta é diferente do socket para a conexão

} catch (IOException e) {System.out.println("O accept falhou");System.exit(-1);

}Continua

190

Servidor TCP Servidor TCP –– Exemplo (2)Exemplo (2)Ex32\EchoServer.java (cont.)

PrintWriter out = null;BufferedReader in = null;out = new PrintWriter(new OutputStreamWriter(

clienteSocket.getOutputStream()), true);in = new BufferedReader(new InputStreamReader(

clienteSocket.getInputStream()));String str="";while ((str = in.readLine()) != null) {

//quando recebe uma string do cliente imprime-a no monitor e //deveolve-a (echo)System.out.println(str);out.println(str);

}out.close(); //primeiro fecham-se os fluxos e só depois os socketsin.close();clienteSocket.close();serverSocket.close();

}}

Page 96: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

96

191

Servidor TCP com Servidor TCP com threadsthreadsExemploExemploEx37\EchoServerThread.javaimport java.net.*;import java.io.*;class Connection extends Thread{

private Socket clienteSocket;static int stConNum=1; int ConNum=stConNum++;public Connection(Socket cliente) { clienteSocket = cliente; }public void run() {

PrintWriter out = null;BufferedReader in = null;try {

out = new PrintWriter(new OutputStreamWriter( clienteSocket.getOutputStream()), true);

in = new BufferedReader(newInputStreamReader(clienteSocket.getInputStream()));

while ((str = in.readLine()) != null) { System.out.println("Con"+ConNum+": "+str);out.println(str);

}out.close(); in.close(); clienteSocket.close();

}catch (IOException ioe) { System.out.println(ioe);}}

}Continua

192

Servidor TCP com Servidor TCP com threadsthreadsExemplo (2)Exemplo (2)Ex37\EchoServerThread.java (cont.)public class EchoServerThread{

public static final int PORT = 3000;public static void main(String[] args) throws IOException {

ServerSocket sock = null;try {

sock = new ServerSocket(PORT);while (true) {

//Fica à escuta de conexões. Cada nova conexão é servida //num thread separadoThread worker = new Connection(sock.accept());worker.start();

}}catch (IOException ioe) {

System.out.println(ioe);}finally {

if (sock != null) sock.close();}

}}

Page 97: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

97

193

ClasseClasse InetAddressInetAddress

• Representa um endereço IP• Principais métodos estáticos

• getLocalHost()• Devolve um objecto InetAddress com um endereço do host local

• getByName(String hostname) • Devolve um objecto InetAddress com o endereço do host cujo nome

é hostname

• Principais métodos de instância• getHostAddress()

• Devolve uma string com o IP do host a que o objecto InetAddress se refere

• getHostName() • Devolve uma string com o nome do host a que o objecto

InetAddress se refere

194

ClasseClasse InetAddressInetAddress –– ExemploExemploEx34\ResLocalhost.javaimport java.net.*;//Para descobrir o IP e nome da máquina localpublic class ResLocalhost {

public static void main(String[] args) throws Exception {InetAddress address = InetAddress.getLocalHost();String ip = address.getHostAddress();String nome = address.getHostName();System.out.println("O seu computador chama-se "+nome+" e tem o

endereço IP "+ip);}

}

Page 98: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

98

195

ClasseClasse DatagramSocketDatagramSocket

• Representa o ponto de acesso para envio e recepção de datagramas UDP (unicast e broadcast)

• Principais métodos constructores• DatagramSocket()

• Cria um socket e associa-o a um porto local livre (>1024)• DatagramSocket(int port)

• Cria um socket e associa-o ao porto local port. • DatagramSocket (int port, InetAddress addr)

• Cria um socket e associa-o ao porto local port e endereço local addr.

196

ClasseClasse DatagramSocketDatagramSocket (2)(2)

• Principais métodos servem para enviar e receber datagramas• send(DatagramPacket p)

• Envia um datagram a partir deste socket. • receive(DatagramPacket p)

• Recebe um datagrama por este socket.• int getLocalPort()

• Devolve o porto local ao qual o socket está associado.• close()

• Fecha o socket.

Page 99: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

99

197

ClasseClasse DatagramPacketDatagramPacket

• Representa um datagrama UDP.• Principais construtores:

• DatagramPacket(byte[] buf, int length)• Cria um datagrama para enviar e receber mensagens com um tamanho

máximo de length bytes.• DatagramPacket(byte[] buf, int length, InetAddress

address, int port)• Cria um datagrama e inicializa-o com o par endereço/porto destino.

198

ClasseClasse DatagramPacketDatagramPacket (2)(2)

• Principais métodos :• InetAddress getAddress()

• Devolve o endereço do socket remoto.• void setAddress(InetAddress addr)

• Altera o endereço destino para addr.• int getPort()

• Devolve o porto do socket remoto.• void setPort(int port)

• Altera o porto destino para port

• byte[] getData()• Devolve a mensagem contida no datagrama.

• void setData(byte[] buf)• Copia a mensagem contida em buf para o datagrama.

Page 100: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

100

199

UDP envio UDP envio –– ExemploExemploEx35\UDPSend.javaimport java.io.*;import java.net.*;// Envia um pacote para uma aplicação UDP, neste caso no localhost, no porto 3000public class UDPSend {

static final int port = 3000; //porto destinostatic final String host = “localhost”; //host destinopublic static void main(String args[]) throws Exception {

//Obtem o endereço do host destinoInetAddress address = InetAddress.getByName(host);String msg = "Isto é um teste";int msglen = msg.length();//Converte a string para um array de bytesbyte[] message = msg.getBytes();// inicializa o datagrama com os dados a enviar e os endereçosDatagramPacket packet = new DatagramPacket(message, msglen, address, port);// Cria um socket e envia o datagrama através deleDatagramSocket socket = new DatagramSocket();socket.send(packet);socket.close();

}}

200

UDP recepUDP recepçção ão –– ExemploExemploEx35\UDPReceive.javaimport java.io.*;import java.net.*;//Fica à espera de datagramas no porto 3000. Imprime qual a sua origem e qual o seu conteúdopublic class UDPReceive {

static final int port = 3000;public static void main(String args[]) throws Exception {

byte[] buffer = new byte[1024];DatagramSocket socket = new DatagramSocket(port); //fica à escuta no porto 3000

while(true) {DatagramPacket packet = new DatagramPacket(buffer, buffer.length);// Espera pela chegada de um datagramasocket.receive(packet);// Converte o buffer de bytes para uma string através// do contrutor: String(byte[] bytes, int offset, int length) String s = new String(packet.getData(), 0, packet.getLength());System.out.println("UDPReceive: received from "

+packet.getAddress().getHostName()+ ":" +packet.getPort()+ ": " + s);

}}

}

Page 101: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

101

201

ClasseClasse MulticastSocketMulticastSocket

• Representa o ponto de acesso para envio e recepção de datagramas UDP em multicast

• IPv4: 224.0.0.0 a 239.255.255.255• IPv6: endereços começados por FF

• Principais construtores:• MulticastSocket()

• Cria um socket UDP para multicast.• MulticastSocket(int port)

• Cria um socket UDP associado ao porto port para multicast.

202

ClasseClasse MulticastSocketMulticastSocket (2)(2)

• Principais métodos:• void joinGroup(InetAddress mcastaddr)

• Associa o socket a um grupo (endereço) multicast mcastaddr.• void leaveGroup(InetAddress mcastaddr)

• Sai do grupo multicast mcastaddr.• void setLoopbackMode(boolean disable)

• Inibe/permite o loopback de datagramas multicast.• void setTimeToLive(int ttl)

• Altera o valor do TTL.

Page 102: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

102

203

MulticastMulticast envio envio –– ExemploExemploEx36\MulticastSender.javaimport java.net.*;

public class MulticastSender {public static void main(String[] args) throws Exception{String addr = "230.0.0.1"; //endereço multicastint port = 6000; //porto destino InetAddress group = InetAddress.getByName(addr);

String msg = "Aqui vai alguma coisa via multicast\r\n";DatagramPacket dp = new DatagramPacket(msg.getBytes(), msg.length(), group, port);MulticastSocket ms = new MulticastSocket();

ms.send(dp);ms.close();

}}

204

MulticastMulticast receprecepçção ão –– ExemploExemploEx36\MulticastReceiver.javaimport java.net.*;

public class MulticastReceiver {public static void main(String[] args) throws Exception {

int port = 6000;String addr= "230.0.0.1";InetAddress group = InetAddress.getByName(addr);MulticastSocket ms = new MulticastSocket(port);ms.joinGroup(group);

byte[] buffer = new byte[8192];int c=0;while(c++<10){

DatagramPacket dp = new DatagramPacket(buffer, buffer.length);ms.receive(dp);String s = new String(dp.getData(), 0, dp.getLength());System.out.println(s);

}ms.leaveGroup(group);ms.close();

}}

Page 103: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

103

205

Classe URLClasse URL

• Representa um Uniform Resource Locator• Ex: http://www.google.pt:80/index.html

• protocol: http• host: www.google.pt• port: 80 (porto por omissão associado ao http)• file: index.html (ficheiro por omissão)

• Principais contrutores• URL(String spec)• URL(String protocol, String host, String file) • URL(String protocol, String host, int port, String file)

206

Classe URLClasse URL

• Principais métodos• openStream()

• Obtém um InputStream para os dados• openConnection()

• Devolve um objecto URLConnection que contém métodos para ler o cabeçalho dos dados

• getContent()• Devolve os dados directamente como Object se conteúdo for

conhecido (texto, imagens, etc.)

Page 104: Introdução ao Java - paginas.fe.up.ptpaginas.fe.up.pt/~jaime/0607/PC/introducao_ao_java_2slides_v1.4.pdf · 1 Introdução ao Java FEUP>DEEC>MRSC>Programação em Comunicações

104

207

Classe URL Classe URL –– ExemploExemploEx33\GetPag.javaimport java.net.*;import java.io.*;

public class GetPag {public static void main(String[] args) throws IOException {

try {URL url = new URL("http://www.google.com");InputStreamReader reader = new InputStreamReader(url.openStream());BufferedReader br = new BufferedReader(reader);String linha = "";while ( (linha = br.readLine()) != null) {

System.out.println(linha);}

} catch (MalformedURLException e) { System.out.println("URL mal formado");}}

}