Temas:
A continuación se entrega en forma resumida los cambios que hay que hacer a los programas para poder trabajar sin la biblioteca del curso.
java MiClase arg0 arg1 ...
El método main debe ser static y debe recibir como parámetros un arreglo
de strings. El comando java invoca este método estático pasándole
como parámetro un arreglo con los argumentos arg0, arg1, etc.
public class MiClase {
...
public static void main(String[] args) {
...
}
...
}
Por ejemplo el siguiente programa despliega los argumentos que se especifica al invocar el programa:
Observaciones:
public class Echo {
public static void main(String[] args) {
for (int i= 0; i<args.length; i++)
System.out.println(args[i]);
}
}
a.length= 10; // error de sintaxis
El programa anterior no puede usar la función println que hemos usado en los programas del curso porque esta función es en realidad un método estático heredado de la clase Program.
Esto falla porque para invocar un método no estático se necesita un
objeto de la invocación (this), pero este objeto no existe en el caso de
un método estático. Del mismo modo, un método estático tampoco puede
accesar variables de instancia. El problema se puede resolver ya sea
declarando que run es también estático:
public class MiClase {
public static void main(String[] args) {
...
run();
}
void run() {
...
}
}
Pero en tal caso, run no puede invocar métodos que no sean estáticos, ni
accesar variables de instancia. Otra forma entonces de resolver el
problema (si tiene sentido) es crear un objeto de la clase e invocar
el método run con este objeto:
static void run() {
...
}
De esta forma, el objeto creado es el objeto de la invocación.
public static void main(...) {
...
new MiClase().run();
}
Observe que la clase que implementa la aplicación extiende de la
clase Frame y por lo tanto representa la ventana que se muestra
en pantalla. La ventana se crea típicamente en el método main en (*).
El resto de la interfaz se crea en el constructor de la clase.
public class MiVentana extends Frame {
... declaración de widgets ... (no se declara la ventana)
public MiVentana() { // constructor
setLayout(...); // establece organizador
setTitle("..."); // titulo de la ventana
... crear widgets ...
... agregar widgets con add(...) ...
... capturar eventos ...
}
public static void main(String[] args) {
Frame vent= new MiVentana(); // (*)
vent.pack();
vent.show();
}
}
En la clase no es necesario declarar una variable de instancia con nombre vent como se hacía antes, porque la ventana está siempre referenciada por el identificador this. Por esta misma razón, no se debe invocar vent.setLayout(...) o vent.add(...). Cuando el objeto de la invocación es la ventana se puede colocar this.setLayout(...) o simplemente setLayout(...).
Ejercicio:
Estudie el programa StdGui.java que ha sido programado utilizando exclusivamente clases de la biblioteca estándar. Compile y ejecute el programa.
con la biblioteca de CC10A | con la biblioteca estándar | Significado |
---|---|---|
println(...); | System.out.println(...); | despliega en pantalla |
Tipo x= readTipo(); | No hay equivalente simple | Lectura de la pantalla |
max(..., ...) | Math.max(..., ...) | Calcula el valor máximo |
min(..., ...) | Math.min(..., ...) | Calcula el valor mínimo |
abs(...) | Math.abs(...) | Calcula el valor absoluto |
otros(...) | Math.otros(...) | Idem para otras funciones matemáticas como sin, cos, log, etc. |
length(s) | s.length() | calcula el largo de un string |
substring(s, ini, len) | s.substring(ini, ini+len) | entrega un substring de s |
compare(r, s) | r.compareTo(s) | compara strings |
equals(r, s) | r.equals(s) | determina si r y s son iguales |
otros(s, ...) | s.otros(...) | Idem para otras funciones con strings |
parseInt(...) | Integer.parseInt(...) | convierte de string a entero |
parseDouble(...) | new Double(...).doubleValue() | convierte de string a real |
exit(); | System.exit(0); | termina el programa |
fatalError("..."); | throw new Error("...") | termina el programa con un mensaje de error |
Las clases que aparecen mencionadas son parte del paquete java.lang. No es necesario hacer un import de este paquete porque el compilador lo agrega automáticamente. Para usar clases que se encuentren en cualquiera de los demás paquetes es necesario hacer explícitamente el import.
La API de la versión 1.1 se encuentra disponible localmente en http://sunsite.dcc.uchile.cl/SunSITE/java/docs/jdk1.1.8/docs/api/packages.html y la versión 1.2 en http://sunsite.dcc.uchile.cl/SunSITE/java/docs/jdk1.2.2/docs/api/overview-summary.html.
La biblioteca se organiza en paquetes. Los nombres de estos paquetes tienen la forma ``java.nombre'' porque ésta es la forma de distinguir los paquetes estándares de los que no son estándares.
En la documentación cada paquete aparece como un link. Si Ud. sigue el link asociado a java.lang aparecerán todas las clases de el paquete java.lang. Por ejemplo aparecerán las clases Math y String. Si Ud. sigue estos links aparecerán el conjunto de constructores, métodos y otra información asociada a estas clases.
Cuando se programa en Java es imprescindible tener a mano esta documentación puesto que se requiere frecuentemente para consultar acerca de los métodos que ofrece una clase, o su clase base, etc. Consulte el rincón de Java para obtener esta documentación. La misma documentación se puede obtener directamente de Sun en http://java.sun.com/.
Lamentablemente el objeto in no posee métodos readInt o readDouble
para leer enteros reales de la consola. Ud. debe descomponer las
líneas en tokens por medio de la clase StringTokenizer (en
java.util). Esta última clase es similar a la clase WordParser que se
usó en el curso (pero no equivalente). El resultado son strings que
debe convertir a números usando los métodos Integer.parseInt() o new
Double(...).doubleValue().
public static void main(String[] args) throws IOException {
BufferedReader in=
new BufferedReader(new InputStreamReader(System.in), 1);
for(;;) {
String lin= in.readLine();
if (lin==null)
break;
... // procesar la línea
}
in.close();
}
Observe que el método main necesita una cláusula throws IOException porque de otra forma se producirá un error en la compilación del programa. Esto se debe a que Java requiere que los programas capturen las excepciones. Las excepciones son condiciones de borde que ocurren rara vez pero que los programas deben considerar para evitar errores indeseados durante la ejecución.
Estudie el programa Lee.java. Este programa lee una línea de la consola y la repite en la misma consola.
La información más completa acerca de como programar en el lenguaje Java es el tutorial oficial de Java auspiciado por Sun (en Inglés). Este tutorial se encuentra en: http://sunsite.dcc.uchile.cl/SunSITE/java/docs/tut-java122-sun/ Yo aprendí Java de este tutorial y nunca he terminado de leerlo. Cuando Ud. desee saber como se hace en Java para ..., entonces le recomiendo visitar este tutorial, porque es altamente probable que ahí sale como hacerlo.