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.
Semana 9: toString, classes, instâncias e objectos, Scanner
1. Aula 9 Operação toString Classes, instâncias e objectos Leituras com Scanner
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 2
3. OperaçãotoString 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 3
4. Operação toString: exemplo publicclassRational { privatefinalintnumerator; privatefinalintdenominator; … @Override publicStringtoString() { returnnumerator + "/" + denominator; } … } Rational myRational = new Rational(1, 4); String myRationalAsString = myRational.toString(); 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 4 myRational myRationalAsString Deixamos claro que queremos que este método se sobreponha ao método por omissão. numerator = 1 denominator = 4 “1/4”
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 Introdução à Programação - DCTI - ISCTE-IUL 5 _ 1/4 _
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 Introdução à Programação - DCTI - ISCTE-IUL 6 r1 r2 r3 string 1/4 1/2 1/8 “1/4 × 1/2 = 1/8”
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 Introdução à Programação - DCTI - ISCTE-IUL 7
9. Exemplar concreto que obedece ao “molde” (classe) Exemplo Person luke = new Person("Luke", 1.81); booleanisTall = luke.isTall(); doubleheight = luke.getHeight(); String asString = luke.toString(); Instância/objecto 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 9 luke isTall height asString 1,81 m verdadeiro 1,81 Luke name = “Luke” height = 1,81 “Luke (1,81)”
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 Introdução à Programação - DCTI - ISCTE-IUL 10 Averell 2,10 m Avarell William Jack Jack William Joe 1,70 m daltons null null null null 1,90 m Joe 0 1 2 3 1,70 m
11. Matrizes de (referências para) objectos booleanjoeIsTall = daltons[3].isTall(); Stringname = daltons[1].getName(); 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 11 Averell 2,10 m Jack joeIsTall name William falso 1,70 m daltons 1,90 m Joe 0 1 2 3 “William” 1,70 m
12. Uma classe com um conjunto publicclass Gang { privateStringname; privateSet<Person> members; privatePersonlider; public Gang(finalStringname) { this.name=name; this.members= newHashSet<Person>(); this.lider = null; } publicvoidadd(finalPersonnewMember) { members.add(newMember); } publicvoidsetLiderTo(finalPersonnewLider) { members.add(newLider); lider = newLider; } publicStringtoString() { return"Gang {Name: " + name + ", Members: " + members + ", Lider: " + lider + "}"; } … } 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 12 Conjunto de Person. Os conjuntos não permitem membros repetidos. Hã? A ver mais tarde.
13. Uma classe com um conjunto Person 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 Introdução à Programação - DCTI - ISCTE-IUL 13 _ Gang {Name: Dalton, Members: [Joe (1.5), Avarell (2.1), Jack (1.7), William (1.9)], Lider: Joe (1.5)} _
14. Uma classe com um conjunto publicclass Gang { privateStringname; privateSet<Person> members; privatePersonlider; … publicdoubleaverageHeight() { doublesumOfHeights = 0.0; for (Person member : members) sumOfHeights += member.getHeight(); return sumOfHeights / members.size(); } … } 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 14 Este ciclo atribui sucessivamente a member todas as referências guardadas nos itens da colecção members (que neste caso é um conjunto).
15. Uma classe com um conjunto Person 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 Introdução à Programação - DCTI - ISCTE-IUL 15 _ 1.7999999999999998 _
16. Uma classe com um conjunto publicclass Gang { privateStringname; privateSet<Person> members; privatePersonlider; … public Person shorterMember() { if (members.size() == 0) thrownewIllegalStateException("Illegal…"); doublesmallerHeight = Double.POSITIVE_INFINITY; Person shorterMember = null; for (Person member : members) if (member.getHeight() < smallerHeight) { smallerHeight = member.getHeight(); shorterMember = member; } returnshorterMember; } … } 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 16
17. Uma classe com um conjunto Person 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 Introdução à Programação - DCTI - ISCTE-IUL 17 _ Joe (1.5) _
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 importjava.util.Scanner; 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 18
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 importjava.util.Scanner; publicclassSomeClass { … publicstatic voidmain(final String[] args) { Scannerscanner = newScanner(…); … } … } 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 19 Construção de um novo Scanner.
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); Stringline = inputScanner.nextLine(); 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 20
21. Classe Scanner: leitura de palavras de uma cadeia String sentence = "one two three four five "; Scanner stringScanner = new Scanner(sentence); intnumberOfWords = 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 Introdução à Programação - DCTI - ISCTE-IUL 21 _ Read 5 words. _ Read 5 words. Invertedsentence: fivefourthreetwoone _
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 Scanner 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 22
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 23
24. Sumário Operação toString Classes, instâncias e objectos Leituras com Scanner 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 24