Aula 9Operação toStringClasses, instâncias e objectosLeituras com Scanner
Da aula anterior…Classes e instânciasInstanciaçãoMembrosFunções vs. procedimentosTipos de referência vs. tipos de valorTipos primitivos vs. restante tipos (em Java)Igualdade vs. identidadeCadeias de caracteres com a classe String2010/2011Introdução à Programação - DCTI - ISCTE-IUL2
OperaçãotoStringDisponível em todas as classes JavaDevolve representação textual (String) da instância a que se aplicaDefinição por omissão é pouco interessanteNecessário sobrepor nosso próprio método2010/2011Introdução à Programação - DCTI - ISCTE-IUL3
Operação toString: exemplopublicclassRational {privatefinalintnumerator;privatefinalintdenominator;    …@OverridepublicStringtoString() {returnnumerator + "/" +denominator;    }    …}Rational myRational =new Rational(1, 4);String myRationalAsString = myRational.toString();2010/2011Introdução à Programação - DCTI - ISCTE-IUL4myRationalmyRationalAsStringDeixamos claro que queremos que este método se sobreponha ao método por omissão.numerator = 1denominator = 4“1/4”
toString e System.out.print*Métodos System.out.print* invocam toString automaticamenteExemploRational myRational = new Rational(1, 4);System.out.println(myRational);2010/2011Introdução à Programação - DCTI - ISCTE-IUL5_1/4_
toString e concatenaçãoOperador + com String e referência para instância de classe: operação toString invocada automaticamenteExemploRational r1 = new Rational(1, 4);Rational r2 = new Rational(1, 2);Rational r3 = r1.multipliedBy(r2);String string = r1 + " × " + r2 + " = " + r3;2010/2011Introdução à Programação - DCTI - ISCTE-IUL6r1r2r3string1/41/21/8“1/4 × 1/2 = 1/8”
Classes: instâncias e objectosClasse é “molde” para construção de instâncias/objectos com características determinadasClasse de valorIgualdade é relevanteIdentidade irrelevanteResultado da construção: instânciaExemplo: RationalClasse de referênciaIdentidade é relevanteIgualdade pouco importanteResultado da construção: objectoExemplo: Pessoa2010/2011Introdução à Programação - DCTI - ISCTE-IUL7
Classe PersonpublicclassPerson {privateStringname;privatedoubleheight;publicPerson(finalStringname, finaldoubleheight) {this.name=name;this.height= height;   }publicStringgetName() {returnname;   }publicdoublegetHeight() {returnheight;   }publicbooleanisTall() {return 1.8 <= getHeight();   }@OverridepublicStringtoString() {returngetName() + " (" + getHeight() + ")";   }}2010/2011Introdução à Programação - DCTI - ISCTE-IUL8
Exemplar concreto que obedece ao “molde” (classe)ExemploPerson luke = new Person("Luke", 1.81);booleanisTall = luke.isTall();doubleheight = luke.getHeight();String asString = luke.toString();Instância/objecto2010/2011Introdução à Programação - DCTI - ISCTE-IUL9lukeisTallheightasString1,81 mverdadeiro1,81Lukename = “Luke”height = 1,81“Luke (1,81)”
Matrizes de (referências para) objectosÉ possível ter matrizes de referências para objectos de uma classeExemploPerson[] 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/2011Introdução à Programação - DCTI - ISCTE-IUL10Averell2,10 mAvarellWilliamJackJackWilliamJoe1,70 mdaltonsnullnullnullnull1,90 mJoe01231,70 m
Matrizes de (referências para) objectosbooleanjoeIsTall = daltons[3].isTall();Stringname = daltons[1].getName();2010/2011Introdução à Programação - DCTI - ISCTE-IUL11Averell2,10 mJackjoeIsTallnameWilliamfalso1,70 mdaltons1,90 mJoe0123“William”1,70 m
Uma classe com um conjuntopublicclass 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/2011Introdução à Programação - DCTI - ISCTE-IUL12Conjunto de Person. Os conjuntos não permitem membros repetidos.Hã? A ver mais tarde. 
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/2011Introdução à Programação - DCTI - ISCTE-IUL13_Gang {Name: Dalton, Members: [Joe (1.5), Avarell (2.1), Jack (1.7), William (1.9)], Lider: Joe (1.5)}_
Uma classe com um conjuntopublicclass Gang {privateStringname;privateSet<Person> members;privatePersonlider;    …publicdoubleaverageHeight() {doublesumOfHeights = 0.0;for (Person member : members)sumOfHeights += member.getHeight();        return sumOfHeights / members.size();    }    …}2010/2011Introdução à Programação - DCTI - ISCTE-IUL14Este ciclo atribui sucessivamente a member todas as referências guardadas nos itens da colecção members (que neste caso é um conjunto).
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/2011Introdução à Programação - DCTI - ISCTE-IUL15_1.7999999999999998_
Uma classe com um conjuntopublicclass 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/2011Introdução à Programação - DCTI - ISCTE-IUL16
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/2011Introdução à Programação - DCTI - ISCTE-IUL17_Joe (1.5)_
Classe ScannerSimplifica leitura de texto a partir deteclado (interacção com o utilizador)cadeia de caracteres (instância de String)arquivo…Nome completo: java.util.ScannerUsar apenas Scanner implicaimportjava.util.Scanner;2010/2011Introdução à Programação - DCTI - ISCTE-IUL18
Importação e instanciação de ScannerUsa-se declaração de importaçãoDeclaração de importação antes das restantes definiçõesimportjava.util.Scanner;publicclassSomeClass {   …publicstaticvoidmain(final String[] args) {Scannerscanner =newScanner(…);      …      }   …}2010/2011Introdução à Programação - DCTI - ISCTE-IUL19Construção de um novo Scanner.
Classe Scanner: leitura de linha do tecladoConstrutor com java.lang.System.in para ler do tecladoOperação nextLinebloqueia até próximo <enter>devolve texto introduzido até <enter>ExemploScanner inputScanner =new Scanner(System.in);Stringline =    inputScanner.nextLine();2010/2011Introdução à Programação - DCTI - ISCTE-IUL20
Classe Scanner: leitura de palavras de uma cadeiaString 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/2011Introdução à Programação - DCTI - ISCTE-IUL21_Read 5 words._Read 5 words.Invertedsentence: fivefourthreetwoone_
A reterClassesOperação toStringObjectos vs. instânciasClasses de valor vs. classes de referênciaClasses como moldesInstanciaçãoExemplosConjuntos, colecções e ciclo for-eachLeituras com Scanner2010/2011Introdução à Programação - DCTI - ISCTE-IUL22
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-62010/2011Introdução à Programação - DCTI - ISCTE-IUL23
SumárioOperação toStringClasses, instâncias e objectosLeituras com Scanner2010/2011Introdução à Programação - DCTI - ISCTE-IUL24

Semana 9: toString, classes, instâncias e objectos, Scanner

  • 1.
    Aula 9Operação toStringClasses,instâncias e objectosLeituras com Scanner
  • 2.
    Da aula anterior…Classese instânciasInstanciaçãoMembrosFunções vs. procedimentosTipos de referência vs. tipos de valorTipos primitivos vs. restante tipos (em Java)Igualdade vs. identidadeCadeias de caracteres com a classe String2010/2011Introdução à Programação - DCTI - ISCTE-IUL2
  • 3.
    OperaçãotoStringDisponível em todasas classes JavaDevolve representação textual (String) da instância a que se aplicaDefinição por omissão é pouco interessanteNecessário sobrepor nosso próprio método2010/2011Introdução à Programação - DCTI - ISCTE-IUL3
  • 4.
    Operação toString: exemplopublicclassRational{privatefinalintnumerator;privatefinalintdenominator; …@OverridepublicStringtoString() {returnnumerator + "/" +denominator; } …}Rational myRational =new Rational(1, 4);String myRationalAsString = myRational.toString();2010/2011Introdução à Programação - DCTI - ISCTE-IUL4myRationalmyRationalAsStringDeixamos claro que queremos que este método se sobreponha ao método por omissão.numerator = 1denominator = 4“1/4”
  • 5.
    toString e System.out.print*MétodosSystem.out.print* invocam toString automaticamenteExemploRational myRational = new Rational(1, 4);System.out.println(myRational);2010/2011Introdução à Programação - DCTI - ISCTE-IUL5_1/4_
  • 6.
    toString e concatenaçãoOperador+ com String e referência para instância de classe: operação toString invocada automaticamenteExemploRational r1 = new Rational(1, 4);Rational r2 = new Rational(1, 2);Rational r3 = r1.multipliedBy(r2);String string = r1 + " × " + r2 + " = " + r3;2010/2011Introdução à Programação - DCTI - ISCTE-IUL6r1r2r3string1/41/21/8“1/4 × 1/2 = 1/8”
  • 7.
    Classes: instâncias eobjectosClasse é “molde” para construção de instâncias/objectos com características determinadasClasse de valorIgualdade é relevanteIdentidade irrelevanteResultado da construção: instânciaExemplo: RationalClasse de referênciaIdentidade é relevanteIgualdade pouco importanteResultado da construção: objectoExemplo: Pessoa2010/2011Introdução à Programação - DCTI - ISCTE-IUL7
  • 8.
    Classe PersonpublicclassPerson {privateStringname;privatedoubleheight;publicPerson(finalStringname,finaldoubleheight) {this.name=name;this.height= height; }publicStringgetName() {returnname; }publicdoublegetHeight() {returnheight; }publicbooleanisTall() {return 1.8 <= getHeight(); }@OverridepublicStringtoString() {returngetName() + " (" + getHeight() + ")"; }}2010/2011Introdução à Programação - DCTI - ISCTE-IUL8
  • 9.
    Exemplar concreto queobedece ao “molde” (classe)ExemploPerson luke = new Person("Luke", 1.81);booleanisTall = luke.isTall();doubleheight = luke.getHeight();String asString = luke.toString();Instância/objecto2010/2011Introdução à Programação - DCTI - ISCTE-IUL9lukeisTallheightasString1,81 mverdadeiro1,81Lukename = “Luke”height = 1,81“Luke (1,81)”
  • 10.
    Matrizes de (referênciaspara) objectosÉ possível ter matrizes de referências para objectos de uma classeExemploPerson[] 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/2011Introdução à Programação - DCTI - ISCTE-IUL10Averell2,10 mAvarellWilliamJackJackWilliamJoe1,70 mdaltonsnullnullnullnull1,90 mJoe01231,70 m
  • 11.
    Matrizes de (referênciaspara) objectosbooleanjoeIsTall = daltons[3].isTall();Stringname = daltons[1].getName();2010/2011Introdução à Programação - DCTI - ISCTE-IUL11Averell2,10 mJackjoeIsTallnameWilliamfalso1,70 mdaltons1,90 mJoe0123“William”1,70 m
  • 12.
    Uma classe comum conjuntopublicclass 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/2011Introdução à Programação - DCTI - ISCTE-IUL12Conjunto de Person. Os conjuntos não permitem membros repetidos.Hã? A ver mais tarde. 
  • 13.
    Uma classe comum 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/2011Introdução à Programação - DCTI - ISCTE-IUL13_Gang {Name: Dalton, Members: [Joe (1.5), Avarell (2.1), Jack (1.7), William (1.9)], Lider: Joe (1.5)}_
  • 14.
    Uma classe comum conjuntopublicclass Gang {privateStringname;privateSet<Person> members;privatePersonlider; …publicdoubleaverageHeight() {doublesumOfHeights = 0.0;for (Person member : members)sumOfHeights += member.getHeight(); return sumOfHeights / members.size(); } …}2010/2011Introdução à Programação - DCTI - ISCTE-IUL14Este ciclo atribui sucessivamente a member todas as referências guardadas nos itens da colecção members (que neste caso é um conjunto).
  • 15.
    Uma classe comum 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/2011Introdução à Programação - DCTI - ISCTE-IUL15_1.7999999999999998_
  • 16.
    Uma classe comum conjuntopublicclass 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/2011Introdução à Programação - DCTI - ISCTE-IUL16
  • 17.
    Uma classe comum 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/2011Introdução à Programação - DCTI - ISCTE-IUL17_Joe (1.5)_
  • 18.
    Classe ScannerSimplifica leiturade texto a partir deteclado (interacção com o utilizador)cadeia de caracteres (instância de String)arquivo…Nome completo: java.util.ScannerUsar apenas Scanner implicaimportjava.util.Scanner;2010/2011Introdução à Programação - DCTI - ISCTE-IUL18
  • 19.
    Importação e instanciaçãode ScannerUsa-se declaração de importaçãoDeclaração de importação antes das restantes definiçõesimportjava.util.Scanner;publicclassSomeClass { …publicstaticvoidmain(final String[] args) {Scannerscanner =newScanner(…); … } …}2010/2011Introdução à Programação - DCTI - ISCTE-IUL19Construção de um novo Scanner.
  • 20.
    Classe Scanner: leiturade linha do tecladoConstrutor com java.lang.System.in para ler do tecladoOperação nextLinebloqueia até próximo <enter>devolve texto introduzido até <enter>ExemploScanner inputScanner =new Scanner(System.in);Stringline = inputScanner.nextLine();2010/2011Introdução à Programação - DCTI - ISCTE-IUL20
  • 21.
    Classe Scanner: leiturade palavras de uma cadeiaString 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/2011Introdução à Programação - DCTI - ISCTE-IUL21_Read 5 words._Read 5 words.Invertedsentence: fivefourthreetwoone_
  • 22.
    A reterClassesOperação toStringObjectosvs. instânciasClasses de valor vs. classes de referênciaClasses como moldesInstanciaçãoExemplosConjuntos, colecções e ciclo for-eachLeituras com Scanner2010/2011Introdução à Programação - DCTI - ISCTE-IUL22
  • 23.
    A ler...Capítulos 8e 9 do livro:Y. Daniel Liang, Introduction to Java Programming, 8.ª edição, Prentice-Hall, 2010. ISBN: 978-0-13-213080-62010/2011Introdução à Programação - DCTI - ISCTE-IUL23
  • 24.
    SumárioOperação toStringClasses, instânciase objectosLeituras com Scanner2010/2011Introdução à Programação - DCTI - ISCTE-IUL24