Este documento discute três tópicos principais: 1) A operação toString que é usada para converter objetos em strings; 2) A diferença entre classes, instâncias e objetos; 3) Como realizar leituras usando a classe Scanner.
2. 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
3. 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
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
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.
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 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
12. É 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
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 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
21. 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.
22. 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
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çã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
25. Operação toString
Classes, instâncias e objectos
Leituras com Scanner
2013/2014 Fundamentos de Programação 25