Tema 1 - Programación Orientada a Objetos

download Tema 1 - Programación Orientada a Objetos

of 48

Transcript of Tema 1 - Programación Orientada a Objetos

  • ITSON Manuel Domitsu Kono

    Tema 1 Programacin Orientada a

    Objetos

    Objetos En la programacin orientada a objetos, POO, el problema a resolver se modela mediante componentes de cdigo llamados objetos que son abstracciones de los objetos, animados e inanimados, del mundo real. Una abstraccin es una representacin parcial de los atributos y comportamiento de un objeto real. Los atributos son las caractersticas que definen al objeto y el comportamiento representa lo que el objeto sabe hacer, su funcionalidad. El comportamiento de un objeto es modelado por piezas de cdigo llamados mtodos. Los atributos y comportamiento representados por el objeto son los que son relevantes al problema que se est modelando. Por ejemplo, supongamos que estamos simulando el comportamiento del consumo de combustible de un automvil: el objeto automvil tendr los atributos: coeficiente de arrastre, cilindrada del motor, aceleracin, presin de las llantas, peso, etc. Los mtodos que describen su comportamiento son: acelerar, frenar, desplegar velocidad, desplegar nivel de gasolina, etc. El color de la carrocera o el precio no sern atributos ya que no son relevantes en el problema bajo estudio, como tampoco lo sern obtener precio, establecer precio, obtener color, establecer color, etc. Es posible que un objeto real tenga dos o ms abstracciones, es decir, que sea modelado por dos o ms objetos dependiendo del problema que se este resolviendo. Por ejemplo, un automvil en un sistema de inventario tendr otros atributos como marca, modelo, color, precio, etc., pero no el coeficiente de arrastre ni la capacidad del tanque de combustible. Los mtodos son obtener precio, establecer precio, obtener color, establecer color, etc., pero no el acelerar, frenar, etc.

    Identificacin de los Objetos que Modelan un Problema El primer paso para modelar un problema usando la POO es la identificacin de los objetos que son relevantes para representar el problema. No todos los posibles objetos que podamos hallar son necesarios en nuestro modelo. Los primeros candidatos a ser objetos son los sustantivos (nombres comunes) en el enunciado de un problema. Por ejemplo considere el siguiente problema:

  • 2 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    Un amante de la msica y del cine desea catalogar su coleccin de msica y pelculas. Desea realizar consultas de msica por ttulo, autor, gnero, lbum, intrprete y perodo; mientras que para sus pelculas desea hacer consultas por ttulo, gnero, actor, directo y perodo.

    En este problema, los objetos ms obvios son cada una de las canciones y pelculas que el amante de la msica y el cine posee. Los atributos de cada cancin son: ttulo, gnero, intrprete, autor de letra, autor de msica, lbum, disquera, duracin y fecha; los de cada pelcula son: el ttulo, gnero, actores principales, director, compaa productora, duracin y fecha. Los mtodos de cada una de esas canciones y pelculas nos deben permitir obtener y establecer los valores de cada atributo, por ejemplo, establece nombre, obtn nombre, establece gnero, obtn gnero, etc. Sin embargo en este problema podra, de ser necesario, otros objetos como los intrpretes, autores, actores, directores, fechas, e inclusive objetos compuestos de objetos como lista de canciones, o listas de actores.

    Clases El segundo paso para modelar un problema usando la POO, es la clasificacin de los objetos que son relevantes para representar el problema en grupos de objetos que compartan el mismo tipo de atributos y mtodos. La lista de atributos y mtodos de cada grupo de objetos (un grupo podra estar formada por un slo objeto) se conoce como una clase, esto es, una clase son los atributos y mtodos comunes a un grupo de objetos. Una clase constituye una plantilla con la que se construyen objetos, se crean instancias de esa clase. Para representar una clase, sus atributos y sus mtodos podemos utilizar la notacin grfica empleada por los diagramas de clase del lenguaje UML (Lenguaje Unificado de Modelacin), que representa a una clase mediante un rectngulo subdividido a su vez en tres rectngulos. En el superior aparece el nombre de la clase, en el central los atributos y en el inferior sus mtodos. Por ejemplo, las clases cancin y pelcula del problema anterior estaran representados por los diagramas de la figura 1.1:

    Encapsulado Uno de los principios de la POO es la encapsulacin (los otros dos son la herencia y el polimorfismo). La encapsulacin es un mecanismo que permite agrupar los datos (atributos) y el cdigo (mtodos) que los manipulan y los mantiene alejados de posibles interferencias y usos indebidos. El acceso a los datos y mtodos es en forma controlada a travs de una interfaz bien definida. La base del encapsulado es la clase. Cada atributo y mtodo tiene asociado un modificador de acceso que establece quien tiene acceso a los atributos y mtodos de la clase. Los atributos y mtodos privados slo pueden ser accedidos por el cdigo dentro de la clase. Cualquier otro cdigo fuera de la

  • Tema 1 Programacin Orientada a Objetos 3

    ITSON Manuel Domitsu Kono

    clase no puede accederlos. Los atributos y mtodos pblicos son los que pueden ser accedidos desde fuera de la clase y constituyen la interfaz de la clase. En los diagramas de clase, los atributos y mtodos privados van precedidos de un signo menos (-) y los pblicos por un signo ms (+).

    +Cancion()+getClave() : String+setClave() : void+getTitulo() : String+setTitulo() : void+getGenero() : String+setGenero() : void+getInterprete() : String+setInterprete() : void+getAutorLetra() : String+setAutorLetra() : void+getAutorMusica() : String+setAutorMusica() : void+getAlbum() : String+setAlbum() : void+getDisquera() : String+setDisquera() : void+getDuracion() : int+setDuracion() : void+getFecha() : Fecha+setFecha() : void

    -clave : String-titulo : String-genero : String-interprete : String-autorLetra : String-autorMusica : String-album : String-disquera : String-duracion : int-fecha : Fecha

    Cancion

    +Pelicula()+getClave() : String+setClave() : void+getTitulo() : String+setTitulo() : void+getGenero() : String+setGenero() : void+getActor1() : String+setActor1() : void+getActor2() : String+setActor2() : void+getActor3() : String+setActor3() : void+getActor4() : String+setActor4() : void+getDirector() : String+setDirector() : void+getProductora() : String+setProductora() : void+getDuracion() : int+setDuracion() : void+getFecha() : Fecha+setFecha() : void

    -clave : String-titulo : String-genero : String-actor1 : String-actor2 : String-actor3 : String-actor4 : String-director : String-productora : String-duracion : int-fecha : Fecha

    Pelicula

    Figura 1.1

    Herencia El segundo principio de la POO es la herencia. El mecanismo de herencia permite:

    Que una clase herede las propiedades (atributos) y el comportamiento (mtodos) de otra clase, evitando tener que repetir el cdigo que se desea heredar.

    Agrupar en una clase las propiedades (atributos) y comportamiento (mtodos) comunes de dos o ms clases escribiendo en una sola clase el cdigo comn a esas clases. Esas clases heredan de la clase que tienen los atributos y mtodos comunes.

    La clase de las que heredan otras clases se conoce como superclase y las clases que heredan se llaman subclases. Una subclase es una versin

  • 4 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    especializada de una superclase, que hereda todos los atributos y mtodos de la superclase y le aade otros. Por ejemplo, si agrupamos los atributos y mtodos de las clases cancin y pelcula, del problema sobre el amante de la msica y el cine, en la clase Medio y de sta ltima hacemos que hereden las clases Cancion y Pelcula, tendramos el diagrama de clases mostrado en la figura 1.2: Como deseamos que los atributos de la superclase sean visibles dentro de sus subclases le asignamos el modificador de acceso protegido que en los diagramas de clase se denota con el smbolo de nmero (#). Note, que en los diagramas de clase la herencia se representa mediante una flecha con punta en forma de tringulo apuntando a la superclase.

    +Cancion()+getInterprete() : String+setInterprete() : void+getAutorLetra() : String+setAutorLetra() : void+getAutorMusica() : String+setrAutorMusica() : void+getAlbum() : String+setAlbum() : void+getDisquera() : String+setDisquera() : void+toString() : String

    -interprete : String-autorLetra : String-autorMusica : String-album : String-disquera : String

    Cancion

    +Pelicula()+getActor1() : String+setActor1() : void+getActor2() : String+setActor2() : void+getActor3() : String+setActor3() : void+getActor4() : String+setActor4() : void+getDirector() : String+setDirector() : void+getProductora() : String+setProductora() : void+toString() : String

    -actor1 : String-actor2 : String-actor3 : String-actor4 : String-director : String-productora : String

    Pelicula

    +Medio()+getClave() : String+setClave() : void+getTitulo() : String+setTitulo() : void+getGenero() : String+setGenero() : void+getDuracion() : int+setDuracion() : void+getFecha() : Fecha+setFecha() : void+toString() : String

    #clave : String#titulo : String#genero : String#duracion : int#fecha : Fecha

    Medio

    Figura 1.2

  • Tema 1 Programacin Orientada a Objetos 5

    ITSON Manuel Domitsu Kono

    Codificacin de Clases en Java El cdigo de una clase de Java se almacena en un archivo con el mismo nombre de la clase y con la extensin .java. Java hace distincin entre maysculas y minsculas.

    La sintaxis de una clase en Java es:

    [package nomPaquete;]

    [directivas import] public class NomClase { [declaraciones de atributos] [constructor]... [mtodo]... }

    Donde nomPaquete es el nombre del paquete en el que se almacenar el cdigo bytecode de la clase. Un paquete es una carpeta o subdirectorio que contiene una o ms clases que estn relacionadas. Los paquetes tienen una estructura jerrquica. Esto es, un paquete puede contener paquetes que a su vez pueden contener paquetes, etc., por lo que nomPaquete es la trayectoria al paquete deseado. Las directivas import permiten importar la definicin de una clase. La sintaxis de una directiva import es: import ruta.NomClase Donde ruta es la secuencia de paquetes, separados por puntos, que hay que seguir para llegar a la clase deseada NomClase. Nomclase es el nombre de la clase. Cada una de las declaraciones de atributos tiene la siguiente sintaxis:

    [modificadorAcceso] tipo nomAtributo[,nomAtributo]... Donde modificadorAcceso es el modificador de acceso del atributo. Los modificadores de acceso se usan para establecer el mbito de un identificador, es decir en que parte de un programa puede usarse el identificador. Los tipos de modificadores de acceso que se pueden emplear en las declaraciones de atributos y mtodos se muestran en la tabla 1. tipo es el tipo del atributo y puede ser uno de los tipos predefinidos (char, byte, short, int, long, float o double) o una clase.

  • 6 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    nomAtributo es el nombre del atributo

    Tabla 1. Modificadores de Acceso para los Atributos y Mtodos de una Clase

    Accesible para Modificador de

    Accesibilidad Clase Subclase Paquete Universal

    private S No No No Por omisin S No S No

    protected S S S No public S S S S

    Constructores Un constructor de una clase es un mtodo al que se invoca cuando se crea una instancia de esa clase. Realiza toda la inicializacin necesaria del nuevo objeto.

    Se puede definir cero, uno o ms constructores para una clase. Si no se define un constructor, el compilador crea uno por ausencia, el

    cual no tiene parmetros. Todos los constructores se crean por el mecanismo de sobrecarga. Esto

    es, tienen el mismo nombre que es el mismo de la clase y difieren en el nmero y tipo de parmetros.

    No se especifica el tipo que regresa el constructor. El nombre del constructor es el nombre de la clase.

    La sintaxis de un constructor es:

    public nomClase([lista de parmetros]) { [declaraciones de variables locales] sentencias }

    lista de parmetros es una lista de declaraciones de parmetros separadas por comas (,). Cada una de las declaraciones de parmetros tiene la siguiente sintaxis:

    tipo nomParametro Donde tipo es el tipo del parmetro y puede ser uno de los tipos predefinidos (char, byte, short, int, long, float o double) o una clase. nomParametro es el nombre del parmetro. Cada una de las declaraciones de variables locales tiene la siguiente sintaxis:

    tipo nomVariable[,nomVariable]...; Donde tipo es el tipo de la variable local y puede ser uno de los tipos predefinidos (char, byte, short, int, long, float o double) o una clase.

  • Tema 1 Programacin Orientada a Objetos 7

    ITSON Manuel Domitsu Kono

    nomVariable es el nombre de la variable local. Las sentencias pueden ser sentencias de expresin o simple, compuestas o bloques y de control.

    Mtodos La sintaxis de un mtodo es:

    [modificadorAcceso] tipo nomMtodo(lista de parmetros) { declaraciones de variables locales sentencias }

    Donde modificadorAcceso es el modificador de acceso del mtodo, los modificadores de acceso que pueden tener los mtodos se muestran en la tabla 1. tipo es el tipo del valor regresado por el mtodo y puede ser uno de los tipos predefinidos (char, byte, short, int, long, float o double) o una clase. nomMetodo es el nombre del mtodo. Los parmetros, las variables locales y las sentencias de los mtodos tienen la misma sintaxis que las de los constructores.

    Parmetros Un parmetro es un mecanismo mediante el cual un constructor o un mtodo reciben un valor que requiere para realizar su tarea. Ese valor, llamado argumento, le es enviado al constructor o al mtodo al invocarlos. Por cada parmetro que tenga la definicin de un constructor o de un mtodo deber haber un argumento en su invocacin y ese argumento deber ser del mismo tipo que el parmetro.

    Sobrecarga En una clase podemos tener dos o ms mtodos o constructores que tengan el mismo nombre y que se distingan por el nmero y/o tipo de sus parmetros. En este caso se dice que los mtodos o constructores estn sobrecargados. El cdigo de los mtodos o constructores son diferentes.

    Mtodos de Acceso Si se desea tener acceso a los atributos privados o protegidos de una clase podemos emplear mtodos llamados de acceso. Para el atributo

  • 8 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    tipo nomAtributo; los mtodos:

    public tipo getNomAtributo() { return nomAtributo; }

    nos regresa el valor del atributo y

    public void setNomAtributo(tipo nomParametro) { nomAtributo = nomparametro; }

    permite modificar el valor del atributo.

    Ejemplo sobre codificacin de una clase en Java El siguiente cdigo muestra la implementacin de la clase Medio del ejemplo sobre el amante de la msica y el cine.

    Medio.java package objetosNegocio; import objetosServicio.Fecha; /** * Title: AmanteMusica * Description: * Copyright: Copyright (c) 2004 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase contiene los atributos y mtodos comunes a las * clases Cancion y Pelicula del programa AmanteMusica */ public class Medio { protected String clave; protected String titulo; protected String genero; protected int duracion; protected Fecha fecha; /** * Constructor predeterminado */ public Medio() { } /** * Constructor que inicializa los atributos de la clase * @param clave Clave de la cancin o pelcula * @param titulo Ttulo de la cancin o pelcula * @param genero Gnero de la cancin o pelcula

  • Tema 1 Programacin Orientada a Objetos 9

    ITSON Manuel Domitsu Kono

    * @param duracion Duracin de la cancin o pelcula * @param fecha Fecha de liberacin de la cancin o pelcula */ public Medio(String clave, String titulo, String genero, int duracion, Fecha fecha) { this.clave = clave; this.titulo = titulo; this.genero = genero; this.duracion = duracion; this.fecha = fecha; } /** * Regresa la clave de la cancin o pelcula * @return Clave de la cancin o pelcula */ public String getClave() { return clave; } /** * Establece la clave de la cancin o pelcula * @param clave Clave de la cancin o pelcula */ public void setClave(String clave) { this.clave = clave; } /** * Regresa el ttulo de la cancin o pelcula * @return Titulo de la cancin o pelcula */ public String getTitulo() { return titulo; } /** * Establece el ttulo de la cancin o pelcula * @param titulo Titulo de la cancin o pelcula */ public void setTitulo(String titulo) { this.titulo = titulo; } /** * Regresa el gnero de la cancin o pelcula * @return Gnero de la cancin o pelcula */ public String getGenero() { return genero; } /** * Establece el gnero de la cancin o pelcula * @param genero Gnero de la cancin o pelcula */ public void setGenero(String genero) { this.genero = genero; } /**

  • 10 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    * Regresa la duracin de la cancin o pelcula * @return Duracin de la cancin o pelcula */ public int getDuracion() { return duracion; } /** * Establece la duracin de la cancin o pelcula * @param duracion Duracin de la cancin o pelcula */ public void setDuracion(int duracion) { this.duracion = duracion; } /** * Regresa la fecha de liberacin de la cancin o pelcula * @return Fecha de liberacin de la cancin o pelcula */ public Fecha getFecha() { return fecha; } /** * Establece la fecha de liberacin de la cancin o pelcula * @param fecha Fecha de liberacin de la cancin o pelcula */ public void setFecha(Fecha fecha) { this.fecha = fecha; } /** * Regresa una cadena con los valores de los atributos de una * instancia de la clase * @return Cadena con los valores de los atributos */ public String toString() { return clave + ", " + titulo + ", " + genero + ", " + duracion + ", " + fecha; } } Note que por convencin, en la codificacin de las clases:

    Los nombres de los paquetes empiezan con una letra minscula. Los nombres de las clases empiezan con una letra mayscula. Los nombres de los atributos empiezan con una letra minscula. Los nombres de los mtodos empiezan con una letra minscula. En los identificadotes compuestos por dos o ms palabras, las palabras

    siguientes a la primera empiezan con una letra mayscula. Una alternativa es separar las palabras con el carcter (_).

    Los identificadores de los mtodos de acceso empiezan con las palabras get y set seguidas del nombre del atributo con la primera letra de ste en maysculas.

  • Tema 1 Programacin Orientada a Objetos 11

    ITSON Manuel Domitsu Kono

    Codificacin de SubClases en Java La sintaxis para definir una subclase es la siguiente:

    [package nomPaquete;]

    [directivas import] public class NomClase extends NomSuperClase{ [declaraciones de atributos] [constructor]... [mtodo]... }

    La palabra reservada extends establece que la clase dada por NomClase hereda de la clase NomSuperClase. Los atributos, constructores y mtodos declarados y definidos aqu son propios de la subclase. Los atributos y mtodos de la superclase tambin forman parte de la subclase y los puede acceder directamente a menos que sus modificadores de acceso sean privados.

    Constructores en las Subclases Si la superclase tiene uno o ms constructores y ninguno de ellos es el constructor por ausencia, entonces todos los constructores de una subclase de esa superclase deben de invocar a uno de los constructores de la superclase y esa invocacin debe ser la primera instruccin del constructor. Lo anterior se debe a que cuando se crea un objeto de una subclase primero debe llamarse al constructor de la superclase. La invocacin de uno de los constructores de la superclase tiene la siguiente sintaxis:

    super(lista de los argumentos); La palabra reservada super es una referencia a la clase padre de la clase en que se usa dicha palabra. Los listados siguientes muestran el cdigo de las clases Cancion y Pelcula, las cuales heredan de la clase Medio.

    Cancion.java package objetosNegocio; import java.util.Vector; import objetosServicio.Fecha; /** * Title: AmanteMusica * Description:

  • 12 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    * Copyright: Copyright (c) 2004 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase contiene los atributos y mtodos de una cancin del * programa AmanteMusica */ public class Cancion extends Medio { private String interprete; private String autorLetra; private String autorMusica; private String album; private String disquera; /** * Constructor predeterminado */ public Cancion() { super(); } /** * Constructor que inicializa los atributos de la clase * @param clave Clave de la cancin * @param titulo Ttulo de la cancin * @param genero Gnero de la cancin * @param interprete Intrprete de la cancin * @param autorLetra Autor de la letra de la cancin * @param autorMusica Autor de la msica de la cancin * @param album lbum de la cancin * @param disquera Disquera de la cancin * @param duracion Duracin de la cancin * @param fecha Fecha de liberacin de la cancin */ public Cancion(String clave, String titulo, String genero, String interprete, String autorLetra, String autorMusica, String album, String disquera, int duracion, Fecha fecha) { super(clave, titulo, genero, duracion, fecha); this.interprete = interprete; this.autorLetra = autorLetra; this.autorMusica = autorMusica; this.album = album; this.disquera = disquera; } /** * Constructor que inicializa el atributo clave * @param clave Clave de la cancin */ public Cancion(String clave) { this(clave, null, null, null, null, null, null, null, 0, null); } /** * Regresa el intrpretede la cancin * @return Intrpretede la cancin */

  • Tema 1 Programacin Orientada a Objetos 13

    ITSON Manuel Domitsu Kono

    public String getInterprete() { return interprete; } /** * Establece el intrprete de la cancin * @param interprete Intrpretede la cancin */ public void setInterprete(String interprete) { this.interprete = interprete; } /** * Regresa el autor de la letra de la cancin * @return Autor de la letra de la cancin */ public String getAutorLetra() { return autorLetra; } /** * Establece el autor de la letra de la cancin * @param autorLetra Autor de la letra de la cancin */ public void setAutorLetra(String autorLetra) { this.autorLetra = autorLetra; } /** * Regresa el autor de la msica de la cancin * @return Autor de la msica de la cancin */ public String getAutorMusica() { return autorMusica; } /** * Establece el autor de la msica de la cancin * @param autorMusica Autor de la msica de la cancin */ public void setAutorMusica(String autorMusica) { this.autorMusica = autorMusica; } /** * Regresa el lbum de la cancin * @return lbum de la cancin */ public String getAlbum() { return album; } /** * Establece el lbum de la cancin * @param album lbum de la cancin */ public void setAlbum(String album) { this.album = album; } /**

  • 14 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    * Regresa la disquera de la cancin * @return Disquera de la cancin */ public String getDisquera() { return disquera; } /** * Establece la disquera de la cancin * @param disquera Disquera de la cancin */ public void setDisquera(String disquera) { this.disquera = disquera; } /** * Regresa una cadena con los valores de los atributos de una * instancia de la clase * @return Cadena con los valores de los atributos de la clase */ public String toString() { return super.toString() + ", " + interprete + ", " + autorLetra + ", " + autorMusica + ", " + album + ", " + disquera; } }

    Pelicula

    package objetosNegocio; import java.util.Vector; import objetosServicio.Fecha; /** * Title: AmanteMusica * Description: * Copyright: Copyright (c) 2004 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase contiene los atributos y mtodos de una pelcula * del programa AmanteMusica */ public class Pelicula extends Medio { private String actor1; private String actor2; private String actor3; private String actor4; private String director; private String productora; /** * Constructor predeterminado */ public Pelicula() { } /** * Constructor que inicializa los atributos de la clase

  • Tema 1 Programacin Orientada a Objetos 15

    ITSON Manuel Domitsu Kono

    * @param clave Clave de la pelcula * @param titulo Ttulo de la pelcula * @param actor1 Primer actor de la pelcula * @param actor2 Segundo actor de la pelcula * @param actor3 Tercer actor de la pelcula * @param actor4 Cuarto actor de la pelcula * @param director Director de la pelcula * @param genero Gnero de la pelcula * @param productora Productora de la pelcula * @param duracion Duracin de la pelcula * @param fecha Fecha de liberacin de la pelcula */ public Pelicula(String clave, String titulo, String actor1, String actor2, String actor3, String actor4, String director, String genero, String productora, int duracion, Fecha fecha) { super(clave, titulo, genero, duracion, fecha); this.actor1 = actor1; this.actor2 = actor2; this.actor3 = actor3; this.actor4 = actor4; this.director = director; this.productora = productora; } /** * Constructor que inicializa el atributo clave * @param clave Clave de la cancin */ public Pelicula(String clave) { this(clave, null, null, null, null, null, null, null, null, 0, null); } /** * Regresa el primer actor de la pelcula * @return Primer actor de la pelcula */ public String getActor1() { return actor1; } /** * Establece el primer actor de la pelcula * @param actor1 Primer actor de la pelcula */ public void setActor1(String actor1) { this.actor1 = actor1; } /** * Regresa el segundo actor de la pelcula * @return Segundo actor de la pelcula */ public String getActor2() { return actor2; } /** * Establece el segundo actor de la pelcula * @param actor2 Segundo actor de la pelcula

  • 16 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    */ public void setActor2(String actor2) { this.actor2 = actor2; } /** * Regresa el tercer actor de la pelcula * @return Tercer actor de la pelcula */ public String getActor3() { return actor3; } /** * Establece el tercer actor de la pelcula * @param actor3 Tercer actor de la pelcula */ public void setActor3(String actor3) { this.actor3 = actor3; } /** * Regresa el cuarto actor de la pelcula * @return Cuarto actor de la pelcula */ public String getActor4() { return actor4; } /** * Establece el cuarto actor de la pelcula * @param actor4 Cuarto actor de la pelcula */ public void setActor4(String actor4) { this.actor4 = actor4; } /** * Regresa el director actor de la pelcula * @return Director actor de la pelcula */ public String getDirector() { return director; } /** * Establece el director actor de la pelcula * @param director Director actor de la pelcula */ public void setDirector(String director) { this.director = director; } /** * Regresa la productora de la pelcula * @return Productora de la pelcula */ public String getProductora() { return productora; }

  • Tema 1 Programacin Orientada a Objetos 17

    ITSON Manuel Domitsu Kono

    /** * Establece la productora de la pelcula * @param productora */ public void setProductora(String productora) { this.productora = productora; } /** * Regresa una cadena con los valores de los atributos de una * instancia de la clase * @return Cadena con los valores de los atributos de la clase */ public String toString() { return super.toString() + ", " + actor1 + ", " + actor2 + ", " + actor3 + ", " + actor4 + ", " + director + ", " + productora; } }

    Clases Finales Si no deseamos que de una clase se hereden clases, debemos declarar esa clase como final, utilizando el modificador final. La sintaxis de una clase final es la siguiente:

    [package nomPaquete;]

    [directivas import]

    public final class NomClase { [declaraciones de atributos] [constructor]... [mtodo]... }

    Por ejemplo, la clase java.util.Math de la API de Java, est declarada como:

    public final class Math { public static final double PI = 3.141592653589793d; ... public static double sqrt(double a) {...} ... }

    Polimorfismo El tercer principio de la POO es el polimorfismo. El polimorfismo permite que una subclase redefina el comportamiento de un mtodo de su superclase. Esa redefinicin o sobreescritura de mtodos se da cuando la superclase y la subclase tienen un mtodo que tiene la misma firma (el mismo nombre y la misma lista de parmetros) y el mismo tipo (Tipo del valor que regresan), pero difieren en el cuerpo del mtodo.

  • 18 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    Si en la subclase invocamos a un mtodo sobrescrito, el mtodo invocado ser el de la subclase ya que el mtodo de la superclase queda oculto por su homnimo de la subclase ya que tienen el mismo nombre. Si queremos invocar al mtodo sobrescrito de la superclase podemos hacerlo usando la siguiente sintaxis:

    super.nomMetodoSuperClase(lista de argumentos) Como un ejemplo de polimorfismo tenemos al mtodo toString() de la superclase Medio de los listados anteriores y que es sobrescrito en las subclases de Medio: Cancion y Pelicula.

    Mtodos Finales Si deseamos que un mtodo de una superclase no sea sobrescrito en una de sus subclases, debemos declarar ese mtodo como final, usando el modificador final. La sintaxis de un mtodo final es la siguiente:

    [modificadorAcceso] final tipo nomMtodo(lista de parmetros) { declaraciones de variables locales sentencias }

    Creacin de Objetos Ya se mencion que una clase constituye una plantilla con la que se construyen objetos, se crean instancias de esa clase. La forma ms comn de crear un objeto es mediante el operador new. El operador new crea una instancia de una clase y devuelve una referencia a esa instancia. La sintaxis de la creacin de un objeto usando el operador new es: new constructor; Donde constructor es uno de los constructores de la clase. Si la definicin de la clase no provee un constructor, se utiliza el constructor por ausencia. Por ejemplo las siguientes lneas de cdigo crean dos objetos de tipo Cancin: new Cancion(); new Cancion(C0001, The long and winding way, Balada, The Beatles, John Lennon, Paul McCartney,

    Let it be, Apple, 194, new Fecha(24, 3, 1970));

  • Tema 1 Programacin Orientada a Objetos 19

    ITSON Manuel Domitsu Kono

    Referencias a Objetos Ya se mencion que el tipo de un atributo, de un parmetro o de una variable local puede ser una clase. En estos casos se dice que el atributo, parmetro o variable es una referencia. Una referencia es un identificador asociado a una instancia de clase (objeto) y nos sirve para referirnos a ese objeto. Para que un atributo o una variable local hagan referencia a un objeto, debemos asignrselo. La sintaxis de la asignacin es la siguiente:

    {nomAtributo | nomVariable} = objeto; Podemos crear un objeto y al mismo tiempo asignrselo a un atributo o variable. La sintaxis es la siguiente:

    {nomAtributo | nomVariable} = new constructor;

    Por ltimo, podemos combinar la declaracin de un atributo o variable local, la creacin de un objeto y sus asociacin con la siguiente sintaxis:

    tipo {nomAtributo | nomVariable} = new constructor; Por ejemplo:

    Cancion cancion1 = new Cancion(C0001, The long and winding way,

    Balada, The Beatles, John Lennon,

    Paul McCartney, Let it be, Apple, 194, new Fecha(24, 3, 1970)); Fecha fecha1 = new Fecha(1, 8, 1965);

    Cancion cancion2, cancion3; cancion2 = cancion1; cancion3 = new Cancion((C0002, Yesterday, Balada, The Beatles, Paul McCartney, John Lennon, Help!,Parlophone, 123, fecha1);

    En el ejemplo anterior se crean dos objetos de tipo Cancion y se les asigna a las referencias cancion1 y cancion3. Por otro lado, en la sentencia:

    cancion2 = cancion1;

    le estamos asignado a la referencia cancion2 el mismo objeto asignado a la referencia cancion1. Esto es, tanto cancion1 como cancion2 hacen referencia al mismo objeto. No a objetos diferentes.

  • 20 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    La asociacin entre un parmetro y el objeto al que hace referencia ocurre en el momento de la invocacin del mtodo. Por ejemplo, en el cdigo anterior tenemos dos ejemplos de cmo el parmetro fecha del constructor de la clase Cancion se asocia a un objeto. En el primer caso, en la creacin del objeto cancion1, el parmetro fecha hace referencia al objeto new Fecha(24, 3, 1970) creado en el momento de la invocacin. En el segundo caso, en la creacin del objeto cancion3, el parmetro fecha hace referencia al objeto fecha1, creado previamente.

    Referencias y Herencia A una referencia a una superclase podemos asignarle una instancia de una se sus subclases. Por ejemplo:

    Medio medio; Cancion cancion1 = new Cancion(C0001, The long and winding way,

    Balada, The Beatles, John Lennon,

    Paul McCartney, Let it be, Apple, 194, new Fecha(24, 3, 1970)); medio = cancion1;

    En el ejemplo anterior, la clase Cancion hereda de la clase medio y podemos ver que a la referencia medio que es del tipo Medio le estamos asignando un objeto de tipo Cancion que hereda del tipo Medio. Por otro lado a una referencia de una subclase no podemos asignarle una instancia de su clase padre.

    Cancion cancion2 = medio; Generara un error de ejecucin. Una excepcin.

    Acceso a los Atributos y Mtodos de una Instancia de una Clase Para acceder a los atributos y mtodos pblicos de una clase (o con modificador de acceso predeterminado desde otra clase en el mismo paquete), se utiliza la siguiente sintaxis:

    nomObjeto.nomAtributo o

    nomObjeto.nomMetodo(lista de argumentos)

  • Tema 1 Programacin Orientada a Objetos 21

    ITSON Manuel Domitsu Kono

    Por ejemplo:

    cancin1.setTitulo(Norwegian Wood); String artista = cancion1.getInterprete();

    Acceso a los Atributos y Mtodos y Herencia Si a una referencia de una superclase le asignamos una instancia de una subclase, slo podremos acceder a los atributos y mtodos de la superclase. Por ejemplo, dadas las declaraciones y asignaciones siguientes:

    Medio medio; Cancion cancion1 = new Cancion(C0001, The long and winding way,

    Balada, The Beatles, John Lennon,

    Paul McCartney, Let it be, Apple, 194, new Fecha(24, 3, 1970)); medio = cancion1;

    Las siguiente sentencias sera vlida:

    medio.setTitulo(Norwegian Wood); pero la siguiente no:

    String artista = medio.getInterprete(); ya que getInterprete() no es un mtodo de Medio sino de Cancion. En lugar de ello tendramos que escribir:

    String artista = ((Cancion)medio).getInterprete(); para convertir la referencia medio de ser una referencia a Medio a una referencia a Cancion. Como ejemplo de creacin de objetos, referencia a objetos, acceso a atributos y mtodos de un objeto se muestra la clase Prueba1 que se utiliza para probar las clases del paquete objetosnegocio del programa sobre el amante de la msica y el cine. En el mtodo main() de esta clase se crean instancias de las clases Cancion y Pelicula y se acceden a sus mtodos de acceso para obtener y modificar sus atributos.

    Prueba1.java package pruebas; import objetosServicio.Fecha; import objetosNegocio.*; /** *

  • 22 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    * Title: Amante Musica Objetos Negocio * Description: * Copyright: Copyright (c) 2004 * Company: ITSON * @author mdomitsu * @version 1.0 */ /** * Esta clase se utiliza para probar las clases Cancion y Pelicula */ public class Prueba1 { /** * Mtodo main() en el que se invocan a los mtodos de las clases * Cancion y Pelicula para probarlos * @param argumentos Los argumentos en la lnea de comando */ public static void main(String[] args) { // Se crean tres canciones Cancion cancion1 = new Cancion("C0001", "The long and winding road", "Balada", "The Beatles", "John Lennon", "Paul McCartney", "Let it be", "Apple", 3, new Fecha(24, 3, 1970)); Cancion cancion2 = new Cancion("C0002", "Garota de Ipanema", "Bossanova", "Los Indios Tabajaras", "Antonio Carlos Jobim", "Antonio Carlos Jobim", "Bossanova Jazz Vol. 1", "Prodisc", 3, new Fecha(1, 12, 1970)); Cancion cancion3 = new Cancion("C0003", "Desafinado", "Bossanova", "Joao Gilberto", "Joao Gilberto", "Joao Gilberto", "Bossanova Jazz Vol. 1", "Prodisc", 3, new Fecha(3, 12, 1980)); // Se despliegan los datos de la cancin 1 System.out.println("Cancion 1"); System.out.println(cancion1); // Se despliegan los datos de la cancin 2 System.out.println("Cancion 2"); System.out.println(cancion2); // Se despliegan los datos de la cancin 3 System.out.println("Cancion 3"); System.out.println(cancion3); // Se despliega el titulo de la cancin 1 System.out.print("Titulo de la cancin 1: "); System.out.println(cancion1.getTitulo()); // Se despliega la fecha de la cancin 2 System.out.print("Fecha de la cancin 2: "); System.out.println(cancion2.getFecha()); // Se cambia el autor de la msica de la cancin 3 cancion3.setAutorMusica("Antonio Carlos Jobim"); // Se despliegan los datos de la cancin 3 System.out.println("Cancion 3 con el nuevo autor de la msica");

  • Tema 1 Programacin Orientada a Objetos 23

    ITSON Manuel Domitsu Kono

    System.out.println(cancion3); // Se crean dos peliculas Pelicula pelicula1 = new Pelicula("P000001", "Casa Blanca", "Humphrey Bogart", "Ingrid Bergman", "", "", "Michael Curtiz", "Drama", "Warner Brothers", 102, new Fecha(1, 1, 1942)); Pelicula pelicula2 = new Pelicula("P000002", "2001 Space Odyssey", "Keir Dullea", "Gary Lockwood", "William Sylvester", "Daniel Richter", "Stanley Kubrick", "Ciencia Ficcin", "Metro-Goldwyn-Mayer", 141, new Fecha(1, 1, 1968)); // Se despliegan los datos de la pelcula 1 System.out.println("Pelicula 1"); System.out.println(pelicula1); // Se despliegan los datos de la pelcula 2 System.out.println("Pelicula 2"); System.out.println(pelicula2); // Se despliega el titulo de la pelcula 1 System.out.print("Titulo de la pelcula 1: "); System.out.println(pelicula1.getTitulo()); // Se despliega la productora de la pelcula 2 System.out.print("Productora de la pelcula 2: "); System.out.println(pelicula2.getProductora()); } }

    Mtodos Abstractos y Clases Abstractas Muchas veces, la superclase describe en forma general el comportamiento que tendrn sus subclases. Esto es, debido a su generalidad, no todos los mtodos de una superclase pueden definirse (slo se declaran) y su definicin se posterga para sus subclases. Esos mtodos de la superclase que slo se declaran se conocen como abstractos. La sintaxis de una declaracin de un mtodo abstracto es:

    [modificadorAcceso] abstract tipo nomMtodo(lista de parmetros);

    Una clase que contiene al menos un mtodo abstracto tambin es una clase abstracta. Su sintaxis es:

    [package nomPaquete;]

    [directivas import]

  • 24 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    public abstract class NomClase { [declaraciones de atributos] [constructor]... [mtodo]... [declaracin de un mtodo abstracto]... }

    No se puede instanciar una clase abstracta, esto es no podemos crear objetos de una clase abstracta. Si una clase que hereda de una clase abstracta no implementa todos los mtodos abstractos de su superclase debe ser declarada abstracta a su vez. Como ejemplo de mtodos abstractos y clases abstractas tenemos el siguiente problema:

    Una fbrica de silos para granos produce silos de tres tipos: Cilndricos, cnicos y esfricos. Al fabricante de silos le interesa saber cunta lmina debe emplear para cada silo y la capacidad del silo. Para ello debe conocer la superficie que tendr cada silo y su volumen.

    El diagrama de clases para el programa a construirse se muestra en la figura 1.3:

    +Silo()+calculaSuperficie() : double+calculaVolumen() : double

    #tipoSilo : String#superficie : double#volumen : double

    Silo

    +SiloCilindro()+calculaSuperficie() : double+calculaVolumen() : double+toString() : String

    -radio : double-altura : double

    SiloCilindro

    +SiloCono()+calculaSuperficie() : double+calculaVolumen() : double+toString() : String

    -radio : double-altura : double

    SiloCono

    +SiloEsfera()+calculaSuperficie() : double+calculaVolumen() : double+toString() : String

    -radio : doubleSiloEsfera

    Figura 1.3. Diagrama de clases del problema del fabricante de Silos

    El atributo tipoSilo de la clase Silo es una cadena: Silo Cilndrico,

    Silo Cnico o Silo Esfrico.

    El constructor de la clase Silo inicializa el atributo tipoSilo al valor de su parmetro.

    Los mtodos calculaSuperficie() y calculaVolumen, para calcular la superficie y el volumen del silo, de la clase Silo son abstractos, sus definiciones estn en sus clases hijas.

  • Tema 1 Programacin Orientada a Objetos 25

    ITSON Manuel Domitsu Kono

    Los constructores de las clases SiloCilindro, SiloCono y SiloEsfera le dan nombre al silo, inicializan los atributos con las dimensiones del silo, as como calculan la superficie y el volumen del silo, usando los mtodos calculaSuperficie() y calculaVolumen().

    Los mtodos calculaSuperficie() y calculaVolumen() de las clases SiloCilindro, SiloCono y SiloEsfera calculan la superficie y el volumen de sus respectivos silos empleando las siguientes frmulas:

    Superficie Volumen

    Silo Cilndrico )(2 hrr + hr 2 Silo Cnico )( 22 hrrr ++ hr 2

    31

    Silo Esfrico 24 r 334 r

    El mtodo toString() para que regrese una cadena con el tipo de

    silo, sus dimensiones, su superficie y su volumen.

    La codificacin de las clases Silo, SiloCilindro, SiloCono y SiloEsfera se muestra a continuacin:

    Silo.java package silos; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase abstracta es la clase padre de las clases SiloCilindro, * SiloCono y SiloEsfera */ public abstract class Silo { protected String tipoSilo; protected double superficie; protected double volumen; /** * Constructor. Inicializa el atributo tipoSilo. * @param tipoSilo Tipo de silo: "Cilindro", "Cono", "Esfera" */ public Silo(String tipoSilo) { this.tipoSilo = tipoSilo; } public abstract double calculaSuperficie(); public abstract double calculaVolumen(); /**

  • 26 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    * Genera una cadena con la representacin de una instancia de esta * clase * @return Una cadena con la representacin de una instancia de * esta clase */ public String toString() { return tipoSilo; } }

    SiloCilindro.java

    package silos; import java.math.*; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2004 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase permite crear objetos de tipo SiloCilindro */ public class SiloCilindro extends Silo { private double radio; private double altura; /** * Construye un objeto de esta clase e inicializa sus atributos * @param radio Radio del silo cilndrico * @param altura Altura del silo cilndrico */ public SiloCilindro(double radio, double altura) { // Llama al constructor de la clase padre: Silo super("Silo Cilndrico"); this.radio = radio; this.altura = altura; // Calcula el volumen del silo cilndrico volumen = calculaVolumen(); // Calcula la superficie del silo cilndrico superficie = calculaSuperficie(); } /** * Calcula el volumen del cilindro * @return El volumen del cilindro */ public double calculaVolumen() { return Math.PI * radio * radio * altura; } /** * Calcula la superficie del cilindro * @return La superficie del cilindro */ public double calculaSuperficie() {

  • Tema 1 Programacin Orientada a Objetos 27

    ITSON Manuel Domitsu Kono

    return 2 * Math.PI * radio * (radio + altura); } /** * Genera una cadena con los valores de los atributos de la clase * @return Una cadena con los valores de los atributos de la clase */ public String toString() { return super.toString() + ", radio = " + radio + ", altura = " + altura + ", superficie = " + superficie + ", volumen = " + volumen; } }

    SiloCono.java

    package silos; import java.math.*; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2004 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase permite crear objetos de tipo SiloCono */ public class SiloCono extends Silo { private double radio; private double altura; /** * Construye un objeto de esta clase e inicializa sus atributos * @param radio Radio del silo conco * @param altura Altura del silo conco */ public SiloCono(double radio, double altura) { // Llama al constructor de la clase padre: Silo super("Silo Cnico"); this.radio = radio; this.altura = altura; // Calcula el volumen del silo conco volumen = calculaVolumen(); // Calcula la superficie del silo conco superficie = calculaSuperficie(); } /** * Calcula el volumen del cono * @return El volumen del cono */ public double calculaVolumen() { return Math.PI * radio * radio * altura / 3; } /**

  • 28 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    * Calcula la superficie del cono * @return La superficie del cono */ public double calculaSuperficie() { return Math.PI * radio * (radio + Math.sqrt(radio * radio + altura * altura)); } /** * Genera una cadena con los valores de los atributos de la clase * @return Una cadena con los valores de los atributos de la clase */ public String toString() { return super.toString() + ", radio = " + radio + ", altura = " + altura + ", superficie = " + superficie + ", volumen = " + volumen; } }

    SiloEsfera.java

    package silos; import java.math.*; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2004 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase permite crear objetos de tipo SiloEsfera */ public class SiloEsfera extends Silo { private double radio; /** * Construye un objeto de esta clase e inicializa sus atributos * @param radio Radio del silo esfrico */ public SiloEsfera(double radio) { // Llama al constructor de la clase padre: Silo super("Silo Esfrico"); this.radio = radio; // Calcula el volumen del silo esfrico volumen = calculaVolumen(); // Calcula la superficie del silo esfrico superficie = calculaSuperficie(); } /** * Calcula el volumen de la esfera * @return El volumen de la esfera */ public double calculaVolumen() { return 4 * Math.PI * radio * radio * radio/3; }

  • Tema 1 Programacin Orientada a Objetos 29

    ITSON Manuel Domitsu Kono

    /** * Calcula la superficie de la esfera * @return La superficie de la esfera */ public double calculaSuperficie() { return 4 * Math.PI * radio * radio; } /** * Genera una cadena con los valores de los atributos de la clase * @return Una cadena con los valores de los atributos de la clase */ public String toString() { return super.toString() + ", radio = " + radio + ", superficie = " + superficie + ", volumen = " + volumen; } } Para probar las clases anteriores podemos emplear la siguiente clase de prueba:

    PruebaSilo.java package silos; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase se utiliza para probar las clases SiloCilindro, SiloCono * y SiloEsfera */ public class PruebaSilo { /** * Mtodo main() en el que se invocan a los mtodos de las clases * SiloCilindro, SiloCono y SiloEsfera para probarlos * @param argumentos Los argumentos en la lnea de comando */ public static void main(String[] args) { PruebaSilo pruebaSilo1 = new PruebaSilo(); Silo silo[]=new Silo[5]; silo[0]=new SiloCilindro(1.0, 1.0); silo[1]=new SiloEsfera(1.0); silo[2]=new SiloCono(1.0, 1.0); silo[3]=new SiloCilindro(2.0, 1.0); silo[4]=new SiloCilindro(1.0, 2.0); for (int i = 0; i < 5; i++) System.out.println(silo[i]); } }

  • 30 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    Atributos y Mtodos Estticos Cuando creamos varias instancias de una misma clase, cada instancia tiene su propia copia de cada atributo. Sin embargo hay ocasiones en las que deseamos que de un atributo de una clase slo haya una copia y que todas las instancias de esa clase compartan ese atributo. En esos casos debemos declarar al atributo como esttico usando el modificador static. La sintaxis para un atributo esttico es la siguiente:

    [modificadorAcceso] static tipo nomAtributo Por ejemplo suponga que en el ejemplo de la fbrica de silos, deseramos llevar la cuenta de las instancias de silos creados. Podramos definir un atributo esttico llamado contadorSilos y hacer que el constructor de la clase incrementara en uno su valor cada vez que se creara una instancia de la clase, ver el ejemplo sobre Atributos y Mtodos Estticos en la siguiente seccin. A un atributo puede aplicarse los modificadores static y final al mismo tiempo. Por ejemplo, el atributo PI de la clase Math:

    public final class Math { public static final double PI = 3.141592653589793d; ... }

    No se requiere instanciar una clase para usar sus atributos estticos. Podemos acceder a un atributo esttico mediante la siguiente sintaxis:

    nomClase.nomAtributoEstatico Por ejemplo, en el siguiente cdigo note que no se creo un objeto del tipo Math para acceder a su atributo PI:

    import java.lang.Math; ... area = Math.PI*radio*radio;

    Una clase tambin puede tener mtodos estticos. Un mtodo esttico se declara con el modificador static, usando la siguiente sintaxis

    [modificadorAcceso] static tipo nomMtodo(lista de parmetros) { declaraciones de variables locales sentencias }

    Por ejemplo, el mtodo sqrt() de la clase Math es un mtodo esttico:

    public final class Math { ... public static double sqrt(double a) {...} }

  • Tema 1 Programacin Orientada a Objetos 31

    ITSON Manuel Domitsu Kono

    Un mtodo esttico no requiere de la instanciacin de la clase para su utilizacin. Por ejemplo, en el siguiente cdigo note que no se creo un objeto del tipo Math para acceder a su mtodo sqrt():

    import java.lang.Math; ... y = Math.sqrt(x);

    Dado que los atributos y mtodos estticos no requieren de la instanciacin de la clase para su uso se les conoce tambin como atributos de clase y mtodos de clase, respectivamente. Por otro lado, los atributos y mtodos declarados sin el modificador static si requieren de una instancia de clase y por lo tanto se les conocen como atributos de instancia y mtodos de instancia, respectivamente. Los mtodos estticos tienen ciertas restricciones:

    Slo pueden llamar a otros mtodos estticos. Slo pueden acceder a atributos estticos

    No pueden llamar a las referencias this o super.

    Como ejemplo de atributos y mtodos estticos modificaremos el ejemplo sobre la fabrica de silos vista en la seccin anterior, para que incluya el clculo del costo de cada silo, dependiendo del calibre (espesor) de la lmina usada y del tipo de base empleada: sencilla o reforzada. El diagrama de clases para el programa a construirse se muestra en la figura 1.4:

    +Silo2()+calculaSuperficie() : double+calculaVolumen() : double+calculaCosto() : double

    #tipoSilo : String#grosorLamina : int#superficie : double#volumen : double#costo : double#numSilo : int#contadorSilos : int = 0

    Silo2

    +SiloCilindro2()+calculaSuperficie() : double+calculaVolumen() : double+calculaCosto() : double+toString() : String

    -radio : double-altura : double

    implementation classSiloCilindro2

    +SiloCono2()+calculaSuperficie() : double+calculaVolumen() : double+calculaCosto() : double+toString() : String

    -radio : double-altura : double-tipoBase : int

    implementation classSiloCono2

    +SiloEsfera2()+calculaSuperficie() : double+calculaVolumen() : double+calculaCosto() : double+toString() : String

    -radio : double-tipobase : int

    implementation classSiloEsfera2

    +getCosto() : double

    +BASE_SIMPLE : int = 0+BASE_REFORZADA : int = 1+LAMINA_CAL12 : int = 2+LAMINA_CAL14 : int = 3+LAMINA_CAL16 : int = 4-costos[] : double

    Costos

    Figura 1.4. Diagrama de clases del problema del fabricante de Silos

  • 32 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    La clase Costos permite obtener el costo de los componentes (costo de las lminas por metro cuadrado y el costo de las bases) empleadas en la construccin de los silos. Los costos estn almacenados en el atributo costos

    Para acceder a los diferentes costos se emplean las constantes

    estticas: BASE_SIMPLE, BASE_REFORZADA, LAMINA_CAL12, LAMINA_CAL14, LAMINA_CAL16, como parmetros del mtodo getCosto(), el cual nos regresa el costo correspondiente del arreglo costos.

    El constructor de la clase Silo2 inicializa el atributo tipoSilo y grosorLamina al valor de sus parmetros.

    Los mtodos calculaSuperficie(), calculaVolumen y calculaCosto(), para calcular la superficie, el volumen y el costo del silo, de la clase Silo2 son abstractos, sus definiciones estn en sus clases hijas.

    Los constructores de las clases SiloCilindro2, SiloCono2 y SiloEsfera2 le dan nombre al silo, inicializan los atributos con las dimensiones del silo, el grosor de la lmina y el tipo de base, as como calculan la superficie, el volumen y el costo del silo, usando los mtodos calculaSuperficie(), calculaVolumen() y calculaCosto().

    El mtodo calculaCosto() de las clases SiloCilindro2, SiloCono2 y SiloEsfera2 calculan la superficie y el volumen de sus respectivos silos empleando las siguientes frmulas:

    Costo

    Silo Cilndrico superficie * costo de la lmina por metro cuadrado Silos Cnico y Esfrico superficie * costo de la lmina por metro cuadrado + costo de la base

    El mtodo toString() para que regrese una cadena con el tipo de silo, sus

    dimensiones, grosor de la lmina, tipo de base, su superficie, su volumen y su costo.

    La codificacin de las clases Costos, Silo2, SiloCilindro2, SiloEsfera2 y SiloCono2 se muestra a continuacin:

    Costos.java

    package silos; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase permite consultar los costos de las componentes de los * silos */

  • Tema 1 Programacin Orientada a Objetos 33

    ITSON Manuel Domitsu Kono

    public class Costos { // Indices de los costos en el arreglo costos public static final int BASE_SIMPLE = 0; public static final int BASE_REFORZADA = 1; public static final int LAMINA_CAL12 = 2; public static final int LAMINA_CAL14 = 3; public static final int LAMINA_CAL16 = 4; // Arreglo con los costos private static final double costos[] = {600.0, 900.0, 35.0, 45.0, 60.0}; /** * Regresa el costo del componente del silo * @param item Indice del componente del que se desea el costo * @return El costo del componente del silo */ public static double getCosto(int componente) { return costos[componente]; } }

    Silo2.java

    package silos; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase abstracta es la clase padre de las clases SiloCilindro2, * SiloCono2 y SiloEsfera2 */ public abstract class Silo2 { protected String tipoSilo; protected int grosorLamina; protected double superficie; protected double volumen; protected double costo; protected int numSilo; protected static int contadorSilos = 0; /** * Constructor. Inicializa el atributo tipoSilo e incrementa el * contador de silos en uno cada vez que se crea un silo. Tambin * le asigna el valor de ese contador al atributo numSilo para * numerar cada silo. * @param tipoSilo Tipo de silo: "Cilindro", "Cono", "Esfera" * @param grosorLamina Grosor de la lmina del silo cilndrico */ public Silo2(String tipoSilo, int grosorLamina) { // Inicializa los atributos this.tipoSilo = tipoSilo; this.grosorLamina = grosorLamina; // Incrementa el contador de silos creados

  • 34 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    contadorSilos++; // Le asigna un nmero a este silo numSilo = contadorSilos; } public abstract double calculaSuperficie(); public abstract double calculaVolumen(); public abstract double calculaCosto(); /** * Genera una cadena con la representacin de una instancia de esta * clase * @return Una cadena con la representacin de una instancia de * esta clase */ public String toString() { return numSilo + ": " + tipoSilo + ", Grosor lmina: " + grosorLamina; } }

    SiloCilindro2.java

    package silos; import java.math.*; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase permite crear objetos de tipo SiloCilindro2 */ public class SiloCilindro2 extends Silo2 { private double radio; private double altura; /** * Construye un objeto de esta clase e inicializa sus atributos * @param radio Radio del silo cilndrico * @param altura Altura del silo cilndrico * @param grosorLamina Grosor de la lmina del silo cilndrico */ public SiloCilindro2(double radio, double altura, int grosorLamina) { // Llama al constructor de la clase padre: Silo2 super("Silo Cilndrico", grosorLamina); // Inicializa los atributos this.radio = radio; this.altura = altura; // Calcula la superficie del silo cilndrico superficie = calculaSuperficie();

  • Tema 1 Programacin Orientada a Objetos 35

    ITSON Manuel Domitsu Kono

    // Calcula el volumen del silo cilndrico volumen = calculaVolumen(); // Calcula el precio del silo cilndrico costo = calculaCosto(); } /** * Calcula la superficie del cilindro * @return La superficie del cilindro */ public double calculaSuperficie() { return 2 * Math.PI * radio * (radio + altura); } /** * Calcula el volumen del cilindro * @return El volumen del cilindro */ public double calculaVolumen() { return Math.PI * radio * radio * altura; } /** * Calcula el precio del silo cilndrico * @return El precio del silo cilndrico */ public double calculaCosto() { return superficie * Costos.getCosto(grosorLamina); } /** * Genera una cadena con la representacin de una instancia de esta * clase * @return Una cadena con la representacin de una instancia de esta * clase */ public String toString() { return super.toString() + ", radio = " + radio + ", altura = " + altura + ", superficie = " + superficie + ", volumen = " + volumen + ", costo: " + costo; } }

    SiloCono2.java

    package silos; import java.math.*; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase permite crear objetos de tipo SiloCono2 */

  • 36 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    public class SiloCono2 extends Silo2 { private double radio; private double altura; private int tipoBase; /** * Construye un objeto de esta clase e inicializa sus atributos * @param radio Radio del silo cnicoico * @param altura Altura del silo cnico * @param tipoBase Tipo de la base del silo cnico * @param grosorLamina Grosor de la lmina del silo cnico */ public SiloCono2(double radio, double altura, int tipoBase, int grosorLamina) { // Llama al constructor de la clase padre: Silo2 super("Silo Cnico", grosorLamina); // Inicializa los atributos this.radio = radio; this.altura = altura; this.tipoBase = tipoBase; // Calcula la superficie del silo cnico superficie = calculaSuperficie(); // Calcula el volumen del silo cnico volumen = calculaVolumen(); // Calcula el precio del silo cnico costo = calculaCosto(); } /** * Calcula la superficie del cono * @return La superficie del cono */ public double calculaSuperficie() { return Math.PI * radio * (radio + Math.sqrt(radio * radio + altura*altura)); } /** * Calcula el volumen del cono * @return El volumen del cono */ public double calculaVolumen() { return Math.PI * radio * radio * altura / 3; } /** * Calcula el precio del silo cnico * @return El precio del silo cnico */ public double calculaCosto() { return Costos.getCosto(tipoBase) + superficie * Costos.getCosto(grosorLamina); } /** * Genera una cadena con la representacin de una instancia de esta * clase

  • Tema 1 Programacin Orientada a Objetos 37

    ITSON Manuel Domitsu Kono

    * @return Una cadena con la representacin de una instancia de esta * clase */ public String toString() { return super.toString() + ", tipo base = + tipoBase + ", radio = " + radio + ", altura = " + altura + ", superficie = " + superficie + ", volumen = " + volumen + ", costo: " + costo; } }

    SiloEsfera2.java

    package silos; import java.math.*; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase permite crear objetos de tipo SiloEsfera2 */ public class SiloEsfera2 extends Silo2 { private double radio; private int tipoBase; /** * Construye un objeto de esta clase e inicializa sus atributos * @param radio Radio del silo esfrico */ public SiloEsfera2(double radio, int tipoBase, int grosorLamina) { // Llama al constructor de la clase padre: Silo2 super("Silo Esfrico", grosorLamina); // Inicializa los atributos this.radio = radio; this.tipoBase = tipoBase; // Calcula la superficie del silo esfrico superficie = calculaSuperficie(); // Calcula el volumen del silo esfrico volumen = calculaVolumen(); // Calcula el precio del silo esfrico costo = calculaCosto(); } /** * Calcula la superficie de la esfera * @return La superficie de la esfera */ public double calculaSuperficie() { return 4 * Math.PI * radio * radio; }

  • 38 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    /** * Calcula el volumen de la esfera * @return El volumen de la esfera */ public double calculaVolumen() { return 4 * Math.PI * radio * radio * radio / 3; } /** * Calcula el precio del silo esfrico * @return El precio del silo esfrico */ public double calculaCosto() { return Costos.getCosto(tipoBase) + superficie * Costos.getCosto(grosorLamina); } /** * Genera una cadena con la representacin de una instancia de esta * clase * @return Una cadena con la representacin de una instancia de esta * clase */ public String toString() { return super.toString()+ ", tipo base = + tipoBase + ", radio = " + radio + ", superficie = " + superficie + ", volumen = " + volumen + ", costo: " + costo; } } Para probar las clases anteriores se implementa la siguiente clase de prueba:

    PruebaSilo2 package silos; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase se utiliza para probar las clases SiloCilindro2, * SiloCono2 y SiloEsfera2 */ public class PruebaSilo2 { /** * Mtodo main() en el que se invocan a los mtodos de las clases * SiloCilindro2, SiloCono2 y SiloEsfera2 para probarlos * @param argumentos Los argumentos en la lnea de comando */ public static void main(String[] args) { PruebaSilo2 pruebaSilo2 = new PruebaSilo2(); Silo2 silo[] = new Silo2[5];

  • Tema 1 Programacin Orientada a Objetos 39

    ITSON Manuel Domitsu Kono

    silo[0] = new SiloCilindro2(1.0, 1.0, Costos.LAMINA_CAL12); silo[1] = new SiloEsfera2(1.0, Costos.BASE_SIMPLE, Costos.LAMINA_CAL12); silo[2] = new SiloCono2(1.0, 1.0, Costos.BASE_SIMPLE, Costos.LAMINA_CAL12); silo[3] = new SiloCilindro2(2.0, 1.0, Costos.LAMINA_CAL14); silo[4] = new SiloCilindro2(1.0, 2.0, Costos.LAMINA_CAL16); for (int i = 0; i < 5; i++) System.out.println(silo[i]); System.out.println("Silos creados: " + Silo2.contadorSilos); } }

    Interfaces En el tema I: Programacin Orientada a Objetos se estudi que una clase abstracta es aquella que contiene uno o ms mtodos abstractos y que un mtodo abstracto es aquel que slo se declara pero no se implementa; la implementacin del mtodo debe de Hacerse en una clase hija de esa clase abstracta. Una clase abstracta puede tener mtodos que tengan tanto su declaracin como su implementacin. Java expande el concepto de clase abstracta con el concepto de interfaz. Una interfaz contiene la declaracin de mtodos ms no contiene la implementacin de ninguno de ellos. Una interfaz declara un conjunto de mtodos que una clase debe implementar, esto es establece un determinado comportamiento que la clase que la implementa debe exhibir.

    Una interfaz slo puede tener atributos estticos finales y mtodos abstractos.

    Aunque todos los mtodos de una interfaz son abstractos, no es

    necesario declarar que lo son usando el modificador abstract. Tampoco la interfaz se declara abstracta.

    Los mtodos declarados en una interfaz son pblicos.

    Una interfaz puede extender (heredar) de una o ms interfaces. A esta

    interfaz se le conoce como subinterfaz y contiene la declaracin de los mtodos de las interfaces que extiende ms las declaraciones de los mtodos que ella misma declara.

    Una clase puede implementar una o ms interfaces.

    Una clase puede heredar de una clase e implementar una o ms

    interfaces.

  • 40 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    Una clase que implementa una o ms interfaces debe implementar todos los mtodos de las interfaces que implementa.

    Una clase que implementa una subinterfaz debe implementar todos los

    mtodos de la subinterfaz y de la interfaz padre.

    Un tipo interfaz es un como un tipo de una clase. Podemos:

    Declarar variables de un tipo interfaz. A esa variable se le debe asignar un objeto de una clase que implemente dicha interfaz.

    Declarar un parmetro de un mtodo que sea de un tipo interfaz. Al

    invocar al mtodo debemos pasarle un objeto de una clase que implemente dicha interfaz.

    Podemos especificar que el tipo de un mtodo sea de un tipo interfaz.

    El mtodo deber regresar un objeto de una clase que implemente dicha interfaz.

    Al igual que con las clases, El cdigo de una interfaz de Java se almacena en un archivo con el mismo nombre de la clase y con la extensin .java. Su sintaxis es:

    [package nomPaquete;]

    [directivas import] public interface NomInterfaz { [declaraciones de atributos estticos finales] [declaraciones de mtodos]... }

    La sintaxis de una subinterfaz es:

    [package nomPaquete;]

    [directivas import] public interface NomInterfaz extends nomInterfazPadre1[, nomInterfazPadre2]... { [declaraciones de atributos estticos finales] [declaraciones de mtodos de la subinterfaz]... }

    La sintaxis de una clase que implementa una o ms interfaces es:

    [package nomPaquete;]

    [directivas import] public class NomClase implements NomInterfaz1[, NomInterfaz2]... { [declaraciones de atributos]

  • Tema 1 Programacin Orientada a Objetos 41

    ITSON Manuel Domitsu Kono

    [constructor]... [mtodo de esta clase]... [implementacin de mtodo de la interfaz]... }

    La sintaxis de una clase que hereda de otra clase e implementa una o ms interfaces es:

    [package nomPaquete;]

    [directivas import] public class NomClase extends nomClasePadre implements NomInterfaz1[, NomInterfaz2]... { [declaraciones de atributos] [constructor]... [mtodo de esta clase]... [implementacin de mtodo de la interfaz]... }

    Como ejemplo de interfaces modificaremos el ejemplo sobre la fabrica de silos vista en la seccin anterior, para que tenga una interfaz llamada ISilo con las declaraciones de los mtodos calculaSuperficie(), calculaVolumen() y calculaCosto(). El diagrama de clases para el programa a construirse se muestra en la figura 1.5:

    +Silo3()

    #tipoSilo : String#grosorLamina : int#superficie : double#volumen : double#costo : double#numSilo : int#contadorSilos : int = 0

    Silo3

    +SiloCilindro3()+calculaSuperficie() : double+calculaVolumen() : double+calculaCosto() : double+toString() : String

    -radio : double-altura : double

    implementation classSiloCilindro3

    +SiloCono3()+calculaSuperficie() : double+calculaVolumen() : double+calculaCosto() : double+toString() : String

    -radio : double-altura : double-tipoBase : int

    implementation classSiloCono3

    +SiloEsfera3()+calculaSuperficie() : double+calculaVolumen() : double+calculaCosto() : double+toString() : String

    -radio : double-tipobase : int

    implementation classSiloEsfera3

    +getCosto() : double

    +BASE_SIMPLE : int = 0+BASE_REFORZADA : int = 1+LAMINA_CAL12 : int = 2+LAMINA_CAL14 : int = 3+LAMINA_CAL16 : int = 4-costos[] : double

    Costos

    +calculaSuperficie() : double+calculaVolumen() : double+calculaCosto() : double

    interfazISilo

    Figura 1.5. Diagrama de clases del problema del fabricante de Silos

    La codificacin de las clase Costos es la misma del ejemplo anterior. La codificacin de la interfaz ISilo y de las clases Silo3, SiloCilindro3, SiloEsfera3 y SiloCono3 se muestra a continuacin:

  • 42 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    ISilo.java

    package silos; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta interfaz declara los mtodos que implementarn las clases * SiloCilindro3, SiloCono3 y SiloEsfera3 */ public interface ISilo { /** * Calcula la superficie de un silo * @return La superficie de un silo */ double calculaSuperficie(); /** * Calcula el volumen de un silo * @return El volumen de un silo */ double calculaVolumen(); /** * Calcula el costo de un silo * @return El costo de un silo */ double calculaCosto(); }

    Silo3.java package silos; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase es la clase padre de las clases SiloCilindro3, * SiloCono3 y SiloEsfera3 */ public class Silo3 { protected String tipoSilo; protected double superficie; protected double volumen; protected double costo; protected int grosorLamina;

  • Tema 1 Programacin Orientada a Objetos 43

    ITSON Manuel Domitsu Kono

    protected int numSilo; protected static int contadorSilos = 0; /** * Constructor. Inicializa el atributo tipoSilo e incrementa el * contador de silos en uno cada vez que se crea un silo. * @param tipoSilo Tipo de silo: "Cilindro", "Cono", "Esfera" * @param grosorLamina Grosor de la lmina del silo cilndrico */ public Silo3(String tipoSilo, int grosorLamina) { // Inicializa los atributos this.tipoSilo = tipoSilo; this.grosorLamina = grosorLamina; // Incrementa el contador de silos creados contadorSilos++; // Le asigna un nmero a este silo numSilo = contadorSilos; } /** * Genera una cadena con la representacin de una instancia de * esta clase * @return Una cadena con la representacin de una instancia de * esta clase */ public String toString() { return numSilo + ": " + tipoSilo + ", Grosor lmina: " + grosorLamina; } }

    SiloCilindro3.java package silos; import java.math.*; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase permite crear objetos de tipo SiloCilindro3 */ public class SiloCilindro3 extends Silo3 implements ISilo { private double radio; private double altura; /** * Construye un objeto de esta clase e inicializa sus atributos * @param radio Radio del silo cilndrico * @param altura Altura del silo cilndrico * @param grosorLamina Grosor de la lmina del silo cilndrico */ public SiloCilindro3(double radio, double altura,

  • 44 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    int grosorLamina) { // Llama al constructor de la clase padre: Silo2 super("Silo Cilndrico", grosorLamina); // Inicializa los atributos this.radio = radio; this.altura = altura; // Calcula la superficie del silo cilndrico superficie = calculaSuperficie(); // Calcula el volumen del silo cilndrico volumen = calculaVolumen(); // Calcula el precio del silo cilndrico costo = calculaCosto(); } /** * Calcula la superficie del cilindro * @return La superficie del cilindro */ public double calculaSuperficie() { return 2 * Math.PI * radio * (radio + altura); } /** * Calcula el volumen del cilindro * @return El volumen del cilindro */ public double calculaVolumen() { return Math.PI * radio * radio * altura; } /** * Calcula el precio del silo cilndrico * @return El precio del silo cilndrico */ public double calculaCosto() { return superficie * Costos.getCosto(grosorLamina); } /** * Genera una cadena con la representacin de una instancia de esta * clase * @return Una cadena con la representacin de una instancia de esta * clase */ public String toString() { return super.toString() + ", radio = " + radio + ", altura = " + altura + ", superficie = " + superficie + ", volumen = " + volumen + ", costo: " + costo; } }

    SiloCono3.java

    package silos; import java.math.*; /**

  • Tema 1 Programacin Orientada a Objetos 45

    ITSON Manuel Domitsu Kono

    * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase permite crear objetos de tipo SiloCono3 */ public class SiloCono3 extends Silo3 implements ISilo { private double radio; private double altura; private int tipoBase; /** * Construye un objeto de esta clase e inicializa sus atributos * @param radio Radio del silo cnicoico * @param altura Altura del silo cnico * @param tipoBase Tipo de la base del silo cnico * @param grosorLamina Grosor de la lmina del silo cnico */ public SiloCono3(double radio, double altura, int tipoBase, int grosorLamina) { // Llama al constructor de la clase padre: Silo2 super("Silo Cnico", grosorLamina); // Inicializa los atributos this.radio = radio; this.altura = altura; this.tipoBase = tipoBase; // Calcula la superficie del silo cnico superficie = calculaSuperficie(); // Calcula el volumen del silo cnico volumen = calculaVolumen(); // Calcula el precio del silo cnico costo = calculaCosto(); } /** * Calcula la superficie del cono * @return La superficie del cono */ public double calculaSuperficie() { return Math.PI * radio * (radio + Math.sqrt(radio * radio + altura * altura)); } /** * Calcula el volumen del cono * @return El volumen del cono */ public double calculaVolumen() { return Math.PI * radio * radio * altura / 3; } /**

  • 46 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    * Calcula el precio del silo cnico * @return El precio del silo cnico */ public double calculaCosto() { return Costos.getCosto(tipoBase) + superficie * Costos.getCosto(grosorLamina); } /** * Genera una cadena con la representacin de una instancia de esta * clase * @return Una cadena con la representacin de una instancia de esta *clase */ public String toString() { return super.toString() + ", radio = " + radio + ", altura = " + altura + ", superficie = " + superficie + ", v = " + volumen + ", Costo: " + costo; } }

    SiloEsfera3.java

    package silos; import java.math.*; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase permite crear objetos de tipo SiloEsfera3 */ public class SiloEsfera3 extends Silo3 implements ISilo { private double radio; private int tipoBase; /** * Construye un objeto de esta clase e inicializa sus atributos * @param radio Radio del silo esfrico */ public SiloEsfera3(double radio, int tipoBase, int grosorLamina) { // Llama al constructor de la clase padre: Silo2 super("Silo Esfrico", grosorLamina); // Inicializa los atributos this.radio = radio; this.tipoBase = tipoBase; // Calcula la superficie del silo esfrico superficie = calculaSuperficie(); // Calcula el volumen del silo esfrico volumen = calculaVolumen(); // Calcula el precio del silo esfrico

  • Tema 1 Programacin Orientada a Objetos 47

    ITSON Manuel Domitsu Kono

    costo = calculaCosto(); } /** * Calcula la superficie de la esfera * @return La superficie de la esfera */ public double calculaSuperficie() { return 4 *Math.PI * radio * radio; } /** * Calcula el volumen de la esfera * @return El volumen de la esfera */ public double calculaVolumen() { return 4 * Math.PI * radio * radio * radio / 3; } /** * Calcula el precio del silo esfrico * @return El precio del silo esfrico */ public double calculaCosto() { return Costos.getCosto(tipoBase) + superficie * Costos.getCosto(grosorLamina); } /** * Genera una cadena con la representacin de una instancia de esta * clase * @return Una cadena con la representacin de una instancia de esta * clase */ public String toString() { return super.toString() + ", radio = " + radio + ", superficie = " + superficie + ", volumen = " + volumen + ", costo: " + costo; } } Para probar las clases anteriores se implementa la siguiente clase de prueba:

    PruebaSilo3 package silos; /** * Title: Ejemplos * Description: * Copyright: Copyright (c) 2005 * Company: ITSON * @author Manuel Domitsu Kono * @version 1.0 */ /** * Esta clase se utiliza para probar las clases SiloCilindro3, * SiloCono3 y SiloEsfera3 */ public class PruebaSilo3 {

  • 48 Programacin Orientada a Objetos

    ITSON Manuel Domitsu Kono

    /** * Mtodo main() en el que se invocan a los mtodos de las clases * SiloCilindro3, SiloCono3 y SiloEsfera3 para probarlos * @param argumentos Los argumentos en la lnea de comando */ public class PruebaSilo3 { public static void main(String[] args) { PruebaSilo3 pruebaSilo3 = new PruebaSilo3(); ISilo silo[] = new ISilo[5]; silo[0] = new SiloCilindro3(1.0, 1.0, Costos.LAMINA_CAL12); silo[1] = new SiloEsfera3(1.0, Costos.BASE_SIMPLE, Costos.LAMINA_CAL12); silo[2] = new SiloCono3(1.0, 1.0, Costos.BASE_SIMPLE, Costos.LAMINA_CAL12); silo[3] = new SiloCilindro3(2.0, 1.0, Costos.LAMINA_CAL14); silo[4] = new SiloCilindro3(1.0, 2.0, Costos.LAMINA_CAL16); for (int i = 0; i < 5; i++) System.out.println(silo[i]); System.out.println("Silos creados: " + Silo3.contadorSilos); } }