Cap 13 Herencia y Polimorfismo The Mc GrawHill

  • Slides: 60
Download presentation
Cap 13 Herencia y Polimorfismo ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction

Cap 13 Herencia y Polimorfismo ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 1

Objetivos – Escribir programas que sean fácilmente extensibles y modificables aplicando polimorfismo en el

Objetivos – Escribir programas que sean fácilmente extensibles y modificables aplicando polimorfismo en el diseño de programas – Definir clases re-usables basados en herencia clases y métodos abstractos – Diferenciar clases abstractas e interfases Java – Definir métodos, usando el modificador protected – Dividir cadenas usando objetos String Tokenizer ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 2

Definir Clases con herencia • Caso de Estudio: – Suponga queremos implementar una clase

Definir Clases con herencia • Caso de Estudio: – Suponga queremos implementar una clase que contenga estudiantes graduados y no graduados – Cada registro de estudiantes contendrá el nombre, tres notas, y la nota final del curso – La fórmula para determinar la aprobación del curso difiere si el alumno es graduado o no. ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 3

Modelando dos tipos de estudiantes • Hay dos formas de diseñar para modelar los

Modelando dos tipos de estudiantes • Hay dos formas de diseñar para modelar los dos casos de estudiante. – Podemos definir dos clases no relacionadas, una para graduados y otra para los no graduados. – Podemos modelar ambas clases de estudiantes usando clases que se relacionan a través de una jerarquía de herencia. • Dos clases son no relacionadas si no están conectadas a través de una relación de herencia (exceptuando Object) ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 4

Clases para la Lista de nombres • Para el ej de lista de nombres,

Clases para la Lista de nombres • Para el ej de lista de nombres, diseñamos 3 clases: – Estudiante Student – Estudiante no graduado Undergraduate. Student – Estudiante graduado Graduate. Student • La clase Student incorporará comportamiento y datos comunes a las clases Undergraduate. Student y Graduate. Student objects. • Las clases Undergraduate. Student y Graduate. Student cada una contendrán comportamiento específico a sus respectivos objetos ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 5

Jerarquia de Herencia (relación es un) ©The Mc. Graw-Hill Companies, Inc. Permission required for

Jerarquia de Herencia (relación es un) ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 6

El modificador Protected • El modificador protected hace que un dato miembro o un

El modificador Protected • El modificador protected hace que un dato miembro o un método sea visible y accesible a las instancias de la clases y a sus clases descendientes • Los datos miembro y los métodos Public son accesibles a todos • Los datos miembro y los métodos Private son accesibles sólo a las instancias de la clase y a sus clases internas ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 7

Polimorfismo • Polimorfismo permite que una variable se refiera a objetos de diferentes subclases

Polimorfismo • Polimorfismo permite que una variable se refiera a objetos de diferentes subclases de la misma jerarquía de herencia • Ej, si gato y perro son subclases de Mascotas entonces es válido Pet my. Pet; my. Pet = new Dog(); . . . my. Pet = new Cat(); ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 8

Usando un arreglo • Podemos mantener nuestra lista de nombres usando un arreglo, combinando

Usando un arreglo • Podemos mantener nuestra lista de nombres usando un arreglo, combinando objetos de las clases Student, Undergraduate. Student y Graduate. Student roster = new Student[40]; . . . roster[0] = new Graduate. Student(); roster[1] = new Undergraduate. Student(); roster[2] = new Undergraduate. Student(); . . . ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 9

Estado del arreglo • El arreglo roster con elementos referidos a instancias de las

Estado del arreglo • El arreglo roster con elementos referidos a instancias de las clases Graduate. Student y Undergraduate. Student. ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 10

Ej Mensaje Polimórfico • Para calcular la graduación de un curso usando el arreglo

Ej Mensaje Polimórfico • Para calcular la graduación de un curso usando el arreglo ejecutamos for (int i = 0; i < number. Of. Students; i++) { roster[i]. compute. Course. Grade(); } • Si roster[i] se refiere a un estudiante graduado se ejecutará el método compute. Course. Grade de la clase Graduate. Student • Si roster[i] se refiere a un estudiante no graduado, entonces se ejecutará compute. Course. Grade de Undergraduate. Student ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 11

El operador instanceof • El operador instanceof (instancia de) permite saber a que clase

El operador instanceof • El operador instanceof (instancia de) permite saber a que clase pertenece un objeto • El sig código cuenta la cantidad de alumnos no graduados int undergrad. Count = 0; for (int i = 0; i < number. Of. Students; i++) { if ( roster[i] instanceof Undergraduate. Student ) { undergrad. Count++; } } ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 12

Herencia y Accesibilidad a los datos miembro ©The Mc. Graw-Hill Companies, Inc. Permission required

Herencia y Accesibilidad a los datos miembro ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 13

Acceso desde el cliente de acuerdo a los Modificadores de visibilidad ©The Mc. Graw-Hill

Acceso desde el cliente de acuerdo a los Modificadores de visibilidad ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 14

Accesibilidad de Super desde Sub • Todo excepto los miembros privados de la superclase

Accesibilidad de Super desde Sub • Todo excepto los miembros privados de la superclase son visibles desde la subclase ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 15

Accesibillidad desde otra Instancia • Los datos miembros accesibles desde una instancia son taa

Accesibillidad desde otra Instancia • Los datos miembros accesibles desde una instancia son taa accesibles desde otra instancia de la misma clase ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 16

Visibilidad paquete • Existe otro modificador de accesibilidad: package • Significa que el componente

Visibilidad paquete • Existe otro modificador de accesibilidad: package • Significa que el componente es accesible desde cualquier método de una clase que pertenezca al mismo paquete • Si no se pone explícitamente ningún modificador de visibilidad se considera con visibilidad de package ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 17

Sobre-escribir y Ocultar Métodos heredados • Un método de la subclase con la misma

Sobre-escribir y Ocultar Métodos heredados • Un método de la subclase con la misma firma sobre-escribe al método de la superclase • NO se pueden sobre-escribir métodos finales • Si el la subclase se define un método de clase (static) con la misma firma éste oculta al método de la superclase ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 18

Ocultar Vs Sobreescribir public class Animal { public static void oculto(){ System. out. format(“Mét

Ocultar Vs Sobreescribir public class Animal { public static void oculto(){ System. out. format(“Mét oculto en Animal”. %n); } public void sobreescrito() { System. out. format(“Mét sobreescrito en Animal”. %n); }} public class Gato extends Animal { public static void oculto(){ System. out. format(“Mét oculto en Gato”. %n); } public void sobreescrito() { System. out. format(“Mét sobreescrito en Gato”. %n); } public static void main (String[] arg){ Gato mi. Gato = new Gato(); Animal mi. Animal = mi. Gato; Animal. oculto(); Mét oculto en Animal mi. Animal. sobreescrito(); }} Mét sobreescrito en Gato ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 19

Ocultar Vs Sobreescribir • La clase Gato sobre-escribe el mét de instancia y oculta

Ocultar Vs Sobreescribir • La clase Gato sobre-escribe el mét de instancia y oculta el mét de clase. • Definir un método con la misma firma en la subclase da: Met Instancia subclase Met Static subclase ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. Met Instancia superclase sobre-escribe Mét static superclase error de compilacion Oculta 20

Ocultar atributos • Dentro de una clase una variable con el mismo nombre oculta

Ocultar atributos • Dentro de una clase una variable con el mismo nombre oculta a la variable de la superclase (aunque sean de distinto tipo) • No puede referenciarse a la variable de la superclase sólo por su nombre. • Para invocar a la variable de la superclase se usa: super. nbre_variable • Generalmente no se recomienda ocultar variables miembro ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 21

Uso de super public class Superclase { public boolean una. Variable; public vid un.

Uso de super public class Superclase { public boolean una. Variable; public vid un. Metodo{ una. Variable = true; }} public class Subclase extends Superclase { public boolean una. Variable; // oculta public void un. Metodo{ // sobre-escribe una. Variable = false; super. un. Metodo(); System. out. format (%b%n , una. Variable); false System. out. format (%b%n , super. una. Variable); }} true ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 22

Herencia y constructores • A diferencia de los miembros, los constructores no son heredados

Herencia y constructores • A diferencia de los miembros, los constructores no son heredados a sus subclases • Se debe definir un constructor para la clase o usar el constructor por defecto agregado por el compilador (no recomendable) • En el constructor de la subclase la sentencia super(lista de argumentos); llama al constructor correspondiente de la superclase. Si no se realiza una llamada explícita al constructor de la superclase el compilador inserta una llamada al constructor de la superclase sin argumentos super() - La llamada al constructor de la superclase (si existe) debe ser la 1 a sentencia del constructor de la subclase. ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 23

Herencia y constructores (cont) • Cuando se crea un objeto de una clase derivada

Herencia y constructores (cont) • Cuando se crea un objeto de una clase derivada se crea implícitamente un objeto de la clase base que se inicializa con su constructor correspondiente. • Si en la creación del objeto se usa el constructor sin argumentos, entonces se produce una llamada implícita al constructor sin argumentos para la clase base. • Si se usan otros constructores es necesario invocarlos explicitamente. - Si la declaración de clase no designa explícitamente una superclase con la cláusula extends, la superclase de la clase es la clase Object ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 24

Método Finales • final indica que el método no puede ser sobre-escrito. Ej class

Método Finales • final indica que el método no puede ser sobre-escrito. Ej class Ajedrez { enum jugador. Ajedrez {BLANCAS, NEGRAS}. . . final Ajedrez get. Primer. Jugador(){ return jugador. Ajedrez. BLANCAS; }. . . } • Los métodos llamados por los constructores normalmente se declaran como finales. • Taa se puede declarar una clase como final, es útil cuando se crea una clase inmutable Ej String ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 25

Clase Object • Todas las clases descienden de Object • Define el comportamiento y

Clase Object • Todas las clases descienden de Object • Define el comportamiento y estado básico de todos los objetos que se puedan crear. Ej comparación con otro objeto equal y hashcode convertir en string to. String devolver la clase get. Class met llamado por gc finalize clonar clone (Nota: el objeto en cuestión debe implementar la interfase Cloneable) Consultar la documentación de Java para más información ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 26

Superclases y métodos Abstractos (Abstract) • Cuando definimos una superclase, a menudo no necesitamos

Superclases y métodos Abstractos (Abstract) • Cuando definimos una superclase, a menudo no necesitamos crear instancias de ella • Dependiendo si necesitaremos o no crear instancias de la superclase, podemos definirla de forma diferente. • Veremos ej basados en la superclase Student ya definida ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 27

Definición: Clase Abstracta • Una clase abstracta (abstract) es una clase – definida con

Definición: Clase Abstracta • Una clase abstracta (abstract) es una clase – definida con el modificador abstract O – que contiene un método abstract OR – que no provee una implementación de un método no heredado • Un método abstracto es un método que contiene la palabra reservada y termina con un ; en vez de con el cuerpo del método – Los métodos privados y los estáticos no pueden ser declarados como abstract. • No se pueden crear instancias de una clase abstracta ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 28

Caso 1 • Los estudiantes pueden ser no graduados solamente – Si sólo necesitamos

Caso 1 • Los estudiantes pueden ser no graduados solamente – Si sólo necesitamos instancias de graduado o no graduado Entonces se puede definir la clase Alumno de manera que no puedan crearse instancias de ella. ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 29

Ej abstract class Student {. . abstract public void compute. Course. Grade(); // observar

Ej abstract class Student {. . abstract public void compute. Course. Grade(); // observar que no tiene cuerpo este método } ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 30

Caso 2 • Los estudiates no tienen que ser graduados o no graduados •

Caso 2 • Los estudiates no tienen que ser graduados o no graduados • En este caso se puede definir la clase Alumno de dos formas a) Podemos hacer la clase Alumno no abstracta b) Dejar la clase Alumno como clase abstracta y crear una 3 ra subclase, Otros. Estudiantes Other. Student, para manejar a un estudiante que no es de las categorías anteriores ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 31

Ej Caso 2 a class Student { . . . // implementamos el metodo

Ej Caso 2 a class Student { . . . // implementamos el metodo // suprimir la palabra abstract en la clase y en el método public void compute. Course. Grade(){ int total = 0; for (int=0; i <NUM_OF_TEST; i++ ){. . . }}} ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 32

Caso 2 b class Other. Student extends Student { public void compute. Course. Grade(){

Caso 2 b class Other. Student extends Student { public void compute. Course. Grade(){ int total = 0; for (int i = 0; i<NUM_OF_TEST; i++){. . . } } } ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 33

Diagrama Herencia Student (abstrct) Graduate. Student Other. Student ©The Mc. Graw-Hill Companies, Inc. Permission

Diagrama Herencia Student (abstrct) Graduate. Student Other. Student ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. Graduate. Student Under. Graduate Student 34

Que usar? • La mejor solución depende de la situación particular. • Cuando se

Que usar? • La mejor solución depende de la situación particular. • Cuando se consideran diseños alternativos, debemos preguntarnos cual de las alternativas permitirá modificaciones y extensiones más fáciles ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 35

Herencia Vs Interfase • Una interfase Java se usa para compartir comportamiento común entre

Herencia Vs Interfase • Una interfase Java se usa para compartir comportamiento común entre instancias de diferentes clases (sólo la definición de los métodos). • Herencia se usa para compartir código común entre instancias de clases relacionadas (incluyendo ambos datos y métodos miembros. • Usar interfase cuando se comparte comportamiento Herencia cuando se comparte código • Si una entidad A es una forma especializada de otra B, conviene modelarla con herencia, declarando a A como subclase de B. • Relación : Es un • Cada subclase puede descender sólo de una superclase ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 36

Interfase • • Se utiliza la palabra interface en lugar de class Puede ser

Interfase • • Se utiliza la palabra interface en lugar de class Puede ser púbica o sin modif de acceso Todos los métodos son siempre públicos Para indicar que una clase implementa los métodos de una interfase se usa implements • El compilador verif. q’ la clase implemente todos los métodos de la interfase • Una clase puede implementar más de una interfase ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 37

Declaración y uso de Interfases interface Instrumento. Musical { void tocar(); void afinar(); String

Declaración y uso de Interfases interface Instrumento. Musical { void tocar(); void afinar(); String tipo. Instrumento(); } abstract class Instrumento. Viento implements Instrumento. Musical{ void tocar(. . . ); // Metodos implementados void afinar(. . . ); String tipo. Instrumento(); // Met sin implementar } } class Flauta extends Instrumento. Viento { String tipo. Instrumento(); return “Flauta”; }} } ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 38

Extensión de Interfases • Las interfases pueden extender otras interfases • Una interfase puede

Extensión de Interfases • Las interfases pueden extender otras interfases • Una interfase puede extender a más de una interfase interface nbre_interfase extends nbre_interfase 1, nbre_interfase 2 { tipo_retorno nbre_metodo (lista argumentos); } ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 39

Clases embebidas (Inner) • Una clase embebida es una clase que se define dentro

Clases embebidas (Inner) • Una clase embebida es una clase que se define dentro de otra. • permite agrupar clases lógicamente relacionadas y controlar la 'visibilidad' de una clase. • Se puede definir una clase embebida de la siguiente forma: class Externa { . . . class Interna { . . . } } ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 40

Acceso a la clase interna • La clase Externa puede instanciar y usar la

Acceso a la clase interna • La clase Externa puede instanciar y usar la clase Interna como cualquier otra, sin limitación ni cambio en la sintaxis de acceso: class Externa { . . . class Interna { . . . } void metodo() { Interna i = new Interna(. . . ); . . . } } ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 41

Creación de objetos de la clase interna • Un objeto de la clase embebida

Creación de objetos de la clase interna • Un objeto de la clase embebida está relacionado siempre con un objeto de la clase que la envuelve • Las instancias de la clase embebida deben ser creadas por una instancia de la clase que la envuelve. • Desde el exterior estas referencias pueden manejarse, pero calificándolas completamente, es decir nombrando la clase externa y luego la interna. • Una instancia de la clase embebida tiene acceso a todos los datos miembros de la clase que la envuelve sin usar ningún calificador de acceso especial (como si le pertenecieran). ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 42

Problema • Escribir una aplicación que lea un arch de texto y muestre si

Problema • Escribir una aplicación que lea un arch de texto y muestre si aprobó el curso La aprobación del curso depende si el alumno es graduado o no graduado. Para que un NO graduado pase el curso debe tener un promedio >= 70, si es graduado el mismo debe ser >= 80 El arch de texto tiene el sig. formato • Cada línea contiene información de un estudiante • Cada línea usa el formato <Type> <Name> <Test 1> <Test 2> <Test 3> dde <Type> designa si es graduado o no graduado <Name> nombre y apellido del alumno <Test i> las notas ( tres en total) • El fin del ingreso contiene la palabra END, ignorar si está en mayúsculas o minúsculas ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 43

Overall Plan • Tareas 1. leer el archivo de texto 2. Evaluar si pasa

Overall Plan • Tareas 1. leer el archivo de texto 2. Evaluar si pasa de curso 3. Imprimir los resultados • Ej. Formato del arch ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 44

Desarrollo • 1. Comenzar con el esqueleto de la clase Compute. Grades. 2. Implementar

Desarrollo • 1. Comenzar con el esqueleto de la clase Compute. Grades. 2. Implementar el método print. Result. Definir cualquier otro método necesario para implementar print. Result. 3. Implementar el método compute. Grade. 4. Implementar el método read. Data. 5. Finalizar y ver las mejoras posibles. ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 45

Paso 1 Diseño • Comenzamos con el esqueleto de la case. • Definimos dos

Paso 1 Diseño • Comenzamos con el esqueleto de la case. • Definimos dos constructores de manera que el programador pueda crear el array roster a un tamaño por defecto o eligiendo el tamaño. ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 46

Step 1 Code Directory: Chapter 13/Step 1 Source Files: Compute. Grades. java ©The Mc.

Step 1 Code Directory: Chapter 13/Step 1 Source Files: Compute. Grades. java ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 47

Paso 1 Test • Incluimos una salida temporaria dentro de los métodos que hemos

Paso 1 Test • Incluimos una salida temporaria dentro de los métodos que hemos definido para verificar que los mismos se llamen en el orden correcto • Sólo verificamos el orden de llamado a los métodos ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 48

Paso 2 Diseño • Diseñamos i implementamos el método print. Result • Usamos la

Paso 2 Diseño • Diseñamos i implementamos el método print. Result • Usamos la clase Output. Box para mostrar los resultados for each element i in the roster array { output the name of roster[i]; output the test scores of roster[i]; output the course grade of roster[i]; skip to the next line; } ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 49

Step 2 Code Directory: Chapter 13/Step 2 Source Files: Compute. Grades. java ©The Mc.

Step 2 Code Directory: Chapter 13/Step 2 Source Files: Compute. Grades. java ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 50

Step 2 Test • We verify the temporary read. Data method is working correctly.

Step 2 Test • We verify the temporary read. Data method is working correctly. This confirms that we are using the correct student classes and using their methods correctly. • We verify the print. Result method does indeed display the data in our desired format. ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 51

Step 3 Design • We design and implement the compute. Grade method. • The

Step 3 Design • We design and implement the compute. Grade method. • The code for actually determining the course grade is embedded in individual student classes – So the code to add to the Compute. Grades class is very simplistic. – This is a direct benefit of using polymorphism effectively. ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 52

Step 3 Code Directory: Chapter 13/Step 3 Source Files: Compute. Grades. java ©The Mc.

Step 3 Code Directory: Chapter 13/Step 3 Source Files: Compute. Grades. java ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 53

Step 3 Test • We will repeat the same test routines from Step 2.

Step 3 Test • We will repeat the same test routines from Step 2. • Instead of seeing four asterisks, we should be seeing the correct grades. • We test both the passing and not passing test scores. ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 54

Step 4 Design • We design and implement the core functionality of the program—the

Step 4 Design • We design and implement the core functionality of the program—the read. Data method • We can express its logic as get the filename from the user; if (the filename is provided) read in data and build the roster array; else output an error message; ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 55

The build. Roster Method • The logic of the workhorse private method build. Roster

The build. Roster Method • The logic of the workhorse private method build. Roster is as follows: set buf. Reader for input; while ( !done ) { line = get next line; if (line is END) { done = true; } else { student = create. Student( line ); if (student != null) { roster[student. Count] = student; //add to roster student. Count++; } } ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 56

The create. Student Method • We use the String. Tokenizer class to break down

The create. Student Method • We use the String. Tokenizer class to break down items in a single line of input String. Tokenizer parser = new String. Tokenizer( line ); String type; try { type = parser. next. Token(); if (type. equals(UNDER_GRAD) || type. equals(GRAD)) { student = new. Student. With. Data(type, parser); } else { //invalid type is encountered student = null; } } catch (No. Such. Element. Exception e) { //no token student = null; } return student; ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 57

Step 4 Code Directory: Chapter 13/Step 4 Source Files: Compute. Grades. java ©The Mc.

Step 4 Code Directory: Chapter 13/Step 4 Source Files: Compute. Grades. java ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 58

Step 4 Test • We run through a more complete testing routine in this

Step 4 Test • We run through a more complete testing routine in this step. We need to run the program for various types of input files. Some of the possible file contents are as follows: ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 59

Step 5: Finalize and Improve • We finalize the program by correcting any remaining

Step 5: Finalize and Improve • We finalize the program by correcting any remaining errors, inconsistency, or unfinished methods. • We want to review the methods and improve them as necessarily. • One problem (which would have been identified in step 4 testing) we need to correct is the missing method for expanding the roster array when the input file includes more student entries than the set default size of 25. – We leave this method as Exercise 3. – We also leave some of the possible improvements as exercises. ©The Mc. Graw-Hill Companies, Inc. Permission required for reproduction or display. 60