Métodos, clases, y objetos

5. Clases y objetos. 7. 6. Creación de una clase. 8. 7. Métodos de instancia. 9. 8. Declaración de objetos y ... System.out.println(”Primera aplicación de Java”);. 5.
181KB Größe 35 Downloads 126 vistas
M´etodos, clases, y objetos H. Tejeda Febrero 2016

´Indice 1. Llamada a m´ etodos y colocaci´ on

2

2. Dise˜ no de un m´ etodo

3

3. Par´ ametros en los m´ etodos

4

4. M´ etodos que devuelven un valor

6

5. Clases y objetos

7

6. Creaci´ on de una clase

8

7. M´ etodos de instancia

9

8. Declaraci´ on de objetos y uso de sus m´ etodos

11

9. Constructores

13

10.Clases como tipos de datos

14

1

1.

Llamada a m´ etodos y colocaci´ on

Un m´ etodo es un m´odulo de programa que contiene una serie de sentencias que realizan una tarea. Se han visto clases de Java que contienen el m´etodo main, el cual se ejecuta autom´aticamente cuando se corre el programa. El m´etodo main puede ejecutar m´etodos adicionales, y estos m´etodos pueden ejecutar otros. Cualquier clase puede contener una cantidad ilimitada de m´etodos, y cada m´etodo puede ser llamado una cantidad ilimitada de veces. Para ejecutar un m´etodo, se debe invocar o llamar. El m´etodo llamado a su vez puede llamar a otros m´etodos. El m´etodo llamado se conoce tambi´en como m´ etodo cliente. Hay dos ventajas principales al crear m´etodos. Por una parte el m´etodo main() permanece peque˜ no y por otra parte permite reusar los m´etodos. Un m´etodo es colocado dentro de una clase, pero este deber´a estar afuera de cualquier otro m´etodo. No es v´alido anidar m´etodos. La colocaci´on de los m´etodos en una clase no influye en el orden en el cual los m´etodos son llamados o ejecutados. El m´etodo main() es siempre ejecutado primero en cualquier aplicaci´on de Java, y este podr´a llamar cualquier otro m´etodo en forma arbitraria y cualquier cantidad de veces. La ejecuci´on de otros m´etodos no se ejecutan s´olo por estar en la clase, estos deber´an ser llamados. Una clase podr´ıa contener m´etodos que nunca sean llamados para alguna aplicaci´on particular. En el c´odigo 1 se muestra la clase Primero con los m´etodos main() y nombreYDireccion(). Cuando se ejecuta el programa, el m´etodo main() primero llama al m´etodo nombreYDireccion(), el cual muestra tres l´ıneas en la salida. Cuando se termina la ejecuci´on de nombreYDireccion se devuelve la ejecuci´on a main() para mostrar un mensaje m´as. 1 2 3 4 5 6 7 8 9 10 11

public c l a s s Primero { public s t a t i c void main ( S t r i n g [ ] a r g s ) { nombreYDireccion ( ) ; System . out . p r i n t l n ( ” Primera a p l i c a c i ´on de Java ” ) ; } public s t a t i c void nombreYDireccion ( ) { System . out . p r i n t l n ( ” U n i v e r s i d a d Michoacana ” ) ; System . out . p r i n t l n ( ” S a n t i g o Tapia # 403 ” ) ; System . out . p r i n t l n ( ” Morelia , Mich . , 58000 ” ) ; } }

C´odigo 1: clase Primero donde main() llama a nombreYDireccion

2

2.

Dise˜ no de un m´ etodo

Cada m´etodo deber´a incluir las siguientes dos partes: Una cabecera del m´ etodo da informaci´on de como otros m´etodos pueden usarlo. Tambi´en se le conoce como declaraci´ on. Un cuerpo del m´ etodo entre un par de llaves, que contiene las sentencias que realizan el trabajo del m´etodo. Tambi´en se le llama implementaci´ on. El cuerpo podr´ıa no contener sentencias, pero no tiene sentido. La cabecera del m´etodo contiene lo siguiente: Especificadores de acceso opcionales. Tipo devuelto Identificador. Par´entesis.

2.1.

Especificadores de acceso

Los especificadores de acceso para un m´etodo Java puede ser cualquiera de los siguientes: public, private, protected, y package. Si no se indica el especificador entonces package es por defecto. Cuando se usa public significa que cualquier otra clase puede usarlo. Estos modificadores se aplican s´olo para el uso de los m´etodos por otras clases. Para que un m´etodo pueda ser usado sin instanciar un objeto se requiere el modificador static. Los m´etodos que no llevan este modificador son los m´etodos no est´aticos o de instancia.

2.2.

Tipo devuelto

El tipo devuelto describe el tipo de dato que el m´etodo manda de regreso al m´etodo que lo llam´o. No todos los m´etodos regresan un valor a los m´etodos invocadores; para indicar que no regresa nada se debe poner como tipo devuelto void

2.3.

Nombre del m´ etodo

El m´etodo de un nombre puede ser cualquier identificador legal, es decir, una palabra sin espacios y que no sea una palabra reservada. El m´etodo que se ejecuta primero cuando se ejecuta una aplicaci´on deber´a ser llamado main. 3

2.4.

Par´ entesis

Estos se ponen despu´es del identificador y podr´ıan contener datos que son enviados al m´etodo. En caso de que no tengan datos, los par´entesis est´an vac´ıos. El identificador calificado completamente es el nombre incluyendo la clase. Cuando se usa un m´etodo dentro de la misma clase, no se ocupa calificarlo completamente (aunque se puede hacer), es suficiente con el nombre del m´etodo. Pero si se quiere usar el m´etodo en otra clase se requiere calificarlo completamente. Como cuando se llama al m´etodo JOptionPane.showMessageDialog(). Dos clases diferentes pueden tener los nombres de los m´etodos repetidos. Dos clases en una aplicaci´on no pueden tener el mismo nombre.

3.

Par´ ametros en los m´ etodos

Algunos m´etodos requieren que se les env´ıen datos cuando sean llamados. Los elementos de datos que se usan en una llamada a un m´etodo se conocen como argumentos. Cuando el m´etodo recibe los elementos de datos, estos son llamados par´ ametros. Los m´etodos que reciben datos son flexibles porque puede dar resultados distintos dependiendo de los datos que recibieron. Si en un programa se dise˜ na un m´etodo para elevar al cuadrado valores num´ericos, tiene sentido dise˜ nar el m´etodo cuadrado para que el usuario proporcione un argumento que represente el valor que quiere elevar al cuadrado, en vez de tener que escribir m´etodos particulares que s´olo lo hagan para un valor particular. Algo similar ocurre cuando se usa el m´etodo println() que puede recibir cualquier argumento, si este m´etodo no pudiera aceptar argumentos, no ser´ıa pr´actico usarlo. Un principio de la programaci´on orientada al objeto es el ocultamiento de la implementaci´ on, la cual describe la encapsulaci´on de los detalles del m´etodo. Los m´etodos bien escritos usan este principio, as´ı un m´etodo que llama a otro s´olo debe saber el nombre y el tipo de informaci´on a mandar. Sin embargo, el cliente no necesita conocer como el m´etodo trabaja internamente (para manejar un autom´ovil no es necesario saber como funciona su mecanismo interno), es decir, s´olo necesita entender la interfaz para llamar al m´etodo. La interfaz es la u ´nica parte del m´etodo que el cliente ve o con la que interact´ ua.

3.1.

M´ etodos con un solo par´ ametro

Para escribir la declaraci´on de un m´etodo que pueda recibir un par´ametro, se ponen los especificadores de acceso opcional, el tipo que regresa el m´etodo y el nombre del m´etodo. Adem´as se debe incluir lo siguiente dentro de los par´entesis de la declaraci´on:

4

El tipo de par´ametro. Puede ser cualquier tipo de dato, incluyendo los tipos primitivos (int, double, etc.) o tipos de clase (String o PrintStream). Un nombre local para el par´ametro. Por ejemplo, la declaraci´on para un m´etodo p´ ublico llamado prediceIncremento() que acepte el salario anual de una persona y calcule un incremento del 10 por ciento se escribe como sigue: public static void prediceIncremento(double salario) En la cabecera del m´etodo prediceIncremento(), el par´ametro double salario dentro de los par´entesis indica que el m´etodo recibir´a un valor de tipo double. El c´odigo 2 muestra el m´etodo completo. 1 2 3 4 5 6 7

public s t a t i c void p r e d i c e I n c r e m e n t o ( double s a l a r i o ) { double nuevaCantidad ; f i n a l double INCREMENTO = 1 . 1 0 ; nuevaCantidad = s a l a r i o ∗ INCREMENTO; System . out . p r i n t l n ( ” El nuevo s a l a r i o con i n c r e m e n t o e s ” + nuevaCantidad ) ; }

C´odigo 2: M´etodo prediceIncremento() El m´etodo prediceIncremento() es un m´etodo void porque no necesita regresar alg´ un valor al m´etodo que lo llam´o. En la implementaci´on se recibe el valor salario, se multiplica por la constante INCREMENTO, y se muestra el resultado. El argumento para la llamada al m´etodo prediceIncremento() puede ser un valor constante, una variable, o una expresi´on. El par´ametro salario es un variable local para el m´etodo prediceIncremento(). La variable y la constante declaradas dentro del m´etodo son tambi´en locales.

3.2.

M´ etodo con m´ ultiples par´ ametros

Un m´etodo puede requerir m´as de un par´ametro. Se pueden pasar m´ ultiples argumentos a un m´etodo listando los argumentos en la llamada al m´etodo y separ´andolos con comas. Por ejemplo, en vez de tener un m´etodo prediceIncremento() que agrega un 10 por ciento de incremento, se podr´ıa preferir crear un m´etodo al cual se le puedan pasar dos valores, el salario que ser´a incrementado y el porcentaje en que se incrementa. El c´odigo 3 muestra un m´etodo que usa los dos par´ametros.

5

public s t a t i c void prediceIncrementoConTasa ( double s a l a r i o , double t a s a ) { double nuevaCantidad ; nuevaCantidad = s a l a r i o ∗ ( 1 + t a s a ) ; System . out . p r i n t l n ( ” El nuevo s a l a r i o con i n c r e m e n t o e s ” + nuevaCantidad ) ; }

1 2 3 4 5 6 7

C´odigo 3: M´etodo prediceIncrementoConTasa() Los dos par´ametros est´an dentro de los par´entesis en la cabecera del m´etodo. Una coma separa cada par´ametro, y cada par´ametro requiere su propia declaraci´on de tipo as´ı como su propio identificador. Se puede escribir un m´etodo que tome cualquier cantidad de par´ametros en cualquier orden. Cuando se llame al m´etodo, los argumentos enviados al m´etodos deben empatar en orden (cantidad y tipo) los par´ametros listados en la declaraci´on del m´etodo. La firma del m´etodo es la combinaci´on del nombre del m´etodo y la cantidad, tipos, y orden de los argumentos.

4.

M´ etodos que devuelven un valor

Un m´etodo termina cuando cualquiera de los siguientes eventos sucede: El m´etodo ejecuta todas sus sentencias. El m´etodo lanza una excepci´on. Las excepciones son errores El m´etodo alcanza la sentencia return. Esta sentencia hace que un m´etodo termine y que el flujo del programa regrese al m´etodo invocador. La sentencia return tambi´en puede regresar un valor al m´etodo invocador. El tipo devuelto por un m´etodo puede ser cualquier tipo usado en Java (tipos primitivos o tipos de clase). Un m´etodo tambi´en puede regresar nada, en el cual el tipo devuelto es void. El tipo regresado por el m´etodo tambi´en se conoce como tipo del m´ etodo. El m´etodo prediceIncremento() del c´odigo 2 no devuelve alg´ un valor, as´ı su tipo devuelto es void. Si se quiere que el m´etodo regrese el nuevo salario calculado en vez de mostrarlo, en el c´odigo 4 se muestra como debe hacerse.

6

public s t a t i c double p r e d i c e I n c r e m e n t o ( double s a l a r i o ) { double nuevaCantidad ; f i n a l double INCREMENTO = 1 . 1 0 ; nuevaCantidad = s a l a r i o ∗ INCREMENTO; return nuevaCantidad ; }

1 2 3 4 5 6

C´odigo 4: M´etodo prediceIncremento() devolviendo un double El tipo devuelto en la declaraci´on del m´etodo debe empatar con el tipo del valor usado en la sentencia return; si no se hace, la clase no se puede compilar. Un m´etodo puede regresar, a lo m´as, un valor. Nota. Todos los m´etodos excepto los void requiren una sentencia return que regrese un valor del tipo apropiado.

No se deben poner sentencias despu´es de la sentencia return de un m´etodo. Tales sentencias son inalcanzables porque el flujo l´ogico deja el m´etodo en la sentencia return. Las sentencias inalcanzables son tambi´en llamadas c´ odigo muerto. Si un m´etodo regresa un valor este se usa normalmente, sin embargo no se est´a obligado. Cuando se llame al m´etodo prediceIncremento, se podr´ıa querer asignar el valor regresado a una variable tipo double, como en la siguiente sentencia: miNuevoSalario = prediceIncremento(miSalario); Se puede tambi´en usar el valor devuelto por el m´etodo directamente, sin guardarlo en alguna variable. Por ejemplo se puede mostrar el valor regresado en la siguiente sentencia: System.out.println("El nuevo salario es " + prediceIncremento(miSalario)); Tambi´en se puede realizar aritm´etica con el valor devuelto por el m´etodo, como en la siguiente sentencia. double liquido = prediceIncremento(miSalario) - gastos;

5.

Clases y objetos

En la programaci´on orientada al objeto, todo es un objeto, y cada objeto es un miembro de una clase. Un programador podr´ıa decir que su perro chihuahua es una instancia de la clase 7

Perro. Esta sentencia representa una relaci´ on es-una. Un objeto es una instanciaci´ on de una clase, o un ejemplo tangible de una clase. El concepto de clase es u ´til por su reusabilidad. Los objetos obtienen sus atributos de sus clases, y todos los objetos tienen atributos predecibles porque son miembros de ciertas clases. Tambi´en los objetos tienen m´etodos asociados con ellos, y cada objeto que es una instancia de una clase posee los mismos m´etodos que otras instancias. En la programaci´on orientada al objeto se crean clases de las que se puede instanciar objetos, y otras veces se crean clases para ejecutar aplicaciones. Las clases aplicaci´on instancian objetos que usan los objetos de otras clases. En ocasiones se escriben clases para ambos casos. Se puede llamar a una aplicaci´on, o clase, que instancie objetos de otra clase preescrita clase cliente o clase de usuario.

6.

Creaci´ on de una clase

Para crear una clase, se debe asignar un nombre a la clase, y se deber´a determinar que datos y m´etodos ser´an parte de la clase. Suponer que se decide crear una clase llamada Empleado. Una variable de instancia de Empleado podr´ıa ser el n´ umero de empleado, y dos m´etodos necesarios podr´ıan ser el m´etodo para set (poner o dar un valor) al n´ umero de empleado y otro m´etodo para get (obtener o recuperar) el n´ umero del empleado. La cabecera de una clase tiene tres partes: Especificador de acceso opcional. Palabra reservada class. Un identificador legal para nombrar la clase. Una cabecera para una clase que representa un empleado podr´ıa ser: public class Empleado El modificador de clase public permite el mayor acceso posible. Las clases que son public son accesibles para todos los objetos, adem´as pueden ser extendidas (base para otras clases). De la clase Empleado se podr´ıan derivar las clases EmpleadoAsalariado y EmpleadoPorHoras sin requerir iniciar desde cero. Estas nuevas clases podr´ıan convertirse en una extensi´on de la original, heredando sus datos y sus m´etodos. Despu´es de escribir la cabecera de la clase se escribe el cuerpo de la clase encerrado entre un juego de llaves. El cuerpo contiene los datos y los m´etodos para la clase. Los componentes de datos de una clase son referidos como campos de datos para distinguirlos de otros componentes. Enseguida se muestra la construcci´on de la clase Empleado conteniendo el 8

campo de datos numEmp. Los campos de datos son variables que se declaran dentro de una clase pero fuera de cualquier m´etodo. public class Empleado { private int numEmp; } En el c´odigo previo, el campo de dato numEmp no est´a precedido por la palabra reservada static. Si hubiese sido insertada, s´olo un valor numEmp ser´ıa compartido por todos los objetos Empleado que sean instanciados. Como numEmp no est´a precedida por static, cuando se creen, o instancien, objetos de la clase, cada objeto tendr´a su propio numEmp. Un campo no est´atico, como numEmp, es una variable de instancia de la clase. Asignar acceso privado a un campo significa que ninguna otra clase puede acceder los valores del campo, y s´olo a los m´etodos de la misma clase se permite operar. El principio usado en tener acceso privado es llamado en ocasiones ocultamiento de informaci´ on. El resultado del arreglo de datos privados y m´etodos p´ ublicos da una forma de controlar hacia afuera el acceso de los datos. Los campos de datos de la clase son frecuentemente privados y no est´aticos. Los campos de datos que llevan public son los campos con static y final, es decir, cuando una clase contiene un valor que no cambia y no se requiere crear un objeto. Por ejemplo, la clase Math contiene un campo public llamado PI que puede usarse sin instanciar un objeto Math.

7.

M´ etodos de instancia

Adem´as de los datos, las clases contienen m´etodos. Los m´etodos que ponen o cambian valores de campos son llamados m´ etodos mutadores; m´etodos que recuperan valores son llamados m´ etodos accesores. En Java, se tiene la convenci´on de que los m´etodos mutadores inicien con set, y los accesores inicien con get. El siguiente c´odigo muestra el m´etodo accesor y el mutador para el campo numEmp para la clase Empleado. public void setNumEmp(int emp) { numEmp = emp; } public int getNumEmp() { return numEmp; } Observar que en los m´etodos anteriores no se usa el modificador static. Los m´ etodos no est´ aticos, tambi´en llamados m´ etodos de instancia, son usados con instanciaciones de objetos. Dentro de un objeto se pueden usar m´etodos static o no est´aticos, pero s´olo los 9

m´etodos no est´aticos se comportan de forma u ´nica para cada objeto. No se puede usar un m´etodo no est´atico sin un objeto.

7.1.

Organizaci´ on de clases

La mayor´ıa de las clases tienen varios campos de datos y m´etodos. Para la clase Empleado, adem´as del n´ umero del empleado, se necesita guardar apellidos, nombres y salario. El siguiente c´odigo muestra como se podr´ıan codificar los campos de datos para la nueva clase Empleado2. public class Empleado2 { private int numEmp; private String apellidoEmp; private String nombreEmp; private double salarioEmp; // los m´ etodos ir´ an aqu´ ı } Como hay dos componentes String en el c´odigo anterior, se podr´ıa declarar con la siguiente sentencia: private String apellidoEmp, nombreEmp; Se pueden poner los campos de datos y m´etodos en cualquier orden dentro de una clase. Se sigue la convenci´on de colocar todos los campos de datos primero para ver los nombres y los tipos de datos antes de leer los m´etodos que los usan. Para facilitar la localizaci´on de los m´etodos, muchos programadores los ponen en orden alfab´etico. Otros programadores ponen los m´etodos en pareja. En el c´odigo 5 se muestra la definici´on completa de la clase Empleado2.

10

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

public c l a s s Empleado2 { private int numEmp ; private S t r i n g apellidoEmp ; private S t r i n g nombreEmp ; private double salarioEmp ; public int getNumEmp ( ) { return numEmp ; } public void setNumEmp ( int empl ) { numEmp = empl ; } public S t r i n g getApellidoEmp ( ) { return apellidoEmp ; } public void setApellidoEmp ( S t r i n g nombre ) { apellidoEmp = nombre ; } public S t r i n g getNombreEmp ( ) { return nombreEmp ; } public void setNombreEmp ( S t r i n g nombre ) { nombreEmp = nombre ; } public double g et Sa l ar io E mp ( ) { return salarioEmp ; } public void s e t S a l a r i o E m p ( double s a l ) { salarioEmp = s a l ; } }

C´odigo 5: La clase Empleado2 con varios campos de datos y sus m´etodos correspondientes.

8.

Declaraci´ on de objetos y uso de sus m´ etodos

Declarar una clase no crea ning´ un objeto. Una clase es una descripci´on abstracta de lo que el objeto ser´a. Un proceso de dos pasos crea un objeto que es una instancia de una clase. Primero, se proporciona un tipo y un identificador (como cuando se declara cualquier variable) y despu´es se asigna memoria para ese objeto. Para declarar un Empleado se hace como sigue: Empleado2 unEmpleado; Cuando se declara la instancia unEmpleado de la clase Empleado2, se le est´a notificando al compilador que se usar´a el identificador unEmpleado. Para asignar la memoria necesitada 11

para un objeto, se debe usar el operador new. Las dos sentencias que apartan la memoria suficiente para tener un Empleado2 son: Empleado2 unEmpleado; unEmpleado = new Empleado2(); En vez de usar dos sentencias, se puede declarar y reservar memoria para unEmpleado en una sentencia, como se muestra enseguida: Empleado2 unEmpleado = new Empleado2(); En esta sentencia, unEmpleado se convierte en una referencia al objeto—el nombre para una direcci´on de memoria donde el objeto esta guardado. El signo de igual es el operador de asignaci´on, as´ı un valor es asignado a unEmpleado en la declaraci´on. El operador new est´a asignando una porci´on de la memoria no usada para unEmpleado. El valor que la sentencia le asigna a unEmpleado es una direcci´on de memoria en la cual el objeto se encuentra. En la parte final de la sentencia despu´es del operador new, Empleado2(), con sus par´entesis, es el nombre de un m´etodo especial, llamado constructor, que construye un objeto Empleado2. Se puede escribir el propio constructor para una clase, pero cuando no se escribe el constructor, Java proporciona uno. El constructor escrito por el programador, o el dado por Java, tienen el mismo nombre que clase de la cual los objetos son construidos. Despu´es de que un objeto ha sido instanciado, sus m´etodos pueden ser accedidos usando el identificador del objeto, un punto, y una llamada al m´etodo. En el c´odigo 6 de la clase DeclaraDosEmpleados se muestra una aplicaci´on que instancia dos objetos Empleado2. Los dos objetos usan los m´etodos setNumEmp() y getNumEmp() porque son p´ ublicos, y deben usarse con un objeto Empleado2 porque los m´etodos no son est´aticos. 1 2 3 4 5 6 7 8 9 10 11

public c l a s s DeclaraDosEmpleados { public s t a t i c void main ( S t r i n g [ ] a r g s ) { Empleado2 c h o f e r = new Empleado2 ( ) ; Empleado2 t e c n i c o = new Empleado2 ( ) ; c h o f e r . setNumEmp ( 1 2 3 ) ; t e c n i c o . setNumEmp ( 4 5 6 ) ; System . out . p r i n t l n ( ” El n´ u mero d e l c h o f e r e s ” + c h o f e r . getNumEmp ( ) + ” y e l n´ u mero d e l t´e c n i c o e s ” + t e c n i c o . getNumEmp ( ) ) ; } }

C´odigo 6: Clase DeclaraDosEmpleados.

12

9.

Constructores

Cuando se crea una clase, como Empleado, y se instancia un objeto con una sentencia como la siguiente, se est´a llamando al constructor de la clase Empleado que es proporcionado por defecto por el compilador de Java. Empleado mozo = new Empleado(); Un constructor establece un objeto; un constructor por defecto es uno que no requiere argumentos. Un constructor por defecto es creado autom´aticamente por el compilador Java para cualquier clase creada en la que no se haya escrito un constructor. Cuando se crea un objeto Java inicializa los campos de datos de un objeto de la siguiente forma: Campos num´ericos son puestos a cero. Campos char son puestos al codigo Unicode ’\u0000’ Campos booleanos son puestos a false. Campos que son referencias de objeto (como campos String) son puestos a null (vac´ıo). Si no se quiere esta inicializaci´on en los campos de un objeto, o se quieren realizar tareas adicionales, se puede escribir un contructor. Cualquier constructor deber´a tener el mismo nombre que la clase que declara, y los constructores no pueden tener un tipo devuelto. Los constructores se declaran p´ ublicos para que otras clases puedan instanciar objetos que pertenecen a esa clase. Cuando se escribe un constructor para una clase, ya no se tiene acceso al proporcionado autom´aticamente por Java. Si se quiere que cada objeto Empleado tenga por defecto un salario inicial de $2000.00 por semana, se podr´ıa escribir el constructor para la clase Empleado como se muestra enseguida: public Empleado() { salarioEmp = 2000.00; } Se puede escribir cualquier sentencia en un constructor. El constructor se coloca en cualquier lugar dentro de la clase y fuera de cualquier otro m´etodo. Frecuentemente, los programadores ponen primero el constructor porque es el primer m´etodo usado cuando un objeto es creado. No se obliga a escribir un constructor para un clase; Java da un constructor por defecto si la clase no contiene un constructor expl´ıcito. 13

10.

Clases como tipos de datos

Las clases que son creadas son tipos de datos. En ocasiones se refieren a las clases como Abstract Data Type (tipo de dato abstracto), o ADT. Un tipo de dato abstracto es un tipo cuya implementaci´on est´a oculta y se accede a trav´es de sus m´etodos p´ ublicos. Una clase tambi´en puede ser llamada como tipo de dato definido por el programador, es decir, es un tipo que no est´a construido en Java. Una clase es un tipo compuesto, la clase est´a compuesta por partes m´as peque˜ nas. Los tipos primitivos no son tipos compuestos. Los tipos primitivos pueden tambi´en ser llamados tipos escalares. Cuando se declara un objeto tipo primitivo, se proporciona su tipo e identificador. Cuando se declara un objeto de alguna clase, se hace lo mismo. Una vez que existen se pueden usar en formas muy similares. Por ejemplo, suponer que se declara un int llamado miEntero y un Empleado llamado miEmpleado. Entonces cada uno puede ser pasado a un m´etodo, regresado desde un m´etodo, o asignado a otro objeto del mismo tipo de dato. En el c´odigo 7 de la clase MetodosQueUsanEmpleado2 se muestra una aplicaci´on donde el m´etodo main() usa dos m´etodos. El m´etodo obtenerDatosEmpleado() regresa un objeto Empleado y el m´etodo mostrarEmpleado() acepta un objeto Empleado como par´ametro. El objeto Empleado es pasado y devuelto como cualquier tipo primitivo.

14

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

import j a v a . u t i l . Scanner ; c l a s s MetodosQueUsanEmpleado2 { public s t a t i c void main ( S t r i n g a r g s [ ] ) { Empleado2 miEmpleado ; miEmpleado = obtenerDatosEmpleado ( ) ; mostrarEmpleado ( miEmpleado ) ; } public s t a t i c Empleado2 obtenerDatosEmpleado ( ) { Empleado2 emplTemp = new Empleado2 ( ) ; int i d ; double s a l ; Scanner e n t r a d a = new Scanner ( System . i n ) ; System . out . p r i n t ( ” I n g r e s a r ID d e l empleado ” ) ; id = entrada . nextInt ( ) ; emplTemp . setNumEmp ( i d ) ; System . out . p r i n t ( ” I n g r e s a r e l s a l a r i o d e l empleado ” ) ; s a l = e n t r a d a . nextDouble ( ) ; emplTemp . s e t S a l a r i o E m p ( s a l ) ; return emplTemp ; } public s t a t i c void mostrarEmpleado ( Empleado2 empl ) { System . out . p r i n t l n ( ”\nEmpleado #”+empl . getNumEmp ( ) + ” S a l a r i o $ ” + empl . g et S al ar i oE mp ( ) ) ; } }

C´odigo 7: Aplicaci´on MetodosQueUsanEmpleado2.

15