Capítulo 2 - Iniciar com o Java (PDF)
Document Details
Uploaded by Deleted User
Tags
Related
- Topic 1.6 Running Program with Objects PDF
- CS0070 Object-Oriented Programming Module 1 PDF
- Object Oriented Programming (2nd Year 1st Sem) PDF
- Introduction to Java Programming and Data Structures (2019) by Y. Daniel Liang - PDF
- VILLASAN Object-Oriented Programming PDF
- Introduction To Object Oriented Programming PDF
Summary
Este documento fornece introdução ao desenvolvimento de aplicações Java com foco em conceitos de programação orientada a objetos. Ilustra a declaração e criação de objetos, com exemplos de uso de classes padrão, como JFrame, Date e String. Os elementos básicos de um programa Java são apresentados, incluindo comentários, declarações e importações. O documento mostra e explica um exemplo de código.
Full Transcript
Capítulo 2 Começar com o Java 1 Objectivos Depois de ler e estudar este capítulo, deverá ser capaz de: Identificar os componentes básicos de um programa em Java Escrever programas simples em Java Descrever a diferença entre declaração e c...
Capítulo 2 Começar com o Java 1 Objectivos Depois de ler e estudar este capítulo, deverá ser capaz de: Identificar os componentes básicos de um programa em Java Escrever programas simples em Java Descrever a diferença entre declaração e criação de objetos Descrever o processo de criação e execução de programas em Java Utilizar as classes padrão Date, SimpleDateFormat, String e Scanner Desenvolver programas em Java, usando a abordagem de desenvolvimento incremental 2 O primeiro programa Java O principal conceito da POO ilustrado pelo programa: Um programa orientado a objetos utiliza objetos Este programa exibe uma janela no ecrã. O tamanho da janela está definido para 300 pixeis de largura e 200 pixeis de altura. O seu título está definido como My First Java Program. 3 Programa Ch2Sample1 import javax.swing.*; class Ch2Sample1 { public static void main(String[ ] args) { JFrame myWindow; Declara um nome myWindow = new JFrame( ); Cria um objeto myWindow.setSize(300, 200); myWindow.setTitle("My First Java Program"); myWindow.setVisible(true); } } Usa um objeto 4 Diagrama do programa Ch2Sample1 Ch2Sample1 setSize(300, 200) setTitle("My First Java Program") myWindow : JFrame (tru e) setVisible 5 Relação de dependência Ch2Sample1 myWindow : JFrame Em vez de desenhar todas as mensagens, resumimo-las mostrando apenas a relação de dependência. O diagrama mostra que Ch2Sample1 "depende" do serviço fornecido por myWindow. 6 Declaração de objectos Nome da classe Esta classe tem de ser/ Nome do objecto estar definida antes desta o objecto é declarado aqui declaração poder ser feita. JFrame myWindow; Account customer; Mais Student jan, jim, Exemplos jon; Vehicle car1, car2; 7 Criação de objectos Nome da classe Name Argumentos Nome do objecto Uma instância desta Neste caso não há Nome do objecto que classe será criada argumentos vamos criar. myWindow = new JFrame ( ); customer = new Customer( ); Mais jon = new Student("John Java"); Exemplos car1 = new Vehicle( ); 8 Declaração vs. Criação 1 Cliente c; 2 c = new Cliente( ); 1 c 1. Declara-se o nome “c” e reserva-se memória (espaço para uma “referência”). 2. Cria-se um objeto “Cliente” e coloca-se uma referência a este no nome “c”. : Cliente 2 9 Estado da Memória vs. Programa cliente cliente : Cliente : Cliente Notação de “estado- Notação de diagrama de de-memória” programa 10 Nomes vs. Objectos Cliente cliente; cliente = new Cliente( ); cliente = new Cliente( ); cliente : Cliente Criado com o segundo new. Criado com o A referência ao primeiro : Cliente objecto Cliente é perdida primeiro new. Enviar mensagens Nome do método Argumentos Nome do objecto Nome da mensagem que Os argumentos que Nome do objecto ao qual estamos a enviar. estamos a passar com a enviamos a mensagem mensagem. myWindow. setVisible ( true ) ; conta.deposito (200.0); Mais estudante.definirNome ("zé"); exemplos carro1.ligarMotor (); 12 Fluxo de Execução código Diagrama do estado da memória myWindow JFrame myWindow; : JFrame myWindow = new JFrame( ); myWindow.setSize(300, 200); width 300 myWindow.setTitle ("My First Java Program"); height 200 myWindow.setVisible(true); title My First Java … visible true Só são mostrados alguns (4) dos membros de dados (variáveis de instância) dum objeto JFrame. 13 Componentes dum programa Um programa Java é composto de – comentários, – declarações import , e – declarações de classes. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 2 - 14 Componente: Comentário import javax.swing.*; class Ch2Sample1 { public static void main(String[ ] args) { JFrame myWindow; comentário myWindow = new JFrame( ); myWindow.setSize(300, 200); myWindow.setTitle("My First Java Program"); myWindow.setVisible(true); } } 15 Correspondência de marcadores de comentários Erro: Falta a abertura */ do comentário. 16 Três tipos de comentários // This is a comment // This is another comment Comentário até ao fim da linha // This is a third comment 17 Declaração de importação declaração import javax.swing.*; de importação class Ch2Sample1 { public static void main(String[ ] args) { JFrame myWindow; myWindow = new JFrame( ); myWindow.setSize(300, 200); myWindow.setTitle("My First Java Program"); myWindow.setVisible(true); } } 18 Sintaxe e semântica das declarações de importação Nome do Package Nome da Classe Nome do package que O nome da classe que queremos contem as classes que importar. Usamos um asterisco, queremos importar. quando queremos importar todas.. ; e.g. dorm. Resident; import javax.swing.JFrame; Mais import java.util.*; Exemplos import com.drcaffeine.simplegui.*; 19 Declaração de classes import javax.swing.*; class Ch2Sample1 { public static void main(String[ ] args) { JFrame myWindow; myWindow = new JFrame( ); myWindow.setSize(300, 200); myWindow.setTitle("My First Java Program"); myWindow.setVisible(true); } } 20 Declaração de métodos dum método import javax.swing.*; class Ch2Sample1 { public static void main(String[ ] args) { JFrame myWindow; myWindow = new JFrame( ); myWindow.setSize(300, 200); myWindow.setTitle("My First Java Program"); myWindow.setVisible(true); } } 21 Elementos da declaração de métodos Modificador Modificador Tipo do retorno Nome do Método Parametros public static void main( String[ ] args ){ JFrame myWindow; myWindow = new JFrame( ); Corpo do método myWindow.setSize(300, 200); myWindow.setTitle("My First Java Program"); myWindow.setVisible(true); } 22 Template para Programas elementares em Java import javax.swing.*; Declarações de class Ch2Sample1 { importação public static void main(String[ ] args) { Nome da JFrame myWindow; classe myWindow = new JFrame( ); myWindow.setSize(300, 200); Corpo do main myWindow.setTitle( "My First Java Program"); myWindow.setVisible(true); } } 23 Por que usar classes padrão? Não precisamos de reinventar a roda. Quando existirem objetos existentes que satisfaçam nossas necessidades, vamos usá-los! Aprender a usar classes Java padrão é o primeiro passo para dominar a POO. Antes de podermos aprender a definir as nossas próprias classes, precisamos de aprender a utilizar as classes existentes Apresentaremos aqui quatro classes padrão: - Scanner - String - Date - SimpleDateFormat. 24 Standard Output Usar o print do System.out (uma instância da classe PrintStream ) é a maneira mais simples de mostrar ao utilizador o resultado da computação System.out.print(“Hello World”); O resultado aparece Hello world na janela da consola. O aspeto real da janela da consola varia consoante a ferramenta Java utilizada 25 Uso do método print O método print continua o display a partir do último display efectuado System.out.print("How do you do? "); System.out.print("My name is "); System.out.print("Jon Java. "); How do you do? My name is Jon Java. 26 Using the println Method O método println muda de linha, após realizar o display do seu argumento. System.out.println("How do you do? "); System.out.println("My name is "); System.out.println("Jon Java. "); How do you do? My name is O argumento do Jon Java. System.out.print é um objecto String 27 String A classe String classe implementa as sequências de caracteres. Uma sequência de caracteres entre “aspas” é uma constante da classe String. Existem aproximadamente 50 métodos definidos na class String. Iremos introduzir 3 deles: substring, length, and indexOf. Iremos também introduzir uma operação entre strings denominada concatenação. 28 As Strings são Objectos 1 String nome; 2 nome = new String ("Jon Java"); nome 1. O identificador nome é 1 declarado e é alocado o respectivo espaço em memória. : String 2 2. O objecto String é criado e Jon Java o identificador nome referencia o objecto 29 Indexação de Strings A posição, ou índice, do primeiro caracter é 0. 30 Definição de substring Assuma-se str um objecto String e correctamente inicializado (não nulo) str.substring (i, j) retorna uma nova String por extração dos caracteres de str desde a posição i até j-1 onde 0 ≤ i < comprimento de str, 0 < j ≤ comprimento de str, and i ≤ j. Se str fôr "programming" , então str.substring (3,7) cria uma nova string cujo valor é "gram" pois g é o caracter na posição 3 e m é o caracter na posição 6. A string original, str , mantém-se inalterada. 31 Exemplos: substring String text = "Expresso"; text.substring(6,8) "so" text.substring(0,8) "Expresso" text.substring(1,5) "xpre" text.substring(3,3) "" text.substring(4,2) error 32 Definição de: length Assuma-se str um objecto String e correctamente inicializado. str.length () retorna o número de caracteres da string str. Se str fôr "programming" , então str.length () retorna 11 porque existem 11 characters na string. A string original, str , mantém-se inalterada. 33 Exemplos: length String str1, str2, str3, str4; str1 = "Hello" ; str2 = "Java" ; str3 = "" ; //empty string str4 = " " ; //one space str1.length( ) 5 str2.length( ) 4 str3.length( ) 0 str4.length( ) 1 34 Definição: indexOf Assuma-se que str e substr são objectos String e estão correctamente inicializamos. str.indexOf (substr) retorna a posição de str em ocorre pela primeira vez substr. Se str fôr "programming" e substr fôr "gram" , então str.indexOf (substr) retorna 3 porque 3 é a posição de str onde a 1ª ocorrência de substr ocorre em str is 3. Se substr não ocorre em str, é retornado o valor –1. Esta pesquisa é sensível a maiúsculas e minúsculas. 35 Exemplos: indexOf String str; str = "I Love Java and Java loves me." ; 3 7 21 str.indexOf( "J" ) 7 str.indexOf( "love" ) 21 str. indexOf( "ove" ) 3 str. indexOf( "Me" ) -1 36 Definição: concatenação Assumam-se str1 e str2 dois objectos String correctamente inicializamos. str1 + str2 irá retornar uma nova string que é a concatenação das duas strings. Se str1 fôr "pro" e str2 fôr "gram" , então str1 + str2 retorna "program". De salientar que + é um operador e não um método da classe String (sintacticamente). As strings str1 e str2 mantêm-se inalteradas. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 2 - 37 Exemplos: concatenação String str1, str2; str1 = "Jon" ; str2 = "Java" ; str1 + str2 "JonJava" str1 + " " + str2 "Jon Java" str2 + ", " + str1 "Java, Jon" "Are you " + str1 + "?" "Are you Jon?" 38 Date A classe Date do pacote java.util é utilizada para representar uma data. Quando um objeto Date é criado, é definido como hoje (a data atual definida no computador) A classe tem o método toString que converte o formato interno numa string Date today; today = new Date (); today.toString (); "Wed Feb 27 08:54:44 WET 2019" 39 SimpleDateFormat A classe SimpleDateFormat do package java.text permite apresentar que um objecto Date seja apresentado com vários formatos. A tabela 2.1 na página 62 apresenta algumas opções de formatos. import java.text.*; Date today = new Date( ); SimpleDateFormat sdf1, sdf2; sdf1 = new SimpleDateFormat( "MM/dd/yy" ); sdf2 = new SimpleDateFormat( "MMMM dd, yyyy" ); sdf1.format(today); "02/27/19" sdf2.format(today); "February 27, 2019" 40 Standard Input A utilização de um objeto Scanner é uma forma simples de introduzir dados a partir da entrada padrão System.in, que aceita a entrada a partir do teclado. Primeiro, precisamos de associar um objeto Scanner a System.in da seguinte forma: import java.util.Scanner; Scanner scanner; scanner = new Scanner(System.in); 41 Leitura do Standard Input Depois de o objeto Scanner estar configurado, podemos ler dados. Leitura dum nome próprio (String): System.out.print ("Enter your first name: "); String firstName = scanner.next(); System.out.println("Nice to meet you, " + firstName + "."); Enter your first name: Manel ENTER 1. É apresentado o Nice to meet you, Manel. prompt 2. É feita uma entrada de dados 3. É apresentado o resultado 42 Especificação do problema Problema: Escreva uma programa que leia o nome próprio e dois apelidos e apresente as iniciais dos nomes lidos Exemplo: input: Marcelo Rebelo Sousa output: MRS 43 Plano Geral Identificar as principais tarefas que o programa deve realizar. Precisamos de saber o que desenvolver antes de desenvolvermos! Tarefas: – Obter o nome, o nome do meio e o apelido do utilizador – Extrair as iniciais e criar o monograma – Mostrar o monograma 44 Etapas de desenvolvimento Vamos desenvolver este programa em duas etapas: 1. Começar com o modelo de programa e adicionar o código necessário para realizar a entrada de dados 2. Adicionar o código necessário para gerar e apresentar o monograma 45 Ficamos por aqui!! 46 Capítulo 3 Tipos Numéricos ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 3 - 1 Objectivos No final da aula deverá: Selecionar os tipos correctos correspondentes a dados numéricos Escrever expressões aritméticas em Java Avaliar expressões aritméticas usando as regras de precedência Descrever como funciona a alocação de memória para tipos primitivos e para objectos Escrever expressões matemáticas usando métodos da classe Math Gerar números aleatórios Usar a classe GregorianCalendar e manipular informação associada às datas: dia, mes, ano Usar a classe DecimalFormat para formatar dados numéricos Ler/Escrever tipos numéricos usando System.in e System.out 2 Manipular números Em java para somar o número x com o número y, fazemos x + y Não sem antes declarar as variáveis x e y: A declaração pode ser feita int x, y; ou int x; int y; Variáveis Quando é feita uma declaração, é alocado espaço em memória, que irá guardar os valores das variáveis x e y x e y são variáveis. Uma variável tem 3 características: – Uma zona de memória para armazenar o seu valor, – O tipo de dados que será armazenado nessa localização – O nome usado para referir essa localização de memória Exemplos de declarações de variáveis: int x; int v, w, y; Tipos de dados numéricos Existem seis tipos de dados numéricos(tipos primitivos): byte, short, int, long, float, e double. Exemplos de declarações: int i, j, k; float numberOne, numberTwo; long bigInteger; double bigNumber; No momento da declaração, uma variável pode também ser inicializada. Por exemplo, podemos inicializar as variáveis inteiras count e height com 10 e 34 respectivamente int count = 10, height = 34; 5 Precisão Os 6 tipos de dados diferem entre si da precisão com que os dados são armazenados em memória. 6 Declaração de atribuição/afectação Atribuímos um valor a uma variável usando declarações de atribuição (assignment statements). Sintaxe = ; Exemplos: sum = firstNumber + secondNumber; avg = (one + two + three) / 3.0; 7 Declaração e Afetação de Tipos Primitivos A. As variáveis são alocadas na memória. firstNumber 234 A int firstNumber, secondNumber; secondNumber 87 firstNumber = 234; secondNumber = 87; B B. Os valores são afetados às variáveis. Código Estado da Memória 8 Afetação de Valores Numéricos number 35 237 A. A variável é alocada na int number; A memória. number = 237; B B. Afeta-se o valor 237 à variável number = 35; C number. C. O valor 35 substitui o valor 237. Código Estado da Memória 9 Afetação de Objetos cliente Custo Custo mer mer A Customer cliente; B A. é atribuída memória para a variável/objecto cliente. cliente = new Customer(); B. A referência ao novo cliente = new Customer(); objeto é guardada em cliente. C. A referência a outro novo C objeto também é guardada em cliente, esmagando a anterior Código Estado da Memória 10 Duas Referências ao mesmo Objeto manel jaquim A Custo mer Customer manel, jaquim, B A. Variables are allocated in memory. manel = new Customer(); jaquim = manel; B. The reference to the new object is assigned to manel. C C. The reference in manel is assigned to Joaquim. Código Estado da Memória 11 Tipos Primitivos vs. Referências Tipos da dados numéricos são chamados Tipos de dados Primitivos. Objectos são chamados tipos de dados referenciados, porque o seu conteúdo é um endereço que referencia a localização de memória onde foi guardado o objecto. 12 Operadores aritméticos A tabela sumária os operadores aritméticos disponíveis no Java. É uma divisão inteira, sendo truncada a parte decimal. 13 Expressões Aritméticas Qual a avaliação da expressão ? x + 3 * y R: x é adicionado a 3*y. A ordem utilizada na avaliação de expressões é determinada por regras de precedência. Operadores com maior precedência serão avaliados primeiro que operadores de precedência menor. Se dois operadores têm a mesma precedência, são avaliados da esquerda para a direita. 14 Precedence Rules 15 Type Casting molde Se x é um float e y é um int, qual o tipo da seguinte expressão? x * y R:é float. A expressão acima chama-se uma expressão mista. O tipo dos operandos numa expressão mista é convertido com base em regras de promoção As regras de promoção garantem que o tipo duma expressão é o mesmo do operando que tenha maior precisão. 16 Casting/Conversão explícita de Tipos Em vez de nos basearmos nas regras de promoção, podemos fazer uma conversão explícita de tipo, prefixando o operando com o tipo, utilizando a seguinte sintaxe: ( ) Exemplo Converter o tipo de x a (float) x / 3 float e dividí-lo por 3. Converter o resultado da (int) (x / y * 3.0) expressão x / y * 3.0 ao tipo int. 17 Conversão implícita de Tipo Considerando a expressão: double x = 3 + 5; O resultado de 3 + 5 é do tipo int. Contudo, como a variável x é double, o valor 8 (do tipo int) é promovido a 8.0 (tipo double) antes de ser atribuído a x. Trata-se duma promoção. As despromoções não são permitidas. int x = 3.5; Um valor com maior precisão não pode ser atribuído a uma variável de menor precisão. 18 Constantes É possível modificar o valor duma variável. Se queremos um valor imutável, usamos constantes. final double PI = 3.14159; final int MONTH_IN_YEAR = 12; final short FARADAY_CONSTANT = 23060; A palavra reservada Isto são constantes , chamam-se literais final é usada para chamadas constantes definir constantes. (constantes). nomeadas. 19 Display de valores numéricos No capítulo 2, mostrámos como realizar o display de texto (String) no standard output Usamos os mesmos métodos print and println para visualizar no standard output os valores numéricos. int num = 15; System.out.print(num); //print a variable System.out.print(" "); //print a string System.out.print(10); //print a constant 15 10 20 (overloaded)Sobre-carregamento do Operador + O operador + pode referir dois tipos de operação, dependendo do contexto. + é uma adição se ambos os operandos são números. Caso algum dos operandos seja uma String, então é uma concatenação. Avaliação ocorre da esquerda para a direita. output = “test” + 1 + 2; output = 1 + 2 + “test”; 21 Sample Code Fragment //code fragment to input radius and output //area and circumference final double PI = 3.14159; double radius, area, circumference; //compute area and circumference area = PI * radius * radius; circumference = 2.0 * PI * radius; System.out.println("Given Radius: " + radius); System.out.println("Area: " + area); System.out.println("Circumference: “ + circumference); 22 A classe DecimalFormat Uso do objecto DecimalFormat para formatar um output numérico. double num = 123.45789345; DecimalFormat df = new DecimalFormat(“0.000”); //three decimal places System.out.print(num); 123.45789345 System.out.print(df.format(num)); 123.458 23 Leitura Stdin de dados numéricos No cap. 2, aprendemos a ler strings do standard input, usando a classe Scanner. Podemos usar a mesma classe para ler valores numéricos Scanner scanner = new Scanner(System.in); int age; System.out.print( “Enter your age: “ ); age = scanner.nextInt(); 24 Métodos da classe Scanner Método Exemplo nextByte( ) byte b = scanner.nextByte( ); nextDouble( ) double d = scanner.nextDouble( ); nextFloat( ) float f = scanner.nextFloat( ); nextInt( ) int i = scanner.nextInt( ); nextLong( ) long l = scanner.nextLong( ); nextShort( ) short s = scanner.nextShort( ); next() String str = scanner.next(); 25 A classe Math A classe Math do package java.lang contem métodos de classe frequentemente identificados com funções matemáticas double num, x, y; x = …; y = …; num = Math.sqrt(Math.max(x, y) + 12.4); 26 Alguns métodos da classe Math Método Descrição exp(a) Número e elevado a a. log(a) logaritmo (base e) de a. floor(a) Maior número inteiro 0) break; System.out.println("Invalid Entry." + "You must enter at least one character."); } ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 6 - 21 Pitfalls for Loop-and-a-Half Control Be aware of two concerns when using the loop- and-a-half control: – The danger of an infinite loop. The boolean expression of the while statement is true, which will always evaluate to true. If we forget to include an if statement to break out of the loop, it will result in an infinite loop. – Multiple exit points. It is possible, although complex, to write a correct control loop with multiple exit points (breaks). It is good practice to enforce the one-entry one-exit control flow. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 6 - 22 The for Statement int i, sum = 0, number; for (i = 0; i < 20; i++) { number = scanner.nextInt( ); sum += number; } These statements are executed for 20 times ( i = 0, 1, 2, … , 19). ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 6 - 23 Syntax for the for Statement for ( ; ; ) Initialization Condition Reinitialization for ( i = 0 ; i < 20 ; i++ ) { number = scanner.nextInt(); Statement sum += number; (loop body) } ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 6 - 24 Control Flow of for i = 0; i < 20 ? false true number =... ; sum += number; i ++; ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 6 - 25 More for Loop Examples 1 for (int i = 0; i < 100; i += 5) i = 0, 5, 10, … , 95 2 for (int j = 2; j < 40; j *= 2) j = 2, 4, 8, 16, 32 3 for (int k = 100; k > 0; k--) ) k = 100, 99, 98, 97,..., 1 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 6 - 26 The Nested-for Statement Nesting a for statement inside another for statement is commonly used technique in programming. Let’s generate the following table using nested-for statement. Tabela de preços dos tapetes na casa “Aladino”: larguras possíveis : 11 até 20 comprimento: 5 até 25, mas de 5 em 5 o preço dum tapete é 19€ o m2 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 6 - 27 Generating the Table System.out.print(" "); for (int comp=5;comp Exemplos: System.out.println(a1.getClass()); class poli.A System.out.println(a2.getClass()); class poli.B O toString de Class retorna “Class” + o nome da mesma 89 operador Instanceof o operador instanceof, permite avaliar se determinada instância é pertença duma qualquer classe, subclasse ou interface Sintaxe ➡ instanceof System.out.println(a1 instanceof A); System.out.println(a2 instanceof A); System.out.println(a2 instanceof B); System.out.println(a1 instanceof Object); ➡ True para todas! A relação de herança é isA 90 método equals() O método equals definido em Object verifica unicamente a igualdade de endereços ➡ this==obj, para obj o parâmetro Qualquer classe bem comportada deverá redefinir este método, visto ser herdado A relação equals deverá ser de equivalência i.e. reflexiva, simétrica e transitiva. A comparação deverá ser feita campo a campo usando o operador == para tipos primitivos e equals para objectos 91 equals uma classe X !(o instanceof X) public boolean equals(Object o){ if (this==o) return true; if(o == null) || (o.getClass() !=this.getClass()) return false; //É de certeza um objecto da classe X X x=(X) o; return algoritmo de comparação } 92 equals para ponto2D public boolean equals(Object o){ if (this==o) return true; if(o == null) return false; if (o.getClass() !=this.getClass()) return false; Ponto2D p=(Ponto2D) o; return coordX==p.coordX && coordY==p.coordY; } 93 método clone O método clone tal como o equals deve ser redefinido nas classes implementadas A única diferença relativamente ao já exposto está na assinatura do método (modificador e tipo de retorno): ➡ protected Object clone() protected pode ser redefinido para public e o retorno é Object por razões óbvias public Object clone(){ return new Ponto2D(coordX,coordY); } 94 Abstract Superclasses and Abstract Methods When we define a superclass, we often do not need to create any instances of the superclass. Depending on whether we need to create instances of the superclass, we must define the class differently. We will study examples based on the Student superclass defined earlier. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 13 - 22 Definition: Abstract Class An abstract class is a class ➡ defined with the modifier abstract ➡ that contains an abstract method OR ➡ that does not provide an implementation of an inherited abstract method An abstract method is a method with the keyword abstract, and it ends with a semicolon instead of a method body. ➡ Private methods and static methods may not be declared abstract. No instances can be created from an abstract class. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 13 - 23 Case 1 Student Must Be Undergraduate or Graduate ➡ If a student must be either an undergraduate or a graduate student, we only need instances of UndergraduateStudent or GraduateStudent. ➡ Therefore, we must define the Student class so that no instances may be created of it. 97 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 13 - 24 Case 2 Student Does Not Have to Be Undergraduate or Graduate. In this case, we may design the Student class in one of two ways. ➡ We can make the Student class instantiable. ➡ We can leave the Student class abstract and add a third subclass, OtherStudent, to handle a student who does not fall into the UndergraduateStudent or GraduateStudent categories. 98 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 13 - 25 Which Approach to Use The best approach depends on the particular situation. When considering design options, we can ask ourselves which approach allows easier modification and extension. 99 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 13 - 26 Inheritance versus Interface The Java interface is used to share common behavior (only method headers) among the instances of different classes. public interface Iterator{ boolean hasNext(); E next(); void remove(); } Inheritance is used to share common code (including both data members and methods) among the instances of related classes. Classes will implement interfaces public class Another implements Iterator{ …. } 100 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 13 - 27 Inheritance versus Interface In your program designs, remember to use the Java interface to share common behaviour. Use inheritance to share common code. If an entity A is a specialized form of another entity B, then model them by using inheritance. Declare A as a subclass of B. 101 Chapter 8 _ 10 Exceptions and Collections ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8- 1 Objectives After you have read and studied this chapter, you should be able to ➡ Improve the reliability of code by incorporating exception- handling. ➡ Write methods that propagate exceptions. ➡ Implement the try-catch blocks for catching and handling exceptions. ➡ Write programmer-defined exception classes. ➡ Distinguish the checked and unchecked, or runtime, exceptions. 104 Definition An exception represents an error condition that can occur during the normal course of program execution. When an exception occurs, or is thrown, the normal sequence of flow is terminated. The exception-handling routine is then executed; we say the thrown exception is caught. 105 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 3 Not Catching Exceptions Scanner scanner = new Scanner(System.in); System.out.println(“Enter integer:"); int number = scanner.nextInt(); Error message for invalid input Exception in thread “main” java.lang.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:819) at java.util.Scanner.next(Scanner.java:1431) at java.util.Scanner.nextInt(Scanner.java:2040) at java.util.Scanner.nextInt(Scanner.java:2000) at Ch8Sample1.main(Ch8Sample1.java:35) 106 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 4 Catching an Exception System.out.print(prompt); try { try age = scanner.nextInt( ); } catch (InputMismatchException e){ System.out.println("Invalid Entry. " catch + "Please enter digits only"); } 107 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 5 try-catch Control Flow Exception is throw No Exception Assume throws an exception. try { try { All statements in the try block are executed. Remaining...... statements in the try block is skipped. } catch (Exception e) { } catch (Exception e) { Statements in the Statements in the catch block are catch block are...... skipped. executed. } } And the execution continues to the next statement ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 6 Getting Information There are two methods we can call to get information about the thrown exception: ➡ getMessage ➡ printStackTrace try {... } catch (InputMismatchException e) { scanner.next(); //remove the leftover garbage char System.out.println(e.getMessage()); e.printStackTrace(); } 109 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 7 Multiple catch Blocks A single try-catch statement can include multiple catch blocks, one for each type of exception. try {... age = scanner.nextInt();... val = cal.get(id); //cal is a GregorianCalendar... } catch (InputMismatchException e) {... } catch (ArrayIndexOutOfBoundsException e) {... } 110 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 8 Multiple catch Control Flow Exception Assume throws an exception No Exception try { and try { is the matching block. All statements in the try block are executed and throw Remaining no exceptions.... statements in the... try block is skipped. } } Statements in the All catch blocks are matching skipped.... catch block are executed.... } } ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 9 The finally Block There are situations where we need to take certain actions regardless of whether an exception is thrown or not. We place statements that must be executed regardless of exceptions in the finally block. 112 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 10 try-catch-finally Control Flow Exception No Exception try { Assume try { throws an exception and is... the matching block.......... } }............ } finally { } finally {...... finally block is finally block is executed. } executed. } ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 11 Propagating Exceptions Instead of catching a thrown exception by using the try- catch statement, we can propagate the thrown exception back to the caller of our method. The method header includes the reserved word throws. public int getAge( ) throws InputMismatchException {... int age = scanner.nextInt( );... return age; } do género: “Este problema não é meu!” 114 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 12 Throwing Exceptions We can write a method that throws an exception directly, i.e., this method is the origin of the exception. Use the throw reserved to create a new instance of the Exception or its subclasses. The method header includes the reserved word throws. public void doWork(int num) throws Exception {... if (num != val) throw new Exception("Invalid val");... } 115 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 13 Exception Thrower When a method may throw an exception, either directly or indirectly, we call the method an exception thrower. Every exception thrower must be one of two types: ➡ catcher. ➡ propagator. 116 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 14 Types of Exception Throwers An exception catcher is an exception thrower that includes a matching catch block for the thrown exception. An exception propagator does not contain a matching catch block. A method may be a catcher of one exception and a propagator of another. 117 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 15 Sample Call Sequence Method A Method B Method C Method D try { try { try { B(); C(); if (cond) { } catch (Exception e){ } catch (Exception e){ D(); throw...... } catch (Exception e){ new } }... Exception(); catcher propagator propagator D C B A Stack Trace 118 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 16 Exception Types All types of thrown errors are instances of the Throwable class or its subclasses. Serious errors are represented by instances of the Error class or its subclasses. Exceptional cases that common applications should handle are represented by instances of the Exception class or its subclasses. 119 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 17 Throwable Hierarchy There are over 60 classes in the hierarchy. ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 18 Checked vs. Runtime There are two types of exceptions: ➡ Checked. ➡ Unchecked. A checked exception is an exception that is checked at compile time. All other exceptions are unchecked, or runtime exceptions. As the name suggests, they are detected only at runtime. 121 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 19 Different Handling Rules When calling a method that can throw checked exceptions ➡ use the try-catch statement and place the call in the try block, or ➡ modify the method header to include the appropriate throws clause. When calling a method that can throw runtime exceptions, it is optional to use the try-catch statement or modify the method header to include a throws clause. 122 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 20 Handling Checked Exceptions ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 21 Handling Runtime Exceptions ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 22 Programmer-Defined Exceptions Using the standard exception classes, we can use the getMessage method to retrieve the error message. By defining our own exception class, we can pack more useful information ➡ for example, we may define a OutOfStock exception class and include information such as how many items to order AgeInputException is defined as a subclass of Exception and includes public methods to access three pieces of information it carries: lower and upper bounds of valid age input and the (invalid) value entered by the user. 125 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 8 - 23 Excepções definidas pelo utilizador (Ex.1) 126 Excepções definidas pelo utilizador (Ex.2) 127 Exemplo 2 (cont.) 128 chapter 10 Collections 129 Collection Classes: Lists and Maps The java.util standard package contains different types of classes for maintaining a collection of objects. These classes are collectively referred to as the Java Collection Framework (JCF). JCF includes classes that maintain collections of objects as sets, lists, or maps. 130 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 34 Java Interface A Java interface defines only the behavior of objects ➡ It includes only public methods with no method bodies. ➡ It does not include any data members except public constants ➡ No instances of a Java interface can be created 131 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 35 JCF Lists JCF includes the List interface that supports methods to maintain a collection of objects as a linear list L = (l0, l1, l2,... , lN) We can add to, remove from, and retrieve objects in a given list. A list does not have a set limit to the number of objects we can add to it. 132 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 36 List Methods Here are five useful list methods: boolean add ( E o ) Adds an object o to the list E is a generic void clear ( ) class. Replace E with Clears this list, i.e., make the list empty a concrete class. E get ( int idx ) Returns the element at position idx boolean remove ( int idx ) Removes the element at position idx int size ( ) Returns the number of elements in the list 133 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 37 Using Lists To use a list in a program, we must create an instance of a class that implements the List interface. Two classes that implement the List interface: ➡ ArrayList ➡ LinkedList The ArrayList class uses an array to manage data. The LinkedList class uses a technique called linked-node representation. 134 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 38 Homogeneous vs. Heterogeneous Collections Heterogeneous collections can include any types of objects (Person, Integer, Dog, etc.) Homogenous collections can include objects from a designated class only. ➡ Designate the class in the collection declaration. ➡ For example, to declare and create a list (ArrayList) of Person objects, we write List friends; … friends = new ArrayList( ) ; 135 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 39 Sample List Usage Here's an example of manipulating a list of Person objects: import java.util.*; List friends; Person person; friends = new ArrayList( ); person = new Person("jane", 10, 'F'); friends.add(person); person = new Person("jack", 6, 'M'); friends.add(person); Person p = friends.get(1); 136 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 40 JCF Maps JCF includes the Map interface that supports methods to maintain a collection of objects (key, value) pairs called map entries. key value k0 v0 one entry k1 v1...... kn vn 137 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 41 Map Methods Here are five of the 14 list methods: void clear ( ) Clears this list, i.e., make the map empty boolean containsKey ( Object key ) Returns true if the map contains an entry with a given key V put (K key, V value) Adds the given (key, value) entry to the map V remove ( Object key ) Removes the entry with the given key from the map int size ( ) Returns the number of elements in the map 138 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 42 Using Maps To use a map in a program, we must create an instance of a class that implements the Map interface. Two classes that implement the Map interface: ➡ HashMap Os HashMaps são implementados ➡ TreeMap com Hashing (não há ordem no conjunto das chaves!) Os TreeMaps são implementados com arvores binárias de pesquisa(red-black tree(ordem nas chaves!) 139 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 43 Sample Map Usage Here's importanjava.util.*; example of manipulating a map: Map catalog = new TreeMap( ); catalog.put("CS101", "Intro Java Programming"); catalog.put("CS301", "Database Design"); catalog.put("CS413", "Software Design for Mobile Devices"); if (catalog.containsKey("CS101")) { System.out.println("We teach Java this semester"); } else { System.out.println("No Java courses this semester"); } 140 Problem Statement Write an AddressBook class that manages a collection of Person objects. An AddressBook object will allow the programmer to add, delete, or search for a Person object in the address book. 141 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 45 Overall Plan / Design Document Since we are designing a single class, our task is to identify the public methods. Public Method Purpose AddressBook A constructor to initialize the object. We will include multiple constructors as necessary. add Adds a new Person object to the address book. delete Deletes a specified Person object from the address book. search Searches a specified Person object in the address book and returns this person if found. 142 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 46 Development Steps We will develop this program in five steps: 1. Implement the constructor(s). 2. Implement the add method. 3. Implement the search method. 4. Implement the delete method. 5. Finalize the class. 143 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 47 Step 1 Design Start the class definition with two constructors The zero-argument constructor will create an array of default size The one-argument constructor will create an array of the specified size 144 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 48 Step 1 Code Program source file is too big to list here. From now on, we ask you to view the source files using your Java IDE. Directory: Chapter10/Step1 Source Files: AddressBook.java 145 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 49 Step 1 Test The purpose of Step 1 testing is to verify that the constructors work as expected. Argument to Purpose Constructor Negative numbers Test the invalid data. 0 Test the end case of invalid data. 1 Test the end case of valid data. >= 1 Test the normal cases. 146 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 50 Step 2 Design Design and implement the add method The array we use internal to the AddressBook class has a size limit, so we need consider the overflow situation ➡ Alternative 1: Disallow adds when the capacity limit is reached ➡ Alternative 2: Create a new array of bigger size We will adopt Alternative 2 147 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 51 Step 2 Code Directory: Chapter10/Step2 Source Files: AddressBook.java 148 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 52 Step 2 Test The purpose of Step 2 test is to confirm that objects are added correctly and the creation of a bigger array takes place when an overflow situation occurs. Test Sequence Purpose Create the array Test that the array is created correctly. of size 4 Add four Person Test that the Person objects are added objects correctly. Add the fifth Test that the new array is created and the Person object Person object is added correctly (to the new array). 149 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 53 Step 3 Design Design and implement the search method. loc = 0; while ( loc < count && name of Person at entry[loc] is not equal to the given search name ) { Loc++; } if (loc == count) { foundPerson = null; } else { foundPerson = entry[loc]; } return foundPerson; 150 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 54 Step 3 Code Directory: Chapter10/Step3 Source Files: AddressBook.java 151 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 55 Step 3 Test To test the correct operation of the search method, we need to Test Sequence carry Purpose out test routines much more elaborate than previous tests. Create the array of size 5 and add five Person Test that the array is created and set up objects with unique names. correctly. Here, we will test the case where the array is 100 percent filled. Search for the person in the first position of the Test that the successful search works array correctly for the end case. Search for the person in the last position of the Test another version of the end case. array Search for a person somewhere in the middle of the Test the normal case. array. Search for a person not in the array. Test for the unsuccessful search. Repeat the above steps with an array of varying Test that the routine works correctly for sizes, especially the array of size 1. arrays of different sizes. Repeat the testing with the cases where the array Test that the routine works correctly for is not fully filled, say, array length is 5 and the number of objects in the array is 0 or 3. other cases. 152 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 56 Step 4 Design Design and implement the delete method. Boolean status; Int loc = findIndex( searchName ); if ( loc is not valid ) { status = false; } else { //found, pack the hole replace the element at index loc+1 by the last element at index count; status = true; count--; //decrement count, since we now have one less element assert 'count' is valid; } return status; 153 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 57 Step 4 Code Directory: Chapter10/Step4 Source Files: AddressBook.java 154 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 58 Step 4 Test To test the correct operation of the delete method, we need to carry Test outSequence a detailed test routine. Purpose Create the array of size 5 and add five Test the array is created and set up correctly. Person objects with unique names. Here, we will test the case where the array is 100 percent filled. Search for a person to be deleted next. Verify that the person is in the array before deletion. Delete the person in the array Test that the delete method works correctly. Search for the deleted person. Test that the delete method works correctly by checking the value null is returned by the search. Attempt to delete a nonexisting person. Test that the unsuccessful operation works correctly. Repeat the above steps by deleting persons Test that the routine works correctly for arrays of at the first and last positions. different sizes. Repeat testing where the array is not fully Test that the routine works correctly for other filled, say, an array length is 5 and the cases. number of objects in the array is 0 or 3. 155 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 59 Step 5: Finalize Final Test ➡ Since the three operations of add, delete, and search are interrelated, it is critical to test these operations together. We try out various combinations of add, delete, and search operations. Possible Extensions ➡ One very useful extension is scanning. Scanning is an operation to visit all elements in the collection. ➡ Scanning is useful in listing all Person objects in the address book. 156 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 10 - 60 Colecções Uma colecção(container) é um objecto capaz de agrupar múltiplos elementos numa unidade única de representação e processamento As colecções, as Java Collections Framework(JCF), é uma arquitectura unificada constituída por interfaces, classes abstractas e implementações concretas O conhecimento destas colecções introduz eficiência(espaço/ tempo) no código gerado pelo utilizador 159 Interfaces fundamentais Set - Conjuntos de objectos no sentido matemático de termo ➡ não existe ordem, nem são permitidos duplicados List - Sequência de objectos ➡ Existe ordem, são permitidos duplicados Map - Correspondências chave-valor ➡ As chaves são um conjunto e a diferentes chaves pode corresponder o mesmo valor Queue - Estruturas lineares do tipo FIFO 160 Modificações no Java5 Auto-Boxing e auto Unboxing ➡ mecanismo que converte automaticamente valores de tipos primitivos em objectos das classes correspondentes(wrapper classes) quando estes são inseridos nas colecções Iterador foreach ➡ sob a forma de um ciclo for aplicável a colecções , para que possam ser iteradas(Iterable) Tipos genéricos ➡ Adicionam às colecções generalidade e segurança em tempo de compilação, eliminam a necessidade do intenso casting 161 Estrutura de interfaces Iterable Collection Map Set List Queue SortedMap SortedSet 162 Iterable Um conjunto de elementos será iterável (por definição) se providenciar um iterador interface Iterable { Iterator iterator(); } public interface Iterator{ boolean hasNext(); E next(); void remove(); } 163 Interfaces de colecções Collection lê-se uma colecção de objectos do tipo , ou simplesmente uma colecção de E´s Os elementos E podem ser de qualquer tipo, (Integer, String,...) Os Maps não herdam de Collection, porque embora sejam em si colecções são parametrizáveis em dois tipos Para Java5 colecções monoparâmetro são as listas(List), as filas(Queue) e os conjuntos(Set) 164 E Stack Tipo Genérico Um tipo genérico é um tipo referenciado, que usa na sua definição uma ou mais variáveis “de tipo” (parâmetros de tipo), sendo definido com base nestas variáveis de valor não especificado (formais) ➡ Um tipo parametrizado é o resultado da instanciação dum tipo genérico para um valor concreto da(s) variáveis de tipo (ex. Stack, Stack,… ➡ O tipo genérico pode ser usado nas situações usuais(declaração variáveis, parâmetros de métodos ou como retorno) 165 Tipo Genérico Exemplo public class Box { private T t; // T stands for "Type" public void add(T t) { this.t = t; } public T get() { return t; } } 166 Tipo Genérico(convenções) Por convenção os nomes dos parâmetros de tipo são uma única letra maiúscula Esta excepção permite diferenciar um parâmetro de tipo duma classe ou interface Os nomes de tipos paramétricos mais usados são: ➡ E - Elemento duma colecção ➡ K - Chave (Key) ➡ N - Número ➡ T - Tipo ➡ V - Valor ➡ S,U,V etc. - 2º, 3º, 4º tipo 167 Métodos genéricos Os parâmetros de tipo podem ser declarados nas assinaturas de construtores ou de quaisquer métodos para o tornar genéricos A sua declaração é similar à do tipo genérico, embora o âmbito da declaração seja somente o método ou construtor em causa public void inspect(U u){ System.out.println("T: " + t.getClass().getName()); System.out.println("U: " + u.getClass().getName()); } 168 Compatibilidade Em Java5 todas as classes e Interfaces do JCF são parametrizáveis, excepto excepções, tipos enumerados, e classes anónimas Por questões de retro-compatibilidade por cada classe ou interface genérica (C I) foram mantidas as versões antigas não parametrizadas C e I Estas classes não devem ser usadas: ➡ Não são type-safe ➡ Desaparecerão em futuras versões do Java 169 Início da Aula 28/11/2024 Programação II - 2014/2015 170 Lígia Ferreira Parâm. de Tipo limitados Por vezes queremos restringir o tipo dos parâmetros que são passados num parâmetro de tipo. Neste caso usa-se a palavra reservada “extends” seguida do limite superior public void inspect(U u){ System.out.println("T: " + t.getClass().getName()); System.out.println("U: " + u.getClass().getName()); } Neste caso a palavra “extends” tem um sentido mais amplo designando quer o próprio “extends” das classes quer o “implements” das interfaces. 171 Listas de Tipo E Uma List herda Collection e por sua vez as colecções herdam dos Iteráveis (Iterable) Categoria Métodos add(E o); add(int index_i, E o); inserção addAll(Collection c); addAll(int i, Collection c) remove(Object o); remove(int index_i); remoção removeAll(Collection c); retainAll(Collection c) E get(int index); int indexOf(Object o); int lastIndexOf(Object o); consulta/ boolean contains(Object o); boolean isEmpty(); comparação boolean containsAll(Collection c); size() 172 Listas de Tipo E Categoria Categoria criação de Iterator iterator(); ListIterator listIterator(); iteradores listIterator listIterator(index_i) Modificação set(int index_i, E elem); clear(); Subgrupo List subList(int de, int ate) Conversão Object[] toArray() Outros boolean equals(Object o) 173 Listas de Tipo E A implementação de cada um destes métodos deve satisfazer o facto de uma lista objectos do tipo E satisfazer as seguintes propriedades: ➡ Existe uma ordem nos seus elementos ➡ Cada elemento ocupa uma posição referenciada na lista por um índice inteiro a partir de 0 ➡ Os elementos podem ser inseridos em qualquer posição da lista ➡ A lista pode conter elementos em duplicado e null´s 174 Listas de Tipo E Existem 4 classes que implementam de forma diferente a interface List ➡ ArrayList (implementação em array dinâmico) ➡ Vector (tal como ArrayList mas synchronized) ➡ Stack (estrutura com comportamento LIFO) ➡ LinkedList (implementação em lista duplamente ligada) 175 Iterable Collection AbstractCollection List AbstractList ArrayList LinkedList Vector Stack 176 E ArrayList Classe Arraylist Esta classe fornece uma implementação de listas usando arrays dinâmicos Dado que nenhuma colecção armazena valores de tipos primitivos a primeira coisa a fazer é instanciar o parâmetro da arrayList Exemplo: ArrayList l1=new ArrayList(); ArrayList l2=new ArrayList(50); constructores 177 ArrayList Para saber o tamanho: l2.size(); 0 Inserir elementos: l1.add(123); l2.add("bolas"); l2.add("raquetes"); 178 ArrayList Consultar a lista: System.out.println(l2.get(0)); bolas System.out.println(l2.get(1)); raquetes modificar o conteúdo: l2.set(0,”redes"); System.out.println(l2.get(0)); redes Se o índice sai fora dos limites... IndexOutOfBoundsException: Index: 2, Size: 2 179 ArrayList Adicionar numa determinada posição: ArrayList l3=new ArrayList(20); for (int i=0;i