Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf ·...

27
PCO / PPO Departamento de Informática Faculdade de Ciências da Universidade de Lisboa Definição de classes em Java (introdução)

Transcript of Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf ·...

Page 1: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

PCO / PPODepartamento de Informática

Faculdade de Ciências da Universidade de Lisboa

Definição de classes em Java(introdução)

Page 2: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Resumo

➡ Introdução à implementação de classes Java➡ declaração de campos de instância

➡ definição de construtores

➡ definição de métodos de instância

➡ campos e métodos de classe (i.e., “estáticos”)

➡ visibilidade privada, pública e de pacote

➡ documentação de classes no formato Javadoc

➡ anotação de pré-condições

2

Page 3: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Conteúdo de uma classe - componentes essenciais -

3

package some_package;public class ClassName { CAMPOS DE INSTÂNCIA + CONSTRUTORES + MÉTODOS DE INSTÂNCIA + CAMPOS/MÉTODOS DE CLASSE (ESTÁTICOS)}

➡ Campos de instância: definem atributos dos objectos da classe.

➡ Construtores: definem a inicialização dos objectos da classe.

➡ Métodos de instância: métodos que conduzem operações tendo em conta os valores dos campos de instância.

➡ Campos e métodos de classe (“estáticos”): definem atributos / métodos globais à classe.

Page 4: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

➡ Vamos ver como dar corpo a esta classe para representar a hora do dia com precisão de minutos. O exemplo completo está disponível no Moodle. 4

package pco.time;public class TimeOfDay { ... public TimeOfDay() { ... } public TimeOfDay(int h, int m) { ... } public TimeOfDay(TimeOfDay t) { ... } public int getHours() { ... } public int getMinutes() { ... } public void setHours(int h) { ... } public void setMinutes(int m) { ... } public String toString() { ... } public void advanceOneHour() { ... } public void advanceOneMinute() { ... } public boolean sameTime(TimeOfDay t) { ... } public TimeOfDay oneHourLater() { ... } public TimeOfDay oneMinuteLater() { ... } public static TimeOfDay midday() { ... } public static TimeOfDay currentTime() { ... } ...}

Page 5: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Campos de instância

➡ Campos de instância➡ Definem os atributos de um objecto (instância) da classe.➡ Estado de um objecto: conjunto de valores associados aos

campos de instância a dado momento durante a execução➡ Cada campo de instância é definido por um tipo e nome (único) , e

outros modificadores (opcionais).➡ No exemplo: um objecto TimeOfDay tem sempre associado um

campo hours (para as horas) e um campo minutes (minutos) 5

package pco.time;

public class TimeOfDay { ... int hours; ... int minutes; ...}

Page 6: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Visibilidade private

➡ O modificador private (privado) limita a visibilidade dos campos ao código da classe (o inverso de public)

➡ Os campos podem ser acedidos (lidos/escritos) apenas por código definido na própria classe.

➡ Código em outra classe não poderá aceder aos campos.

➡ Encapsulamento / ocultação de informação (“information hiding”)➡ desta forma escondem-se detalhes de implementação➡ o interface entre código cliente e a classe não pode ser feito via

declarações privadas 6

package pco.time;

public class TimeOfDay { private int hours; private int minutes; ...}

Page 7: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Construtores

➡ Construtores➡ Definem como um objecto de uma classe é inicializado.➡ No exemplo: campo hours inicializado com valor de h e campo

minutes com o valor de m.7

package pco.time;public class TimeOfDay { private int hours; private int minutes; ... public TimeOfDay(int h, int m) { hours = h; minutes = m; }}

Page 8: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Construtores (2)

➡ Podemos ter vários construtores.➡ Obs. : O terceiro construtor é expresso c/acessos a campos de t . 8

package pco.time;public class TimeOfDay { ... public TimeOfDay(int h, int m) { hours = h; minutes = m; } public TimeOfDay() { hours = 0; minutes = 0; } public TimeOfDay(TimeOfDay t) { hours = t.hours; minutes = t.minutes; }}

Page 9: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Uso do operador new

9

package pco.time;public class TimeOfDay { ... public TimeOfDay(int h, int m) { hours = h; minutes = m; } public TimeOfDay() { hours = 0; minutes = 0; } public TimeOfDay(TimeOfDay t) { hours = t.hours; minutes = t.minutes; }...

TimeOfDay t = new TimeOfDay(12, 30);

TimeOfDay t2 = new TimeOfDay();

TimeOfDay t3 = new TimeOfDay(t);

• 12 30t

hours minutes

TimeOfDay

• 0 0t2

hours minutes

TimeOfDay

• 12 30t3

hours minutes

TimeOfDay

Page 10: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Palavra chave this

➡ this refere-se à instância (objecto) em contexto➡ Analogia possível com Python: this ~ self➡ Palavra-chave pode ser geralmente omitida no acesso a

atributos, excepto p/desfazer ambiguidades entre nomes de variáveis em contexto e campos de instância (ex. variante do construtor acima).

10

public TimeOfDay(int hours, int minutes) { this.hours = hours; this.minutes = minutes;}

public TimeOfDay(int h, int m) { hours = h; minutes = m; }

em alternativa a …

Page 11: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Invocação entre construtores

➡ Alternativa ao código que vimos antes … no exemplo o segundo e terceiro construtor invocam o primeiro …

➡ O esquema é usado para delegar inicialização a um construtor “base”, aquele que é o mais “geral”, e assim reutilizar código … 11

package pco.time;public class TimeOfDay { ... public TimeOfDay(int h, int m) { hours = h; minutes = m; } public TimeOfDay() { this(0,0); } public TimeOfDay(TimeOfDay t) { this(t.hours, t.minutes); }}

Page 12: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Métodos de instância

➡ Um método de instância define uma operação que pode ser invocada sobre um objecto da classe. 12

package pco.time;public class TimeOfDay { private int hours; private int minutes; ... public int getHours() { return hours; } public int getMinutes() { return minutes; } public void setHours(int h) { hours = h; } public void setMinutes(int m) { minutes = m; } ...

Page 13: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Métodos de instância (2)

13

package pco.time;public class TimeOfDay { ... public String toString() { StringBuilder sb = new StringBuilder(); if (hours < 10) { sb.append('0'); } sb.append(hours); sb.append(':'); if (minutes < 10) { sb.append('0'); } sb.append(minutes); return sb.toString(); }}

➡ toString(): devolve representação textual no formato HH:MM.

Page 14: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Uso de métodos de instância(exemplo)

14

package any_package;

public class TimeOfDayClient { public static void main(String[] args) { TimeOfDay t = new TimeOfDay(9, 30); // > 9:30 int h = t.getHours(); // < 9 int m = t.getMinutes(); // < 30 System.out.println("Hours: "+ h + " Minutes: "+ m); System.out.println(t.toString()); // “09:30”

t.setHours(h + 1); // > 10 t.setMinutes(m + 10); // > 40 System.out.println(t.toString()); // “10:40” }}

Obs.: Este código pode ser definido em qualquer pacote, já que usa apenas funcionalidade declarada como public em TimeOfDay .

Page 15: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Mutabilidade

➡ setHours e setMinutes permitem que o estado do objecto seja alterado após construção.

➡ Objectos TimeOfDay são então mutáveis. A distinção que fazemos é a seguinte:

➡ objectos imutáveis: estado é inicializado apenas por construtores, não sendo possível alterá-lo posteriormente

➡ objectos mutáveis: estado pode ser modificado após inicialização15

package pco.time;public class TimeOfDay { private int hours; private int minutes; ... public void setHours(int h) { hours = h; } public void setMinutes(int m) { minutes = m; } ...

Page 16: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Visibilidade de pacote (“package-protected”)

➡ Obs.: Se não usarmos nem public nem private, por omissão as declarações de campos/métodos visíveis no contexto da classe e também todas as classes que fazem parte do mesmo pacote.

➡ Se TimeOfDay tivesse a forma acima, o código cliente do “slide” anterior teria de estar definido obrigatoriamente no pacote pco.time 16

package pco.time;class TimeOfDay { int hours; int minutes; ... TimeOfDay(int h, int m) { hours = h; minutes = m; }

Page 17: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Campos e métodos de classe (“estáticos”)

➡ Campos e métodos de classe são declarados com o modificador static.

➡ As declarações são globais à classe, ao contrário de campos e métodos de instância.

17

package pco.time;public class TimeOfDay { ... public static final int MINUTES_PER_HOUR = 60; public static final int HOURS_PER_DAY = 24; public static TimeOfDay midday() { return new TimeOfDay(12, 0); } ...}

Page 18: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Uso de campos e métodos de classe

18

TimeOfDay t = TimeOfDay.midday();

for (int i=1; i <= TimeOfDay.MINUTES_PER_HOUR; i++) { t.advanceOneMinute();}

System.out.println( t.toString() );

➡ Que string é impressa? ➡ Acesso a campos de classe: ➡ TimeOfDay.MINUTES_PER_HOUR

➡ System.out (definido em java.lang.System)

➡ Chamada a método de classe: ➡ TimeOfDay.midday()

Page 19: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Campos de classe e o modificador final

➡ O modificador final determina que os valores dos campos de classe são têm um valor fixo. Chamamos nesse caso aos campos constantes de classe.

➡ Não podemos redefinir o valor do campo. Por exemplo, a instrução seguinte causará um erro de compilação:

➡ TimeOfDay.MINUTES_PER_HOUR = 59;

19

package pco.time;public class TimeOfDay { ... public static final int MINUTES_PER_HOUR = 60; public static final int HOURS_PER_DAY = 24; public static TimeOfDay midday() { return new TimeOfDay(12, 0); } ...}

Page 20: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Uso de constantes

➡ As constantes também podem ser úteis na definição da funcionalidade da classe.

20

package pco.time;public class TimeOfDay { ... public void advanceOneHour() { hours ++; if (hours == HOURS_PER_DAY) { hours = 0; } } public void advanceOneMinute() { minutes ++; if (minutes == MINUTES_PER_HOUR) { minutes = 0; advanceOneHour(); } }

Page 21: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Campos de instância e o modificador final

➡ Se usarmos o modificador final para os campos de instância, a tentativa de atribuição de novos valores aos atributos dará erro de compilação.

➡ Apenas construtores podem atribuir valores a campos de instância assim declarados.

21

package pco.time;public class TimeOfDay { private final int hours; private final int minutes; ... public void setHours(int h) { hours = h; } public void setMinutes(int m) { minutes = m; } ...

X

X

Page 22: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Convenções usuais de nomeação em Java

➡ Pacotes: identificadores em letra minúscula separados por pontos.

➡ Se o código se associar a uma determinada organização é comum usar o URL invertido do domínio WWW como nome do pacote

➡ ex. pt.ul.fc.di.pco

➡ Nomes de classes começam com maiúsculas.

➡ Nomes de campos e métodos começam com minúsculas, excepto constantes que usualmente são declaradas usando apenas maiúsculas.

➡ Convenção “camel-case”: se um nome representar a junção de duas (ou mais) palavras, cada palavra começa com maísculas.

➡ ex. classes: TimeOfDay StringBuilder LayoutManager

➡ ex. métodos/campos/variáveis: identityMatrix() numColors 22

Page 23: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Documentação Javadoc

➡ O utilitário javadoc permite gerar documentação HTML a partir de código fonte Java. Toda a documentação da Java API é aliás gerada dessa forma ex. http://docs.oracle.com/javase/8/docs/api/java/lang/String.html

➡ A documentação é gerada a partir de secções de comentários começados por /** e terminados por */ 23

Page 24: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

24

/** * A class for representing the time of day * with the precision of minutes. * * @author Eduardo Marques, DI/FCUL, 2014 */public class TimeOfDay { …}

Documentação Javadoc (classe)

Page 25: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

25

/** * Check for equality against a given {@code TimeOfDay} * object. * @param t A {@code TimeOfDay} object * @return {@code true} if and only if {@code this} * and {@code t} represent the same time */public boolean sameTime(TimeOfDay t) { …}

Documentação Javadoc (métodos)

Page 26: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

26

/** * Value for hours. */ private int hours;

Documentação Javadoc (campos)

Page 27: Definição de classes em Java (introdução) - tl.di.fc ...tl.di.fc.ul.pt/s/pco_ppo_t4.pdf · Resumo Introdução à implementação de classes Java declaração de campos de instância

Anotação de pré-condições

➡ Como documentação extra-Javadoc vamos empregar a anotação @requires , com o propósito de anotar pré-condições que devem ser garantidas por código cliente.

➡ Ao longo do semestre veremos outros conceitos relacionados com o paradigma de desenho-por-contrato e também formas de validar e reportar erros usando excepções. 27

/** * Constructs a new time using supplied * values for hours and minutes. * @param h Value for hours * @param m Value for minutes */ //@requires h >= 0 && h < HOURS_PER_DAY //@requires m >= 0 && m < MINUTES_PER_HOUR public TimeOfDay(int h, int m) { hours = h; minutes = m; }