Operação toString
Classes, instâncias e objectos
Leituras com Scanner
 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 2
 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 3
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 Fundamentos de Programação 4
myRational
numerator = 1
denominator = 4
myRationalAsString
«Rational@75da931b»
Nome da classeCódigo de hash
em hexadecimal
 Métodos System.out.print* invocam toString
automaticamente
 Exemplo
Rational myRational = new Rational(1, 4);
out.println(myRational);
2013/2014 Fundamentos de Programação 5
_Rational@75da931b
_
public 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 Fundamentos de Programação 6
myRational
numerator = 1
denominator = 4
myRationalAsString
«1/4»
Deixamos claro que queremos
que este método se sobreponha
ao método por omissão.
 Métodos System.out.print* invocam toString
automaticamente
 Exemplo
Rational myRational = new Rational(1, 4);
out.println(myRational);
2013/2014 Fundamentos de Programação 7
_1/4
_
 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 Fundamentos de Programação 8
r1
1/4
r2
1/2
r3
1/8
string
“1/4 × 1/2 = 1/8”
 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 Fundamentos de Programação 9
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
 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();
2013/2014 Fundamentos de Programação 11
luke
name = «Luke»
height = 1,81
verdadeiro
isTall
1,81
height
asString
«Luke (1,81)»
1,81m
Luke
 É 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 Fundamentos de Programação 12
Joe
Jack
William
Avarell
2,10m
Averell
1,90m
William
1,70m
Jack
1,50m
Joe
daltons
null
0 1 2 3
null null null
final boolean joeIsTall = daltons[3].isTall();
final String name = daltons[1].getName();
2013/2014 Fundamentos de Programação 13
falso
joeIsTall
name
“William”
2,10m
Averell
1,90m
William
1,70m
Jack
1,50m
Joe
daltons
0 1 2 3
public 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 Fundamentos de Programação 14
Conjunto de Person.Os
conjuntos não permitem
membros repetidos.
Hã? A ver mais tarde. 
final 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 Fundamentos de Programação 15
_Gang {Name: Dalton, Members: [Joe (1.5), Avarell (2.1), Jack
(1.7), William (1.9)], Lider: Joe (1.5)}
_
public 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 Fundamentos de Programação 16
Este ciclo coloca
sucessivamente em member
todas as referências guardadas
nos itens da colecção members
(que neste caso é um conjunto).
final 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 Fundamentos de Programação 17
_1.7999999999999998
_
public 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 18
final 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 Fundamentos de Programação 19
_Joe (1.5)
_
 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 20
 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 Fundamentos de Programação 21
Construção de um
novo Scanner.
 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 22
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 Fundamentos de Programação 23
_Read 5 words.
_
Read 5 words.
Inverted sentence: five four three two one
_
 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 Scanner
2013/2014 Fundamentos de Programação 24
 Operação toString
 Classes, instâncias e objectos
 Leituras com Scanner
2013/2014 Fundamentos de Programação 25

9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos de Programação

  • 1.
    Operação toString Classes, instânciase objectos Leituras com Scanner
  • 2.
     Classes einstâ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 2
  • 3.
     Disponível emtodas 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 3
  • 4.
    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 Fundamentos de Programação 4 myRational numerator = 1 denominator = 4 myRationalAsString «Rational@75da931b» Nome da classeCódigo de hash em hexadecimal
  • 5.
     Métodos System.out.print*invocam toString automaticamente  Exemplo Rational myRational = new Rational(1, 4); out.println(myRational); 2013/2014 Fundamentos de Programação 5 _Rational@75da931b _
  • 6.
    public 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 Fundamentos de Programação 6 myRational numerator = 1 denominator = 4 myRationalAsString «1/4» Deixamos claro que queremos que este método se sobreponha ao método por omissão.
  • 7.
     Métodos System.out.print*invocam toString automaticamente  Exemplo Rational myRational = new Rational(1, 4); out.println(myRational); 2013/2014 Fundamentos de Programação 7 _1/4 _
  • 8.
     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 Fundamentos de Programação 8 r1 1/4 r2 1/2 r3 1/8 string “1/4 × 1/2 = 1/8”
  • 9.
     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 Fundamentos de Programação 9
  • 10.
    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
  • 11.
     Exemplar concretoque 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(); 2013/2014 Fundamentos de Programação 11 luke name = «Luke» height = 1,81 verdadeiro isTall 1,81 height asString «Luke (1,81)» 1,81m Luke
  • 12.
     É possívelter 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 Fundamentos de Programação 12 Joe Jack William Avarell 2,10m Averell 1,90m William 1,70m Jack 1,50m Joe daltons null 0 1 2 3 null null null
  • 13.
    final boolean joeIsTall= daltons[3].isTall(); final String name = daltons[1].getName(); 2013/2014 Fundamentos de Programação 13 falso joeIsTall name “William” 2,10m Averell 1,90m William 1,70m Jack 1,50m Joe daltons 0 1 2 3
  • 14.
    public 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 Fundamentos de Programação 14 Conjunto de Person.Os conjuntos não permitem membros repetidos. Hã? A ver mais tarde. 
  • 15.
    final 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 Fundamentos de Programação 15 _Gang {Name: Dalton, Members: [Joe (1.5), Avarell (2.1), Jack (1.7), William (1.9)], Lider: Joe (1.5)} _
  • 16.
    public 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 Fundamentos de Programação 16 Este ciclo coloca sucessivamente em member todas as referências guardadas nos itens da colecção members (que neste caso é um conjunto).
  • 17.
    final 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 Fundamentos de Programação 17 _1.7999999999999998 _
  • 18.
    public 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 18
  • 19.
    final 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 Fundamentos de Programação 19 _Joe (1.5) _
  • 20.
     Simplifica leiturade 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 20
  • 21.
     Usa-se declaraçãode 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 Fundamentos de Programação 21 Construção de um novo Scanner.
  • 22.
     Construtor comjava.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 22
  • 23.
    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 Fundamentos de Programação 23 _Read 5 words. _ Read 5 words. Inverted sentence: five four three two one _
  • 24.
     Classes  OperaçãotoString  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 Scanner 2013/2014 Fundamentos de Programação 24
  • 25.
     Operação toString Classes, instâncias e objectos  Leituras com Scanner 2013/2014 Fundamentos de Programação 25