Proyecto Green. Así se llamó el proyecto iniciado por la Sun que buscaba
desarrollar una interfaz para manejar todo tipo de aparatos electrodomésticos. El
proyecto no derivó en la implementación de productos reales por lo que el grupo
de disolvió, hasta que en 1993 cuando explotó la World Wide Web se observó
que el lenguaje podría adaptarse a múltiples plataformas que conforman la
internet, por lo que el primer producto obtenido fue un navegador completamente
escrito en Java y denominado posteriormente “HotJava”.
Con este producto, se hizo evidente que los programas Java podían instalarse en
un entorno internet y ser ejecutados en cada máquina cliente sin ninguna
configuración adicional, por lo que se empezaba a presenciar el nacimiento de los
famosos Applets y de la primera versión JDK 1.0 de la plataforma Java.
Independencia de la plataforma.
- Los programas en Java generalmente son compilados a un lenguaje intermedio
llamado “bytecodes”, que luego son interpretados por una máquina virtual
(JVM).
- Esta última sirve como una plataforma de abstracción entre la máquina y el
lenguaje permitiendo que se pueda "escribir el programa una vez, y ejecutar
la aplicación en cualquier lado".
Independencia de la plataforma.
// Programa: MiAplicacion.java
// Nuestro primer programa Java.
// Programa: MiAplicacion.java
// Nuestro primer programa Java.
Comentarios
/* Programa: MiAplicacion.java
Nuestro primer programa Java. */
Los archivos que contienen código fuente se almacenan con la extensión .java.
Cada programa Java consiste al menos en la definición de una clase.
El nombre de la clase debe ser igual al nombre del archivo almacenado en disco
(“MiAplicacion.java”).
Java es “case sensitive”: diferencia mayúsculas de minúsculas.
Por convención, el nombre de una clase debe iniciar con la primera letra en
mayúsculas.
El cuerpo de la clase se encuentra definido entre llaves.
Si las llaves no se encuentran en pares, el programa no compilará.
Una clase java puede poseer uno o varios métodos, exactamente, uno de dichos
métodos puede llamarse “main”; y al definirse el intérprete java ejecutará lo
escrito en él.
int producto = 2;
while ( producto <= 1000 )
producto = 2 * producto;
contador = 1;
do {
contador = contador + 1;
} while ( contador <= 10 );
m = 5 (asignación).
n == 6 (comparación).
a = a + 2 a += 2
b = b – 3 b -= 3
c = c * 4 c *= 4
d = d / 5 d /= 5
e= e+1
- e++. Post-Incremento.
- ++e. Pre-Incremento.
f=f–1
- f--. Post-Decremento.
- --f. Pre-Decremento.
Erick Arauco Moreno 21
3.1. Clases y Objetos.
La definición más básica que le podemos dar a un objeto es: Todo lo que nos rodea;
detallando, podríamos decir, todo aquello que podemos identificar que posee ciertas
características y funcionalidades para su uso.
Una clase es un molde.
Una clase está formada por dos conceptos conocidos como: Propiedades y Métodos.
marca
modelo Propiedades, Características, Atributos
color
peso
encender()
apagar() Métodos
llamar()
marca: M1
Telefono modelo: MO1
color: Rojo
peso: 100 gr.
marca
modelo
Instanciación
color
peso
encender() marca: M1
modelo: MO1
apagar() color: Negro
llamar() peso: 100 gr.
Instancias de la
clase “Telefono”
Instancias de la
clase “Telefono”
Método Descripción
abs ( x ) Valor absoluto.
ceil ( x ) Redondeo superior.
cos ( x ) Coseno.
exp ( x ) Exponencial.
floor ( x ) Redondeo inferior.
log ( x ) Logaritmo.
//constructor
public Reloj() { //primer constructor
setTiempo ( 0, 0, 0 );
}
Un objeto java al momento de ser creado ( claúsula new ), adquiere varios recursos del
sistema como memoria, por lo tanto, los finalizadores son los encargados de “devolver
dichos recursos al sistema”.
Un finalizador es definido como un método más de una clase, pero que no realiza ninguna
acción, no tiene parámetros de entrada ni define valores de retorno, en conclusión: NO
HACE NADA. El método finalizador es llamado por el recolector de basura.
Normalmente, al momento de instanciar un objeto, el mismo posee una copia de todas las
variables declaradas en el interior de la clase.
marca: M1
Telefono
modelo: MO1
color: Rojo
marca peso: 100 gr.
modelo
color
peso
encender() marca: M1
apagar() modelo: MO1
color: Negro
llamar() peso: 100 gr.
En ciertas ocasiones, es necesario que una sola copia de la propiedad o método sea
asignado a los objetos instanciados independientemente de cuántos existan; por lo tanto,
todos los objetos comparten la misma porción de datos. Los miembros estáticos pueden ser
accedidos desde cualquier objeto instanciado o directamente desde la misma clase.
marca: M1
Telefono
modelo: MO1
color: Rojo
peso: 100 gr.
marca contador: 2
modelo
color
Peso
(s)contador marca: M1
encender() modelo: MO1
color: Negro
apagar() peso: 100 gr.
llamar() contador: 2
Los objetos creados a partir de una misma clase mantienen la misma estructura definida en
el molde; si tomamos en cuenta los métodos definidos en una clase, los objetos
instanciados tendrán el mismo comportamiento porque contienen una copia de todos los
miembros definidos en la clase.
Si traducimos esto en la vida real e intentamos crear objetos personas, podría ser ilógico
que todas las personas tengan el mismo comportamiento porque no todos somos iguales en
este mundo.
La herencia es una característica de los lenguajes orientados a objetos que permite
agrupar las clases siguiendo un modelo tipo organigrama, donde existe una relación
entre clases padres e hijas, en la cual, las clases hijas heredan las propiedades y/o
métodos definidos en la clase padre.
La herencia permite el acceso automático a la información contenida en otras clases, por lo
tanto es con esta técnica que se garantiza la reutilización del código.
Telefono
Fijo Celular
x, y
Punto área: no tiene
Circulo x, y, radio
área: pi * r2
Hablar de alcance significa el grado de encapsulamiento que podemos aplicar a la propiedad o método
para lo cual decidimos usar las palabras “public”, “private”, “protected” y “friendly”.
Un miembro definido con alcance público, implica que al ser heredado por otras clases, las mismas
tendrán acceso a él generación tras generación sin ninguna limitante. En otras palabras todos los
miembros de una clase padre marcados como públicos serán heredados por las subclases.
Un miembro definido con alcance privado, implica que el mismo sólo podrá ser accedido por la clase que
lo define y ninguna clase hija lo heredará. El acceso a estos miembros marcados como privados será
posible sólo a través de la definición de métodos públicos.
Un miembro definido con alcance protegido será heredado por todas las subclases independientemente
del paquete al que pertenezcan, sin embargo solamente las clases externas que pertenezcan al mismo
paquete podrán acceder a estos miembros.
Un miembro definido con alcance amigo ( friendly ), es aquel similar al público, que no se le ha definido
modificador alguno y que puede ser accedido sólo por las clases que se encuentren en el mismo paquete
incluyendo las subclases.
java.lang. Incluye las clases Object, Thread, Exception, System, Integer, Float, etc.
java.awt. Incluye clases para creación de interfaces gráficas de usuario. Entre ellas
encontramos: Button, TextField, CheckBox, ListBox, etc.
java.io. Incluye las clases necesarias para el manejo de entradas y salidas ( acceso a
ficheros ). InputStream y OutputStream.
java.util. Incluye clases útiles para diversas necesidades en programación. Entre ellas
tenemos: Date, Random, Stack, Vector, etc.
• Acceso público. Si cualquiera de las clases representadas en la figura tuviese un miembro definido como público, el mismo, podrá ser
accedido directamente desde cualquier ubicación.
• Acceso privado. Si cualquiera de las clases tuviese un miembro definido como privado, el mismo, podrá ser accedido sólo desde la misma
clase.
• Acceso protegido.
Si la clase A1 define un miembro como protegido y cualquiera de las otras clases (A2, A3, B1, B2, B3, C1, C2, C3) es hija de la clase
A1, entonces heredarán el miembro y tendrán acceso al mismo sin importar sin están ubicadas en un paquete distinto.
Si cualquiera de las clases restantes (A2, A3, B1, B2, B3, C1, C2, C3) necesita instanciar un objeto de tipo A1 que define un miembro
protegido y tener acceso al mismo, entonces, sólo aquellas que pertenezcan al mismo paquete que la clase A1 podrán lograrlo.
• Acceso amigable. Si cualquiera de las clases tuviese un miembro definido como amigo, sólo tendrán acceso a él las clases que se
encuentren en el mismo paquete. Por ejemplo, si la clase A1 define un miembro amigo, solamente las clases A2 y A3 podrán a través de una
Erick Arauco
relación de herenciaMoreno
o instanciando el objeto A1 tener acceso a dicho miembro. 44
3.11. Import estático.
Ahora que ya hemos visto miembros estáticos y paquetes, podemos invocar las
propiedades y métodos estáticos de cualquier clase utilizando un import estático.
import static java.lang.Math.*;
Todos los miembros estáticos de la clase “Math” estarán disponibles para su uso.
private int x;
private int y;
Tipos primitivos. Una variable de tipo primitivo es aquella que puede almacenar
exactamente un valor en un momento dado.
- int, byte, char, short, long, float, double.
- Al momento de declarar una variable con alguno de estos tipos un valor por defecto es asignado a la
misma,
- por ejemplo, si declaramos una variable de tipo int, su valor inicial será cero ( 0 ), si la declaramos
como tipo boolean, su valor inicial será false.
Tipos referenciados. La mayoría de aplicaciones Java utilizan los tipos referenciados para
almacenar la ubicación de un objeto en la memoria del computador.
- Los tipos referenciados tienen una referencia a un objeto.
- Por defecto las variables de este tipo son inicializadas con el valor null. Entre algunos de los tipos
referenciados encontramos Integer, String, Float, Double, Boolean, etc.
Convertir valores hacia un tipo menor traerá como consecuencia que el resultado obtenido
no represente el valor original.
Por ejemplo, el entero primitivo 2000000 no puede ser representado bajo el tipo short,
porque ocasionaría pérdida de datos.
Operador cast para forzar la conversión, en caso contrario obtendremos un error en
tiempo de compilación.
square ( ( int ) doubleVal )
0 1 2
//2pi*r2 + 2pi*r*h
public double calculaArea() {
return 2* super.calculaArea() + 2 * Math.PI * radio * altura;
}
Figura arregloFiguras[];
arregloFiguras = new Figura[3];
Circulo
arregloFiguras[0] = pt;
arregloFiguras[1] = cl;
arregloFiguras[2] = cil;
Un método declarado como “final” en una superclase significa que el mismo no puede ser
sobreescrito por cualquiera de las clases hijas, por lo tanto las subclases tendrán que usar
la misma implementación hecha en la clase padre.
Una clase definida como “final” significa que no puede ser una superclase, por lo tanto
todos los métodos de una clase “final” son finales implícitamente.
public MiVentana( ) {
super(“Etiquetas”);
setLayout(new FlowLayout());
public MiVentana( ) {
super(“Cajas de Texto”);
setLayout(new FlowLayout());
etiqueta1 = new JLabel(“Ingresar texto:”);
add(etiqueta1);
texto1 = new JTextField(10);
add(texto1);
Boton1 Oyente1
Boton2
Oyente2
Caja de Texto
Ventana
public MiAplicacion() {
super(“Gestionando eventos”);
setLayout(new FlowLayout());
else if (e.getSource().equals(cajaTexto2))
cadena = “Texto 2: “ +
e.getActionCommand();
else if (e.getSource().equals(cajaTexto3))
cadena = “Texto 3: “ +
e.getActionCommand();
JOptionPane.showMessageDialog(null,cadena);
}
}
public MiAplicacion() {
super(“Usando botones”);
setLayout(new FlowLayout());
ComponentAdapter ComponentListener
ContainerAdapter ContainerListener
FocusAdapter FocusListener
KeyAdapter KeyListener
MouseAdapter MouseListener
MouseMotionAdapter MouseMotionListener
WindowAdapter WindowListener
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public MiAplicacion() {
super(“Manejo de eventos”);
addWindowListener(new VentanaEvento());
}
Programación Visual en algún IDE: Los entornos de desarrollo (IDE), permiten que el
programador simplemente arrastre el componente sobre el contenedor. El IDE genera el
código java correspondiente dependiendo de los componentes utilizados.
Distribuidor Descripción
FlowLayout Distribuidor por defecto para los JPanel.
Distribuye los componentes secuencialmente
(izquierda a derecha) en el orden en que son
añadidos.
Código:
Apellidos:
Nombres:
Código:
Código:
Apellidos:
Apellidos:
Nombres:
Nombres:
Es necesario tener en cuenta que el uso normal que cualquier usuario da a una aplicación
implica típicamente el ingreso de datos incorrectos, los cuales, sin ningún control por parte
de la aplicación podrían afectar a la misma; es por eso que nuestras aplicaciones se
encuentran en la obligación de implementar un control de errores logrando así de esta
manera dirigir al usuario mientras usa la herramienta.
Excepción Descripción
ArrayIndexOutOfBoundsException Se accede a una posición del arreglo que no existe.
ArithmeticException Una excepción aritmética ha ocurrido. División por
cero.
ClassNotFoundException La clase instanciada no ha sido encontrada.
NullPointerException Se espera un objeto y se recibe un valor null; ó la
longitud del arreglo esperado es null.
try {
//sentencias
//Pueden generar una excepción
}
catch (TipodeExcepcion ex1) {
//sentencias que se ejecutarán cuando se produzca una
excepción del tipo “TipodeExcepcion”.
}
catch (OtroTipodeExcepcion ex2) {
//sentencias que se ejecutarán cuando se produzca una
excepción del tipo “OtroTipodeExcepcion”.
}
finally {
//sentencias
//Se ejecutan siempre.
}
clase A clase B
import java.util.Scanner;
public class Calculadora {
do {
try {
System.out.println(“Ingrese numerador: “);
int num = sc.nextInt();
System.out.println(“Ingrese denominador: “);
int denom = sc.nextInt();
public MiAplicacion() {
super( "Demostrando Excepciones" );
setLayout( new GridLayout( 3, 2 ) );
sueldoNeto = calcular(sueldo);
txtSueldoNeto.setText( String.valueOf( sueldoNeto ) );
}
Alumno
codigo;
apellidos;
Registro de Alumnos nombres;
Código:
setCodigo();
Apellidos: getCodigo();
Nombres: setApellidos();
getApellidos();
setNombres();
Guardar Modificar Salir
getNombres();
JavaBean
Modelo Relacional.
Instrucción Descripción
SELECT Selecciona uno o más campos de una o varias tablas.
add(panel, BorderLayout.CENTER);
}
}
MiOrigen
public MiAplicacion() {
super(“Accediendo a una base de datos”);
String url = "jdbc:odbc:DsnAcademico";
aux = (Persona)(datos.get(rowIndex));
switch (columnIndex) {
case 0:
return aux.getCodigo();
Modelo de Datos case 1:
return aux.getNombre();
case 2:
return aux.getApellido();
case 3:
return new Integer(aux.getEdad());
default:
return null;
}
}
modelo.insertaPersona (dato);
numero++;
}
public MiAplicacion() {
super(“Utilizando modelo de datos”);
setLayout(null);
MiModelo modelo = new MiModelo();
control = new GestionTabla (modelo);
Interfaz Gráfica JTable tabla = new JTable (modelo);
JScrollPane panel = new JScrollPane(tabla);
botonInserta = new JButton ("Insertar");
botonInserta.addActionListener(this);
botonElimina = new JButton ("Eliminar");
botonElimina.addActionListener(this);
add(panel);
add(botonInserta);
add(botonElimina);
Erick Arauco Moreno }
124
6.4. Modelo de datos – ModelTable.
Interfaz Gráfica
Modelo
Notifica
Actualiza
Evento
Vista(s) Controlador
Cambia
Vista 1
Valor
Observable Notifica
Cambia Vista 2
vo.addObserver( to );
vo.addObserver( bo );
}
}
(Observer)
AbstracTableModel BD
setPersonas() , getPersonas()
(Observable)
Codigo Nombre Apellido Edad
ComponenteObservable
int filaActual
Vector<Persona> personas
(Observer)
JTable setFilaActual() , setFilaActual (Notifica)
getFilaActual() getFilaActual
Existen tres (3) observadores que implementarán el método “update” cada vez que exista
una modificación en el objeto observable.
El observador “AbstractTableModel” representa los datos contenidos en el objeto JTable,
asimismo es el encargado de insertarlos, modificarlos o eliminarlos. Cualquier cambio en
este objeto será visualizado en el JTable. Este objeto necesita obtener los datos del objeto
observable y para ello utiliza el método “getPersonas()” para obtener el vector
correspondiente.
El observador “JTable” visualiza los datos contenidos en su respectivo modelo, asimismo,
permitirá seleccionar alguna de sus filas, y al momento en que se realice esta operación se
procederá utilizar el método “setFilaActual()” y a notificar al observador “JFrame” para que
visualice el mismo registro; lo mismo sucedería si el observador “JFrame” cambia de
registro, esto implicaría modificar el atributo “filaActual” e informar a los observadores, por lo
tanto el observador “JTable” recuperará este valor y seleccionará la misma fila.
El observador “JFrame” no sólo recibirá notificaciones cuando exista un cambio en el
atributo “filaActual” sino también cuando el vector personas haya sido modificado, por lo
tanto ante esto, solicitará a través del método “getPersonas()”, el nuevo vector a utilizar.
Erick Arauco Moreno 136