Documente Academic
Documente Profesional
Documente Cultură
class Saludos {
public Saludos()
{
}
public void saludo()
{
System.out.println("Hola mundo!");
}
}
Esto define una clase Saludos con un constructor y un solo método saludo que despliega el mensaje "Hola
mundo!". Usando esta definición podemos crear un objeto de la siguiente forma:
Saludos x;
x = new Saludos();
Podemos mandarle un mensaje de la siguiente forma: x.saludo();
En general todos los métodos llevan la palabra reservada public al principio. Un método simple tiene la
estructura:
class Saludos {
public Saludos()
{
}
public void saludo()
{
System.out.println("Hola mundo!");
}
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 1
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
estamos sobrecargando el método saludo. Por lo tanto cuando el usuario quiere saludar a todo el mundo,
hace la llamada: x.saludo();
pero cuando quiere saludar a alguien en especial, hace la llamada: x.saludo("Colegio");
Como podemos saludar a todo el mundo sin especificarlo explícitamente, se dice que el saludo al mundo es
el saludo default.
Uso de Atributos
Supongamos que queramos darle la opción al creador del objeto Saludos que escoja el saludo
default, para que no necesariamente sea al "mundo". Esta información debería de ser proveída en el
constructor del objeto. Así, con las siguientes instrucciones desplegarían un saludo a la universidad:
Saludos x;
x = new Saludos("Universidad");
x.saludos();
Para poder implementar esto, debemos de incluir un constructor que reciba una hilera de argumento.
Es decir, que se debe incluir un constructor con un parámetro String. Para que tenga el método saludo acceso
a la hilera recibida en el constructor, necesitamos almacenarla en un atributo. Esto lo hacemos porque un
método no puede acceder a las variables o parámetros de los otros métodos. Los atributos pueden ser
accedidos por todos los métodos de dentro de la clase. La declaración de estos es la misma que las variables,
con la diferencia que comienzan con la palabra reservada private. La nueva clase quedaría así:
class Saludos {
private String quien;
public Saludos()
{
quien = "mundo";
}
public Saludos(String s)
{
quien = s;
}
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 2
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
{
System.out.println("Hola ".concat(alguien).concat("!"));
}
}
Observaciones
El orden de declaración entre los atributos y los métodos es irrelevante. Cualquier orden el legal.
Como un convenio para la clase, declararemos todas los atributos antes de los métodos. Los miembros
(atributos y métodos de la clase) pueden ser públicos, privados o amigables (default). Los miembros
públicos (public) pueden ser accedidos por todos.
Los miembros amigables (friendly) pueden ser accedidos por miembros del mismo paquete (conjunto de
clases). Los miembros privados (private) solo pueden ser accedidos por miembros de la misma clase.
import java.io.*;
class SaludandoUnPoco
{
public static void main(String args[])
{
System.out.println("Saludando un poco a todos!");
Saludos s1, s2;
s1 = new Saludos();
s2 = new Saludos("CRUV-FIEC");
s1.saludo();
s2.saludo();
s1.saludo("Suger Montano");
}
}Ya el programa SaludandoUnPoco se compila y se corre de la manera usual.
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 3
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
es una forma de revisar si lo que tenemos hasta ahora tiene sentido. Escriba un esqueleto de la clase. Este es
la declaración de la clase con los prototipos de todos los métodos, pero con el cuerpo de los métodos vacío.
Implementación de la clase
Consiste en escribir los cuerpos de los métodos y declarar los atributos mientras se vayan
necesitando. Tenga en mente lo siguiente:
Puede empezar a trabajar en cualquiera de los métodos.
Puede dejar de trabajar en cualquiera de los métodos antes de completarlo e ir trabajar en otro método.
Mejora de la Implementación
Por lo general cualquier código escrito, a pesar de que funcione puede ser mejorado. La interfase se
debe mantener intacta.
Diseño de la Clase
Comportamiento que la clase deberá proveer.
Si tuviéramos una clase InteractiveIO quisiéramos que esta me ofreciera el siguiente comportamiento:
Escribir a la pantalla, asegurándome que se vaya a desplegar inmediatamente.
Preguntar al usuario por información, desplegándole un mensaje y leyendo una hilera del teclado,
asegurándome de que el mensaje se despliegue antes de que la computadora espere la entrada.
Aquí ya tenemos una idea clara del prototipo de los métodos que incluirá la clase InteractiveIO. Estos son:
public InteractiveIO()
public void write(String s)
public String promptAndRead(String s)
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 4
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
import java.io.*;
class ProbandoInteractiveIO {
public static void main(String args[])
{
InteractiveIO interIO;
String line;
interIO = new InteractiveIO();
line = interIO.promptAndRead("Ingrese una palabra: ");
interIO.write(line);
}
}
Concluimos que una clase InteractiveIO diseñada tal y como la tenemos, lleva a cabo bien la tarea.
Provee de una entrada y salida interactiva simple, despreocupándonos de System.in, System.out y flush. Esta
clase haría todo esto por nosotros.
Esqueleto de la clase.
class InteractiveIO {
// aqui irian los atributos si necesitaramos
public InteractiveIO()
{
// enunciados
}
Implementación de la clase
Completamos los métodos de la clase.
class InteractiveIO {
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 5
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
public InteractiveIO()
{
// parece que necesitamos nada!
}
class InteractiveIO {
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 6
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
Tarea
Agregue un método writeln a la clase InteractiveIO que reciba una hilera de caracteres, que la
despliegue y que garantice que el siguiente carácter a desplegarse aparecerá en una nueva línea.
Agregue un segundo método writeln (sobrecargado) en la clase InteractiveIO que no reciba argumentos,
pero garantice que el siguiente carácter a desplegarse aparecerá en una nueva línea.
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 7
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
Para parcial #2
Segundo Ejemplo Completo: Clase Nombre
Diseñamos la clase InteractiveIO motivados por el deseo de un uso mas conveniente del PrintStream y del
BufferedReader. Por lo general nuestro punto de partida no son las clases existentes de Java sino problema
de la vida real que deseamos resolver modelándolos de alguna forma.
Las clases predefinidas que Java nos provee ni siquiera se acercan a modelar el comportamiento de los
elementos de nuestro mundo. El ejemplo que vamos a trabajar ahora es modelar el nombre de una persona.
Podemos estar tentados a utilizar la clase String, pero este no nos provee el comportamiento que nosotros
quisiéramos de una clase Nombre
Diseño de la Clase
Comportamiento que la clase deberá proveer.
Si tuviera una clase Nombre quisiera que esta me ofreciera el comportamiento para:
Declarar una referencia a la clase Nombre de la siguiente forma: Nombre alumno;Esto me dice simplemente
que la clase se debe llamar Nombre.
Crear objetos que sean instancias de Nombre, basados en el primer nombre y el apellido de la siguiente
forma: alumno = new Nombre("Juan", "Perez");De esto podemos deducir que necesitaremos un constructor
con dos parámetros String.
Mandar un mensaje al objeto para obtener las iniciales como una hilera, de la siguiente forma: String s;
s = alumno.getInitials();Debemos proveer un método getInitials que devuelva una hilera.
Mandar un mensaje al objeto para obtener el nombre completo, en la forma Apellido, primer nombre; como
una hilera, de la siguiente forma: String s;
s = alumno.getLastFirst();Debemos proveer un método getLastFirst que devuelva una hilera.
Mandar un mensaje al objeto para obtener el nombre completo, en la forma primer nombre apellido
precedido de un titulo opcional; como una hilera, de la siguiente forma: String s;
s = alumno.getFirstLast();Debemos proveer un método getFirstLast que devuelva una hilera.
Aquí ya tenemos una idea clara de el prototipo de los métodos que incluirá la clase Nombre. Estos son:
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 8
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
import java.io.*;
class ProbandoNombre {
public static void main(String args[])
{
Nombre n;
String primer, apellido, titulo;
InteractiveIO io;
io = new InteractiveIO();
primer = io.promptAndRead("Ingrese primer nombre: ");
apellido = io.promptAndRead("Ingrese apellido: ");
titulo = io.promptAndRead("Ingrese apellido:");
Esqueleto de la clase.
class Nombre {
// aqui van los atributos si las necesitaramos
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 9
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
// enunciados
}
public String getInitials()
{
// enunciados
}
public String getLastFirst()
{
// enunciados
}
public String getFirstLast()
{
// enunciados
}
public void setTitle(String newTitle)
{
// enunciados
}
}
Implementación de la clase
Completamos los métodos de la clase. Razonamos que:
Los métodos getFirstLast y getLastFirst necesitan ambos acceso al primer nombre y al apellido. De la
misma forma getFirstLast y setTitle necesitan ambos acceso el titulo. Por lo tanto, necesitamos hacer del
primer nombre, apellido y titulo atributos.
Asumiremos que mientras no se especifique un titulo la persona no tiene
class Nombre {
private String primerNombre, apellido, titulo;
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 10
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
{
return titulo.concat(" ").concat(primerNombre).concat(" ").concat(apellido);
}
public void setTitle(String newTitle)
{
titulo = newTitle;
}
}
Observaciones
El objetivo del constructor es garantizar que el objeto comience con valores validos en sus atributos.
Dejamos la mejora de la clase a discreción del alumno.
Para la clase InteractiveIO, es poco probable que se declaren mas de un objeto de esta clase. Sin embargo,
para el caso de la clase Nombre, es muy probable que se declaren muchas instancias de esta clase. Cada una
de estas compartirá los mismos métodos pero tendrán su propio conjunto de atributos: primerNombre,
apellido y titulo. Esto tiene sentido ya que cada objeto instancia de Nombre tendrá su propio primer nombre,
apellido y titulo. A pesar de que todas las instancias de la clase Nombre vayan a tener el mismo
comportamiento (proveído por sus métodos), las llamadas devolverán resultados distintos. Esto es porque
los atributos tendrán distintos valores. Los valores de sus atributos constituyen su estado. Puedo mandarle un
mensaje getLastFirst a dos objetos distintos, y se comportaran igual y pero pueden devolver distinto
resultado ya que sus estados son distintos.
Ejercicios de clase
Escriba un programa que lea tres pares de primer nombre, apellido y a continuación despliegue sus iniciales.
El programa deberá usar la clase Nombre.
Agregue un método IlustrateName a la clase Nombre que despliegue el nombre a pantalla.
Diseñe e implemente una clase NombreLargo, que tome en consideración (además del primer nombre y
apellido como lo hizo la clase Nombre) el segundo nombre.
Diseñe e implemente una clase Direccion.
Podemos diseñar un método print para la clase nombre que provea el comportamiento de producir como
salida el nombre completo. Hay que considerar dos aspectos en este punto:
Hasta ahora, hemos manejado la salida a través del print y println ha instancias del PrintStream. Como
diseñadores de la clase Nombre, podríamos insistir que la salida se maneje a través del PrintStream.
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 11
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
Podríamos pedirle al invocador del método print que incluya como argumento el objeto PrintStream a donde
desea que se mande la salida. El método quedaría así:
void print (PrintStream destino)De esta manera, si el que llama al método print desea desplegar el nombre a
pantalla, en la llamada incluiría como argumento System.out. Por otro lado si desearía mandar el nombre a
un archivo incluiría como argumento alguna instancia del FileOutputStream. Un ejemplo de uso podría ser:
Nombre n;
PrintStream p;
n = new Nombre("Jodie","Foster");
n.setTitle("Licenciada");
p = new PrintStream (new FileOutputStream ("actrices.txt"));
n.print(System.out); // despliega Licenciada Jodie Foster en la pantalla
n.print(p); escribe Licenciada Jodie Foster en el archivoLa implementacion quedaria asi:
En realidad no deseamos mandarle el mensaje a un objeto instancia de la clase Nombre, sino a la clase
Nombre. Esto en Java se lleva a cabo a través de un tipo de método conocido como método estático. Estos
métodos son definidos de la misma forma que los otros métodos, excepto que estos llevan la palabra
reservada static antes del tipo de retorno. Los métodos estáticos no están asociados a ningún objeto. Tienen
las siguientes características:
public static Nombre read(BufferedReader fuente)Podemos utilizar la clase nombre para leer un nombre
desde el teclado y desde un archivo de la siguiente forma:
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 12
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
Nombre n;
FileInputStream f;
BufferedReader brFile, brKeyb;
InputStreamReader isrFile, isrKeyb;
isrKeyb = new InputStreamReader(System.in)
brKeyb = new BufferedReader(isrKeyb);
f = new FileInputStream(new File("nombres.txt"));
isrFile = new InputStreamReader(f);
brFile = new BufferedReader(isrFile);
n = Nombre.read(brKeyb);
n.print(System.out);
n = Nombre.read(brFile);
n.print(System.out);La implementacion quedaria asi:
import java.io.*;
class HelloApp {
public static void main (String args[])
{
System.out.println ("Hello world !");
}
}Vemos que el programa HelloApp es una clase. Toda clase que existe como programa necesita un método
main. El método main es static, es decir no esta asociado a ningún objeto HelloApp. La razón de esto es que
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 13
Centro Regional Universitario de Veraguas
Facultad de Informática, Electrónica y Comunicación
Programación Orientada a Objetos
la ejecución de nuestro programa debe de comenzar en algún lado. El interprete de Java en algún sentido,
invoca el método main. Pero esto lo hace antes de que cualquier objeto de nuestro código haya sido creado.
Además vemos que esta declarado como public. La razón de esto es que necesita ser llamado desde afuera
de la clase (desde el interprete de Java).
http://www.gaugeus.com/ramblings/2006/12/26/definiendo-clases-en-java-class-definition-in-java#Definición_de_Clases 14