Upload
manuel-menezes-de-sequeira
View
1.204
Download
1
Embed Size (px)
DESCRIPTION
Apresentação da semana 9 da unidade curricular de Introdução à Programação do DCTI do ISCTE-IUL. Alterações de Manuel Menezes de Sequeira sobre versão original por vários autores do DCTI, incluindo Luís Nunes e André Santos.
Citation preview
Aula 9
Operação toStringClasses, instâncias e objectosLeituras com Scanner
Introdução à Programação - DCTI - ISCTE-IUL 2
Da aula anterior…
Classes e instâncias Instanciação Membros Funções vs. procedimentos Tipos de referência vs. tipos de valor Tipos primitivos vs. restante tipos (em Java) Igualdade vs. identidade
Cadeias de caracteres com a classe String
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 3
Operação toString
Disponível em todas as classes Java
Devolve representação textual (String) da instância a que se aplica
Definição por omissão é pouco interessante
Necessário sobrepor nosso próprio método
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 4
Operação toString: exemplopublic class Rational { private final int numerator; private final int denominator;
…
@Override public String toString() { return numerator + "/" + denominator; }
…}
Rational myRational = new Rational(1, 4);String myRationalAsString = myRational.toString();
2010/2011
myRational
numerator = 1denominator = 4
myRationalAsString
“1/4”
Deixamos claro que queremos que este método se sobreponha ao método
por omissão.
Introdução à Programação - DCTI - ISCTE-IUL 5
toString e System.out.print*
Métodos System.out.print* invocam toString automaticamente
Exemplo
Rational myRational = new Rational(1, 4);System.out.println(myRational);
2010/2011
_1/4_
Introdução à Programação - DCTI - ISCTE-IUL 6
toString e concatenação
Operador + com String e referência para instância de classe: operação toString invocada automaticamente
Exemplo
Rational r1 = new Rational(1, 4);Rational r2 = new Rational(1, 2);Rational r3 = r1.multipliedBy(r2);String string = r1 + " × " + r2 + " = " + r3;
2010/2011
r1
1/4
r2
1/2
r3
1/8
string
“1/4 × 1/2 = 1/8”
Introdução à Programação - DCTI - ISCTE-IUL 7
Classes: instâncias e objectos Classe é “molde” para construção de
instâncias/objectos com características determinadas
Classe de valor Igualdade é relevante Identidade irrelevante Resultado da construção: instância Exemplo: Rational
Classe de referência Identidade é relevante Igualdade pouco importante Resultado da construção: objecto Exemplo: Pessoa
2010/2011
Classe Person
public class Person {
private String name; private double height;
public Person(final String name, final double height) { this.name = name; this.height = height; } public String getName() { return name; }
public double getHeight() { return height; }
public boolean isTall() { return 1.8 <= getHeight(); }
@Override public String toString() { return getName() + " (" + getHeight() + ")"; }
}
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 8
Introdução à Programação - DCTI - ISCTE-IUL 9
Exemplar concreto que obedece ao “molde” (classe)
Exemplo
Person luke = new Person("Luke", 1.81);boolean isTall = luke.isTall();double height = luke.getHeight();String asString = luke.toString();
Instância/objecto
2010/2011
luke
name = “Luke”height = 1,81
verdadeiro
isTall
1,81height
asString
“Luke (1,81)”
1,8
1
m
Luke
Introdução à Programação - DCTI - ISCTE-IUL 10
Matrizes de (referências para) objectos
É possível ter matrizes de referências para objectos de uma classe
Exemplo
Person[] daltons = new Person[4];daltons[0] = new Person("Averell", 2.1);daltons[1] = new Person("William", 1.9);daltons[2] = new Person("Jack", 1.7);daltons[3] = new Person("Joe", 1.5);
2010/2011
Joe
JackWilliam
Avarell
2,1
0
m
Averell1
,90
m
William
1,7
0
m
Jack
1,7
0
m
Joe
daltons
null0 1 2 3
nullnullnull
Introdução à Programação - DCTI - ISCTE-IUL 11
Matrizes de (referências para) objectos
boolean joeIsTall = daltons[3].isTall();String name = daltons[1].getName();
2010/2011
falsojoeIsTall
name
“William”
2,1
0
m
Averell
1,9
0
m
William
1,7
0
m
Jack
1,7
0
m
Joe
daltons0 1 2 3
Introdução à Programação - DCTI - ISCTE-IUL 12
Uma classe com um conjuntopublic class Gang {
private String name; private Set<Person> members; private Person lider;
public Gang(final String name) { this.name = name; this.members = new HashSet<Person>(); this.lider = null; } public void add(final Person newMember) { members.add(newMember); }
public void setLiderTo(final Person newLider) { members.add(newLider); lider = newLider; }
public String toString() { return "Gang {Name: " + name + ", Members: " + members + ", Lider: " + lider + "}"; }
…}
2010/2011
Conjunto de Person. Os conjuntos não
permitem membros repetidos.
Hã? A ver mais tarde.
Introdução à Programação - DCTI - ISCTE-IUL 13
Uma classe com um conjuntoPerson averell = new Person("Averell", 2.1);Person william = new Person("William", 1.9);Person jack = new Person("Jack", 1.7);Person joe = new Person("Joe", 1.5);
Gang daltons = new Gang("Dalton");
daltons.add(averell);daltons.add(william);daltons.add(jack);daltons.add(joe);
daltons.setLiderTo(joe); out.println(daltons);
2010/2011
_Gang {Name: Dalton, Members: [Joe (1.5), Avarell (2.1), Jack (1.7), William (1.9)], Lider: Joe (1.5)}_
Introdução à Programação - DCTI - ISCTE-IUL 14
Uma classe com um conjuntopublic class Gang {
private String name; private Set<Person> members; private Person lider;
…
public double averageHeight() { double sumOfHeights = 0.0;
for (Person member : members) sumOfHeights += member.getHeight(); return sumOfHeights / members.size(); }
…}
2010/2011
Este ciclo atribui sucessivamente a member
todas as referências guardadas nos itens da colecção members (que
neste caso é um conjunto).
Introdução à Programação - DCTI - ISCTE-IUL 15
Uma classe com um conjuntoPerson averell = new Person("Averell", 2.1);Person william = new Person("William", 1.9);Person jack = new Person("Jack", 1.7);Person joe = new Person("Joe", 1.5);
Gang daltons = new Gang("Dalton");
daltons.add(averell);daltons.add(william);daltons.add(jack);daltons.add(joe);
daltons.setLiderTo(joe); out.println(daltons.averageHeight());
2010/2011
_1.7999999999999998_
Introdução à Programação - DCTI - ISCTE-IUL 16
Uma classe com um conjuntopublic class Gang {
private String name; private Set<Person> members; private Person lider; …
public Person shorterMember() { if (members.size() == 0) throw new IllegalStateException("Illegal…");
double smallerHeight = Double.POSITIVE_INFINITY; Person shorterMember = null; for (Person member : members) if (member.getHeight() < smallerHeight) { smallerHeight = member.getHeight(); shorterMember = member; } return shorterMember; } …}
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 17
Uma classe com um conjuntoPerson averell = new Person("Averell", 2.1);Person william = new Person("William", 1.9);Person jack = new Person("Jack", 1.7);Person joe = new Person("Joe", 1.5);
Gang daltons = new Gang("Dalton");
daltons.add(averell);daltons.add(william);daltons.add(jack);daltons.add(joe);
daltons.setLiderTo(joe); out.println(daltons.shorterMember());
2010/2011
_Joe (1.5)_
Introdução à Programação - DCTI - ISCTE-IUL 18
Classe Scanner
Simplifica leitura de texto a partir de teclado (interacção com o utilizador) cadeia de caracteres (instância de String) arquivo …
Nome completo: java.util.Scanner
Usar apenas Scanner implica
import java.util.Scanner;2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 19
Importação e instanciação de Scanner
Usa-se declaração de importação
Declaração de importação antes das restantes definições
import java.util.Scanner;
public class SomeClass { … public static void main(final String[] args) { Scanner scanner = new Scanner(…); … }
…
}
2010/2011
Construção de um novo Scanner.
Introdução à Programação - DCTI - ISCTE-IUL 20
Classe Scanner: leitura de linha do teclado
Construtor com java.lang.System.in para ler do teclado
Operação nextLine bloqueia até próximo <enter> devolve texto introduzido até <enter>
Exemplo
Scanner inputScanner = new Scanner(System.in);
String line = inputScanner.nextLine();
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 21
Classe Scanner: leitura de palavras de uma cadeia
String sentence = "one two three four five ";Scanner stringScanner = new Scanner(sentence);
int numberOfWords = 0;String invertedSentence = "";
while (scanner.hasNext()) { String word = scanner.next(); invertedSentence = word + " " + invertedSentence; numberOfWords++;}
out.println("Read " + numberOfWords + " words.");out.println("Inverted sentence: " + invertedSentence);
2010/2011
_Read 5 words._Read 5 words.Inverted sentence: five four three two one_
Introdução à Programação - DCTI - ISCTE-IUL 22
A reter
Classes Operação toString Objectos vs. instâncias Classes de valor vs. classes de referência Classes como moldes Instanciação Exemplos
Conjuntos, colecções e ciclo for-each
Leituras com Scanner2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 23
A ler...
Capítulos 8 e 9 do livro:
Y. Daniel Liang, Introduction to Java Programming, 8.ª edição, Prentice-Hall, 2010. ISBN: 978-0-13-213080-6
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 24
Sumário
Operação toString
Classes, instâncias e objectos
Leituras com Scanner
2010/2011