9. operação tostring(); classes, instâncias e objectos; scanner – fundamentos de programação
DESCRIPTION
Fundamentos da Programação 9: • Operação toString() • Classes, instâncias e objectos • Leituras com Scanner Apresentação 9 da unidade curricular de Fundamentos de Programação da Universidade Europeia. Alterações de Manuel Menezes de Sequeira sobre versão original por vários autores do DCTI do ISCTE-IUL, incluindo Luís Nunes, Ricardo Ribeiro, André Santos e o próprio Manuel Menezes de Sequeira.TRANSCRIPT
Apresentação 9
Operação toStringClasses, instâncias e objectosLeituras com Scanner
Fundamentos de Programação 2
Da apresentação 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
2013/2014
Fundamentos de Programação 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
2013/2014
Fundamentos de Programação 4
Exemplo: Rational
public class Rational { private final int numerator; private final int denominator;
public Rational(final int numerator, final int denominator) { this.numerator = numerator; this.denominator = denominator; }
…}
…
final Rational myRational = new Rational(1, 4);final String myRationalAsString = myRational.toString();out.println(myRationalAsString);
2013/2014
myRational
numerator = 1denominator = 4myRationalAsString
«Rational@75da931b»
Nome da classe
Código de hash em
hexadecimal
Fundamentos de Programação 5
toString e System.out.print*
Métodos System.out.print* invocam toString automaticamente
Exemplo
Rational myRational = new Rational(1, 4);out.println(myRational);
2013/2014
_Rational@75da931b_
Fundamentos de Programação 6
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();
2013/2014
myRational
numerator = 1denominator = 4
myRationalAsString
«1/4»
Deixamos claro que queremos que este método se sobreponha ao método
por omissão.
Fundamentos de Programação 7
toString e System.out.print*
Métodos System.out.print* invocam toString automaticamente
Exemplo
Rational myRational = new Rational(1, 4);out.println(myRational);
2013/2014
_1/4_
Fundamentos de Programação 8
toString e concatenação
Operador + com String e referência para instância de classe: operação toString invocada automaticamente
Exemplo
final Rational r1 = new Rational(1, 4);final Rational r2 = new Rational(1, 2);final Rational r3 = r1.multipliedBy(r2);final String string = r1 + " × " + r2 + " = " + r3;
2013/2014
r1
1/4
r2
1/2
r3
1/8
string
“1/4 × 1/2 = 1/8”
Fundamentos de Programação 9
Classes: instâncias e objectos Classe é «molde» para construção de
instâncias/objectos com características determinadas
Classe de igualdade ou classe de valor Igualdade é relevante Identidade irrelevante Resultado da construção: instância Exemplo: Rational
Classe de identidade ou classe de referência Identidade é relevante Igualdade pouco importante Resultado da construção: objecto Exemplo: Person
2013/2014
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() + ")"; }
}
2013/2014 Fundamentos de Programação 10
Fundamentos de Programação 11
Exemplar concreto que obedece ao “molde” (classe)
Exemplo
final Person luke = new Person("Luke", 1.81);final boolean isTall = luke.isTall();final double height = luke.getHeight();final String asString = luke.toString();
Objecto
2013/2014
luke
name = «Luke»height = 1,81
verdadeiro
isTall
1,81height
asString
«Luke (1,81)»
1,8
1
m
Luke
Fundamentos de Programação 12
Arrays de (referências para) objectos
É possível ter arrays de referências para objectos de uma classe
Exemplo
final 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);
2013/2014
Joe
JackWilliam
Avarell
2,1
0
m
Averell1
,90
m
William
1,7
0
m
Jack
1,5
0
m
Joe
daltons
null0 1 2 3
nullnullnull
Fundamentos de Programação 13
Arrays de (referências para) objectos
final boolean joeIsTall = daltons[3].isTall();final String name = daltons[1].getName();
2013/2014
falsojoeIsTall
name
“William”
2,1
0
m
Averell
1,9
0
m
William
1,7
0
m
Jack
1,5
0
m
Joe
daltons0 1 2 3
Fundamentos de Programação 14
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; }
@Override public String toString() { return "Gang {Name: " + name + ", Members: " + members + ", Lider: " + lider + "}"; }
…}
2013/2014
Conjunto de Person. Os conjuntos não
permitem membros repetidos.
Hã? A ver mais tarde.
Fundamentos de Programação 15
Uma classe com um conjuntofinal Person averell = new Person("Averell", 2.1);final Person william = new Person("William", 1.9);final Person jack = new Person("Jack", 1.7);final Person joe = new Person("Joe", 1.5);
final Gang daltons = new Gang("Dalton");
daltons.add(averell);daltons.add(william);daltons.add(jack);daltons.add(joe);
daltons.setLiderTo(joe); out.println(daltons);
2013/2014
_Gang {Name: Dalton, Members: [Joe (1.5), Avarell (2.1), Jack (1.7), William (1.9)], Lider: Joe (1.5)}_
Fundamentos de Programação 16
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(); }
…}
2013/2014
Este ciclo coloca sucessivamente em
member todas as referências guardadas nos itens da colecção
members (que neste caso é um conjunto).
Fundamentos de Programação 17
Uma classe com um conjuntofinal Person averell = new Person("Averell", 2.1);final Person william = new Person("William", 1.9);final Person jack = new Person("Jack", 1.7);final Person joe = new Person("Joe", 1.5);
final Gang daltons = new Gang("Dalton");
daltons.add(averell);daltons.add(william);daltons.add(jack);daltons.add(joe);
daltons.setLiderTo(joe); out.println(daltons.averageHeight());
2013/2014
_1.7999999999999998_
Fundamentos de Programação 18
Uma classe com um conjuntopublic class Gang {
private String name; private Set<Person> members; private Person lider; …
public Person shortestMember() { if (members.size() == 0) throw new IllegalStateException("Illegal…");
double smallestHeight = Double.POSITIVE_INFINITY; Person shortestMember = null; for (Person member : members) if (member.getHeight() < smallestHeight) { smallestHeight = member.getHeight(); shortestMember = member; } return shortestMember; } …}
2013/2014
Fundamentos de Programação 19
Uma classe com um conjuntofinal Person averell = new Person("Averell", 2.1);final Person william = new Person("William", 1.9);final Person jack = new Person("Jack", 1.7);final Person joe = new Person("Joe", 1.5);
final Gang daltons = new Gang("Dalton");
daltons.add(averell);daltons.add(william);daltons.add(jack);daltons.add(joe);
daltons.setLiderTo(joe); out.println(daltons.shortestMember());
2013/2014
_Joe (1.5)_
Fundamentos de Programação 20
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;2013/2014
Fundamentos de Programação 21
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(…); … }
…
}
2013/2014
Construção de um novo Scanner.
Fundamentos de Programação 22
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
final Scanner inputScanner = new Scanner(System.in);
final String line = inputScanner.nextLine();
inputScanner.close();
2013/2014
Fundamentos de Programação 23
Classe Scanner: leitura de palavras de uma cadeia
final String sentence = "one two three four five ";
int numberOfWords = 0;String invertedSentence = "";
final Scanner sentenceScanner = new Scanner(sentence);
while (sentenceScanner.hasNext()) { final String word = sentenceScanner.next(); invertedSentence = word + " " + invertedSentence; numberOfWords++;}
sentenceScanner.close();
out.println("Read " + numberOfWords + " words.");out.println("Inverted sentence: " + invertedSentence);
2013/2014
_Read 5 words._Read 5 words.Inverted sentence: five four three two one_
Fundamentos de Programação 24
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 foreach
Leituras com Scanner2013/2014
Fundamentos de Programação 25
Sumário
Operação toString
Classes, instâncias e objectos
Leituras com Scanner
2013/2014